存储&数据库课程笔记 | 青训营笔记

81 阅读6分钟

储存&数据库

1 存储系统

1.1系统概要

  • 什么是 存储系统

    • 一个提供了 读写控制类接口 ,能够 安全把数据持久化 的软件,可以称为存储系统。
  • 一般包括四个方面

    • User:系统是给用户使用的
    • Medium:数据持久化存储到介质上
    • Memory:设计 性能高效 的操作数据结构
    • Network:分布式存储系统

1.2 系统特点

  • 性能敏感
  • 代码既简单,有复杂
    • 简单:I/O路径上要比较简单,不能复杂,否则会拖慢系统性能
    • 复杂:在非I/O路径上,一些错误处理的分支上要很复杂吗,考虑多种异常情况。
  • 软件架构容易受硬件影响
    • 如果硬件发生了变革,则软件则也要重新编写

1.3 存储器的层级结构

:Users:chh:Library:Application Support:typora-user-images:截屏2023-05-27 13.29.39.png

  • 从上到下:**速度 **越来越慢,**存储容量 **越来越大

1.4 数据如何从应用到数据介质

:Users:chh:Library:Application Support:typora-user-images:截屏2023-05-27 13.37.42.png

  • 缓存:贯穿整个存储体系
    • 原因:硬件的读写速率与软件读写速率不匹配
  • 拷贝:很昂贵,很消耗CPU,尽量减少
  • 抽象统一的接入层:硬件设备五花八门,需要统一起来。

1.5 RAID技术

Q:单机存储系统如何做到高性能/高性价比/高可靠?

A:Redundant Array Inexpensive Disk

  • 出现背景

    • 单块大容量磁盘 价格 > 多块小容量磁盘
    • 单块磁盘 写入性能 < 多块磁盘写入 并发性能
    • 单块磁盘的容错能力有限
  • RAID 0

    • 多块磁盘简单组合
    • 数据条带化存储,提高磁盘带宽
      • 将用户数据切割,分别并发存储到不同磁盘中
    • 没有额外容错
  • RAID 1

    • 一块磁盘对应一块额外镜像盘
    • 真实的空间利用率紧50%
    • 容错能力强
  • RAID 0+1

    • 结合RAID 0 和 RAID 1
      • 比如6块磁盘,每两块进行RAND 1 组合形成一组,三组形成RAID 0 组合。
    • 真实空间利用仅50%
    • 容错空间强,写入带宽好

2 数据库

2.1 关系型数据库

毫无疑问,关系数据库是存储系统,但是在存储之外,又发展出其他能力

  • 结构化数据友好
  • 支持事物(ACID)
  • 支持复杂的查询语言

2.2非关系型数据库

毫无疑问,非关系数据库是存储系统,但一般不要求严格的结构化

  • 半结构化数据友好
  • 可能支持事物(ACID)
  • 可能支持复杂的查询语言

2.3数据库 🆚 经典存储系统

2.3.1 结构化数据管理

一条用户数据:

{
"user_name" : "xiaoming",
"password" : "helloword",
"password_hint" : "coding"
}
  • 写入关系型数据库,以表格式管理

:Users:chh:Library:Application Support:typora-user-images:截屏2023-05-27 14.21.54.png

  • 写入文件,自行定义结构,管理结构

:Users:chh:Library:Application Support:typora-user-images:截屏2023-05-27 14.22.54.png

2.3.2事务能力

  • Atomicity(原子性) : 事务内的操作要么全做,要么不做
  • Consistency(一致性) : 事务执行的前后,数据状态是一致的
  • Isolation(隔离性) : 可以隔离多个并发的事务,避免影响
  • Durability(持久性) : 事务一旦提交成功,数据保持持久性

2.3.3复杂查询能力

Q:写入数据后,想做很复杂的查询怎么办?

Example:请查询出名字以xiao开头,且密码提示小于10个字的人,并按性别分组统计

  • 用SQL查询:简洁,灵活
Select gender,count(*)
From user
Where user_name like 'xiao%' and len(password_hint) < 10 
Group by gender

经典程序查询:僵化,复杂

for each data{
  if(user_name ...... && password_hint ......){
    mark in list
  }
}
for each in marked_list{
  if(gender == ....){}
}

2.3 数据库的使用方法

Everything is Domain Specific Language (领域专用语言) ==> SQL

  • 操作数据:
    • Insert
    • Update
    • Select
    • Delete
    • Where子句
    • GroupBy
    • OrderBy
  • 数据定义修改:
    • Create user
    • Create database
    • Create table
    • Alter tabel
    • ......

主流产品剖析

1 单机存储

1.1 概要

单机存储系统 = 单个计算机节点上的存储软件系统,一般不涉及网络交互

