认识存储与数据库 | 青训营笔记
一、一条数据从产生,到数据流动,最后持久化的全生命周期
1、数据的流动
graph TD
用户注册时输入的数据 --> 后端服务器 --> 数据库 --> 其他系统
其他系统 --> 数据库
2、数据的持久化
graph TD
校验数据的合法性 --> 修改内存 --> 写入存储介质
二、数据库和存储系统背景知识,它们是什么,有哪些特点?
1、什么是存储系统?
存储系统是一个提供了读写、控制类接口,能够安全有效地把数据持久化的软件。(存储系统基本涉及到User, Medium, Memory, Network)
2、存储系统的特点
graph TD
存储系统 --> 作为后端软件的底座性能敏感
存储系统 --> 存储系统代码既简单又复杂
存储系统 --> 存储系统软件架构容易受硬件影响
3、数据从应用到存储介质中的注意事项:
“缓存”很重要,贯穿整个存储体系
“拷贝”很昂贵,应该尽量减少
硬件设备五花八门,需要有抽象统一的软件接入层
4、存储系统-RAID技术
单机存储系统怎么做到高性能、高性价比,高可靠性? R(edundant) A(rray) of I(nexpensive) D(isks)
RAID出现的背景:
单块大容量磁盘价格 > 多块小容量磁盘价格 单块磁盘的写入性能 < 多块磁盘的并发写入性能 单块磁盘的容错能力有限,不够安全 RAID 0 + RAID 1 == RAID 0 + 1
5、数据库
graph TD
数据库 --> 关系型数据库
数据库 --> 非关系型数据库
关系型数据库 --> 结构化数据友好
关系型数据库 --> 支持事务(ACID)
关系型数据库 --> 支持复杂查询语言SQL
非关系型数据库 --> 半结构化数据友好
非关系型数据库 --> 可能支持事物(ACID)
非关系型数据库 --> 可能支持复杂查询语言SQL
(1)三个基本概念
graph TD
三个基本概念 --> 关系 --> 集合 --> 任意元素组成的若干有序偶对,反应了事物间的关系
三个基本概念 --> 关系代数 --> 对关系作运算的抽象查询语言,如交,并,笛卡尔积等
三个基本概念 --> SQL --> 一种DSL --> 方便人类阅读的关系代数表达形式
(2)数据库 VS 经典存储 - 结构化数据管理
举个栗子:
对于一条用户注册数据
数据库:写入关系型数据库,以表形式管理
经典存储:写入文件,自行定义管理结构
通过对比,我们可以得出数据库支持“事务”的优越性,并且在复杂查询上,数据库操作更灵活、简洁
graph TD
事务具有ACID --> A(tomicity) --> 事务内的操作要么全做,要么不做
事务具有ACID --> C(onsistency) --> 事务执行前后,数据状态是一致的
事务具有ACID --> I(solation) --> 可以隔离多个并发事务,避免影响
事务具有ACID --> D(urability) --> 事务一旦提交成功,数据保证持久性
Everything is D(omain) S(pecific) L(anguage) --> maybe SQL
三、主流的存储 & 数据库系统架构
1、单机存储
单机存储 = 单个计算机节点上的存储软件系统,一般不涉及网络交互
例如,本地文件系统和key-value存储
本地文件系统
graph TD
本地文件系统 --> Linux经典哲学:一切皆文件
本地文件系统 --> Linux文件系统的两大数据结构 --> dentry是内存结构,与inode的关系是N:1
dentry是内存结构,与inode的关系是N:1 --> IndexNode --> 记录文件的元数据,如id,大小,权限,磁盘位置等,inode是一个文件的唯一标识
dentry是内存结构,与inode的关系是N:1 --> DirectoryEntry --> 记录文件名,inode指针,层级关系等管理单元
本地文件系统 --> 管理单元 --> 文件 --> 文件系统接口 --> 遵循VFS的统一抽象接口
遵循VFS的统一抽象接口 --> Ext2/3/4
遵循VFS的统一抽象接口 --> sysfs
遵循VFS的统一抽象接口 --> roofs
遵循VFS的统一抽象接口 --> ...
key-value存储
graph TD
key-value存储 --> 世间一切皆key-value,key是你的身份证,value是你的内涵
key-value存储 --> 常见使用方式:put,get
key-value存储 --> 常见数据结构:LSM-Tree,某种程度上牺牲读性能,追求写入性能
key-value存储 --> 拳头产品:RocksDB
2、分布式存储
分布式存储 = 在单机存储基础上实现了分布式协议,涉及大量网络交互
分布式存储分为分布式文件系统、分布式对象存储两种存储方式
分布式文件系统
graph TD
分布式文件系统 --> HDFS:堪称大数据时代的基石
HDFS:堪称大数据时代的基石 --> 时代背景:专用的高级硬件很贵,同时数据存储量很大,要求超高吞吐
HDFS:堪称大数据时代的基石 --> HDFS核心特点
HDFS核心特点 --> 支持海量数据存储
HDFS核心特点 --> 高容错性
HDFS核心特点 --> 弱POSIX语义
HDFS核心特点 --> 使用普通x86服务器,性价比高
HDFS操作流程图
graph TD
ManagementNode --> NameNode --> StorageNode
ManagementNode --> SecondayNameNode --> StorageNode
StorageNode --> DataNode1
StorageNode --> DataNode2
StorageNode --> DataNode3
StorageNode --> ......
分布式对象存储
graph TD
分布式对象存储 --> Ceph:开源分布式存储系统里的万金油 --> Ceph的核心特点
Ceph的核心特点 --> 一套系统支持对象接口,快接口,文件接口,但是一切皆对象
Ceph的核心特点 --> 数据写入采用主备复制模型
Ceph的核心特点 --> 数据分布模型采用CRUSH算法 --> CRUSH算法
CRUSH算法 --> HASH
CRUSH算法 --> 权重
CRUSH算法 --> 随机抽签
3、单机数据库
单机数据库 = 单个计算机节点上的数据库系统
事务在单机内执行,也可能通过网络交互实现分布式事务
这里分别分析关系型数据库和非关系型数据库
关系型数据库
graph TD
关系型数据库 --> 商业产品Oracle称王,开源产品MySQL,PostgreSQL称霸
关系型数据库 --> 关系型数据库的通用组件
关系型数据库的通用组件 --> QueryEngine --> 负责解析query,生成查询计划
关系型数据库的通用组件 --> TxnManager --> 负责事务并发管理
关系型数据库的通用组件 --> LockManager --> 负责锁相关的策略
关系型数据库的通用组件 --> StorageEngine --> 负责组织内存/磁盘数据结构
关系型数据库的通用组件 --> Replication --> 负责主备同步
关系型数据库 --> 关键内存数据结构
关键内存数据结构 --> B-Tree
关键内存数据结构 --> B+-Tree
关键内存数据结构 --> LRDList
关键内存数据结构 --> ......
关系型数据库 --> 关键磁盘数据结构 --> WriteAheadLog-RedoLog,Page
非关系型数据库
graph TD
非关系型数据库 --> MongoDB,Redis,Elasticsearch三足鼎立
MongoDB,Redis,Elasticsearch三足鼎立 --> MongoDB
MongoDB --> 面向文档存储
MongoDB --> 文档可序化成JSON/BSON,支持嵌套
MongoDB --> 存在collection,collection=文档的集合
MongoDB --> 存储和构建索引能力依赖wiredTiger引擎
MongoDB --> 4.0后开始支持事务,如多文档,跨分片多文档等
MongoDB --> 常用client/SDK交互,可通过插件转译支持弱SQL
MongoDB,Redis,Elasticsearch三足鼎立 --> Elasticsearch
Elasticsearch --> 面向文档存储
Elasticsearch --> 文档可序化成JSON,支持嵌套
Elasticsearch --> 存在和构建索引能力依赖Lucene引擎
Elasticsearch --> 实现了大量搜索数据结构和算法
Elasticsearch --> 支持RESTFUL-API,也支持弱SQL交互
MongoDB,Redis,Elasticsearch三足鼎立 --> Redis
Redis --> 数据结构丰富,如hash表,set,zset,list
Redis --> C语言实现,超高性能
Redis --> 主要基于内存,但支持AOF/RDB持久化
Redis --> 常用redis-cli多语言SDK交互
关系型数据库一般直接使用SQL交互,而非关系型数据库交互方式各不相同
非关系型数据库的数据结构千奇百怪,没有关系约束后,schema相对灵活
不管是否是关系型数据库,大家都在尝试支持SQL(子集)和“事务”
4、分布式数据库
单机数据库遇到了哪些问题 & 挑战,需要我们引入分布式架构?
graph TD
单机数据库遇到了哪些问题挑战 --> 容量 --> 单点容量有限受硬件限制 --> 存储节点池化+动态扩缩容
单机数据库遇到了哪些问题挑战 --> 弹性 --> 用户的扩缩容需求反复横跳 --> 存储节点池化+动态扩缩容
单机数据库遇到了哪些问题挑战 --> 性价比 --> 数据空间需求大但CPU浪费严重 --> 存储节点池化+动态扩缩容
单机数据库遇到了哪些问题挑战 --> 其他挑战MoreToDo
其他挑战MoreToDo --> 从磁盘弹性到内存弹性
其他挑战MoreToDo --> 单写VS多写
其他挑战MoreToDo --> 分布式事务优化
四、老技术结合新技术,如何持续演进走向新生?
新架构?新硬件?新理论?人工智能?
软件架构变更-Bypass OS hernel
AI增强-智能存储格式转换
新硬件革命-存储介质变更、计算单元变更、网络硬件变更
graph TD
SPDK --> Bypass-OS-kernel已经成为一种趋势
SPDK --> KernelSpace-UserSpace --> 避免syscall带来的性能损耗,直接从用户态访问磁盘
SPDK --> 中断-轮询
中断-轮询 --> 磁盘性能提高后,中断次数随之上升,不利于IO性能
中断-轮询 --> SPDKpoller可以绑定特定的cpu核不断轮询,减少cs,提高性能
SPDK --> 无锁数据结构 --> 使用Lock-free-aueue,低并发时的同步开销
Q:在Storage领域,AI(如Machine Learning等)能给我们带来什么改变?
A:利用AI实时分析使用行存、列存或行列混存进行储存
graph TD
高性能硬件 --> RDMA网络
高性能硬件 --> persistentMemory
高性能硬件 --> 可编程交换机
高性能硬件 --> CPU/GPU/DPU
总结:在存储 & 数据库领域,硬件反推软件变革十分常见