1.2 本地文件系统 —— Linux哲学 :一切皆文件

  • 文件系统的管理单元:文件
  • 文件系统接口:文件系统繁多,如Ext2/3/4.sysfs,rootfs等,但都遵守VFS的统一抽象接口
  • 两大数据结构:Index Node & Directory Entry
    • Index Node
      • 记录文件元数据:id,大小,权限,磁盘位置
      • inode是文件的 唯一标识 ,会被存储在磁盘上
      • inode的文件总数在格式化文件系统时就被固定
    • DIrectory Entry
      • 记录文件名,inode指针,层级关系(parent)等
      • dentry(目录项)是内存结构,与inode的关系是N:1(hardlink的实现)

1.3 Key-value存储——世间一切皆 key-value

  • 常见使用方式:put(k,v) & get(k)

2 分布式存储系统

2.1 概要

分布式存储系统 = 在单机存储基础上实现了分布式协议,涉及大量网络交互

2.2 分布式文件系统

时代背景:专用的高级硬件 很贵,同时数据存量 很大,要求超高 吞吐

  • HDFS:堪称大数据时代的基石
    • 支持海量数据存储
    • 高容错性
    • 弱POSIX语义
    • 使用普通的x86服务器,超 高性价比

2.3 分布式对象系统

  • Ceph:开源分布式存储系统里的「万金油」
    • 一套系统支持对象接口,块接口,文件接口,但 一切皆对象
    • 数据写入采用 主备复制模型
      • 写入数据会先写到主节点,然后主节点再作链状的多副本冗余复制
    • 数据分布模型采用CRUSH算法
      • 什么是数据分布模型:一份用户数据通常要有多个副本作冗余存储,那这几个副本要存储在哪几个服务器就需要数据分布模型决定

3 单机数据库

3.1 概要

单机数据库 = 单个计算机节点上的数据库系统

3.2 关系型数据库

  • 商业产品Oracle称王,开源MySQL & PostgreSQL

  • 关系型数据库的通用组件

  • Query Engine —— 负责解析query ,生成查询计划

  • Txn Manager —— 负责事务并发管理

  • Lock Manager —— 负责锁相关的策略

  • Storage Engine —— 负责组织内存/磁盘数据结构

  • Replication —— 负责主备同步

  • 关键内存数据结构

    • B Tree
    • B+Tree
    • LRU List等
  • 关键磁盘数据结构

    • WriteAheadLog (RedoLog) ,Page

3.3 非关系型数据库

  • MongoDB,Redis,Elasticsearch三足鼎立

    • 关系型直接用SQL交互,非关系型交互方式 各不相同

    • 非关系型数据结构千奇百怪

    • 尝试支持SQL(子集)和“事务”

  • Elasticsearch特点

    • 面向「文档」存储
    • 文件可序列化为JSON,支持嵌套
    • 存在「index」,index = 文档的集合
    • 存储和构建索引能力依赖Lucene引擎
    • 实现大量搜索数据结构&算法
    • 支持RESTFUL API ,也支持弱SQL交互
  • mongoDB

    • 面向「文档」存储
    • 文件可序列化为JSON,支持嵌套
    • 存在「collection」,collection = 文档集合
    • 存储和构建索引能力依赖wiredTiger引擎
    • 4.0后开始支持事物(多文档,跨分片多文档等)
    • 常用client/SDK交互,可通过插件转译支持弱SQL
  • Redis

    • 数据结构丰富(hash表,set,set,list)
    • C语言实现,超高性能
    • 主要基于内存,但支持AOF/RDB持久化
    • 常用redis-cli/多语言SDK交互

4 分布式数据库

4.1 单机到分布式数据库

  • 单机数据库遇到了问题&挑战,需要引入 分布式架构 解决
    • 容量
    • 弹性
    • 性价比

4.2 分布式数据库——解决容量问题

:Users:chh:Library:Application Support:typora-user-images:截屏2023-05-27 17.09.01.png

  • 传统单机数据库,Database通过Filesystem的接口对磁盘进行读写
    • 单点容量有限,受下面挂在磁盘限制

:Users:chh:Library:Application Support:typora-user-images:截屏2023-05-27 17.12.28.png

  • 分布式数据库,改进:使用存储池化技术
    • 把Disks改造成一个存储池,可以动态扩容
    • 通过网络连接与数据库交互,数据库不需要关注存储池的容量够不够

4.3 分布式数据库——弹性问题,性价比问题

:Users:chh:Library:Application Support:typora-user-images:截屏2023-05-27 17.20.50.png

  • 传统单机数据库,硬件规格与服务器绑定,不能很好做到动态调整,容易造成CPU,磁盘的资源浪费或瓶颈。

:Users:chh:Library:Application Support:typora-user-images:截屏2023-05-27 17.27.22.png

  • 分布式数据库,使用存储池化技术,服务器不用关注磁盘大小,只需关注CPU瓶颈,具有性价比。

4.4 分布式数据库——More to Do

  • 多个人同时写入,提高系统整体吞吐
  • 从磁盘弹性到内存弹性,让内存池化
  • 分布式事务算法

课程链接:juejin.cn/course/byte…