这是我参与「第五届青训营」伴学笔记创作活动的第15天。今天的内容是关于存储系统的。
在存储和数据库的领域,硬件反推软件变革十分常见。
1 经典案例
用户在手机上操作,填入了一条结构化的数据,通过网络到达后端服务器,再存储到数据库中(数据库后面可能还有其它系统)。
数据的持久化:检验数据合法性(是否存在),在内存里进行数据处理(结构化),以寿命、性能友好的方式写入存储介质。
潜在问题:如何避免数据丢失、多人同时修改数据、除数据库外的存储系统、数据库是否只能处理结构化数据、操作数据库的方式、编程语言。
2 存储和数据库系统
2.1 存储系统
参考概念:一个提供了读写、控制类接口能够安全有效地把数据持久化的软件就可以成为存储系统。
存储系统的特点:性能敏感(性能要求高)、易受硬件影响、代码在 IO 上简单,错误处理上详尽。
存储器的层级结构:
数据如何从应用到存储介质:缓存很重要,贯穿整个系统;拷贝很昂贵,应该尽量减少
经典存储技术 —— RAID 技术
单机存储技术如何做到高性能、高性价比、高可靠性?—— Redundent Array of Inexpensive Disk (RAID)
出现背景:单块大容量磁盘价格高于多块小磁盘;单块磁盘的写入性能小于多块磁盘并发写入性能;单块磁盘容错能力有限,不够安全
代表磁盘:
- RAID 0:多块磁盘简单组合;数据条带化存储,提高磁盘带宽;没有额外容错设计
- RAID 1:一块磁盘对应一块镜像盘;真实空间利用率仅 50%;容错性高
- RAID 0 + 1:结合 RAID 0 和 RAID 1;真实空间利用率50%,容错能力强,写入带宽好
2.2 数据库
核心概念:关系(实体间联系)、关系代数(抽象查询语言)、SQL(一种 DSL,Domain Specific language,即方便人类阅读的关系代数表达形式)
- 关系型数据库的特点:是存储系统、结构化数据友好、支持事务(ACID)、支持复杂查询语言
- 非关系型数据库的特点:是存储系统、半结构化数据友好、可能支持事务(ACID)、可能支持复杂查询语言
2.3 数据库 vs 经典存储 —— 结构化数据管理
数据库 | 经典存储 | |
---|---|---|
一条用户注册数据 | 表装 | 线性 |
事务能力 | 支持 | 不易支持 |
复杂查询能力 | SQL,简洁灵活 | 痛苦循环,僵化复杂 |
事务能力 ACID
- Atomicity 原子性:事务内的操作要么都做要么不做
- Consistancy 一致性:执行事务前后,数据状态一致
- Isolation 独立性:隔离多个并发事务,不会相互影响(受隔离级别决定)
- Durability 持久性:事务一旦提交成功,数据保证持久性
2.4 数据库的使用方式
在操作数据时支持 insert, update, select, delete, where 子句, order by 子句, group by 子句。
在对数据定义做修改时支持 create table, create database, alter table 等。
3 主流产品剖析
注意区分存储和数据库
3.1 单机存储
定义:单个计算机节点上的存储软件系统,一般不涉及网络交互。
本地文件系统
Linux 经典哲学:一切皆文件。
文件系统的管理单元是文件,接口都必须遵循 VFS 的统一抽象接口。
Linux 的两大数据结构:Index Node 和 Directory Entry。
Index Node 记录文件的元数据,如 id、大小、权限、磁盘位置。inode 是文件的唯一标识,会被存储到磁盘上,inode 的总数在格式化文件系统时就已确定。
Directory Entry 记录文件名、inode 指针、层级关系等,dentry是一个全内存的数据结构,与 inode 的关系是 n: 1。
key-value 存储
讲师造句:世间一切皆 key-value —— key 是你的身份证,value 是你的内涵。
常见使用方式:put(k, v) 和 get(k)
常见数据结构:LSM-Tree (见下图),某种程度上牺牲了读性能,追求写入性能。存入 memory 中的可变 MemTable 的数量达到一定程度后,整体转换为 Immutable MenTable。再在达到一定触发条件时存储到 disk 上的 Level 0 SSTable 上。在有新的数据存储进来时,再下移到 Level 1 SSTable 上。
拳头产品:RocksDB (感兴趣可看 levelDB)
3.2 分布式存储
定义:在单机存储的基础上实现了分布式协议,涉及大量网络交互。
分布式文件系统
HDFS:大数据时代的基石
时代背景:专用的高级硬件很贵,数据存量大,吞吐超高。
核心特点:支持海量数据存储、高容错性、弱 POSIX 语义、使用普通的 x86 语义性价比高
存储结构:
分布式对象系统
Ceph:开源分布式存储系统里的“万金油”
核心特点:一切皆对象(但是支持对象接口、块接口、文件接口)、主备复制模型、数据分布模型采用 CRUSH 算法(哈希+权重+随机抽签)
系统结构:
3.3 单机关系型数据库
单机数据库概念:单个计算机节点上的数据系统
事务在单机内执行,也可能通过网络交互实现分布式事务。
关系型数据库商业产品 Oricle 称王,开源产品 MySQL 和 PostgreSQL 称霸。
关系型数据库的通用组件:Query Engine 负责解析 query,生成查询计划;Txn Manager 负责事务并发管理;Lock Manager 负责锁的管理和调度;Storage Engine 负责组织内存/磁盘数据结构;Replication 负责主备同步。
关键内存数据结构:B-Tree, B+ Tree, LRU List 等
关键磁盘数据结构:WriteAheadLog (RedoLog), Page
存储结构:
3.4 单机非关系型数据库
MongoDB、Redis、Elasticsearch 三足鼎立。
- 关系型数据库通常使用 SQL 交互,非关系型数据库交互方式各不相同
- 非关系型数据库的数据结构千奇百怪,没有关系约束后,Schema 相对灵活
- 不管是不是关系型数据库,大家都在尝试支持 SQL (子集)和“事务”特性(开始内卷)
Elasticsearch
- 面向“文档”存储
- 文档可序列化为 JSON,支持嵌套
- 存在 index,即文档的合集
- 存储和构建索引能力依赖 Lucene 引擎(搜索引擎感兴趣可以看一下)
- 实现了大量搜索数据结构和算法
- 支持 Restful API,也支持弱 SQL
MongoDB
- 面向“文档”存储
- 文档可序列化为 JSON/BSON,支持嵌套
- 存在 collection,即文档的合集
- 存储和构建索引能力依赖 wiredTiger 引擎(纯C写的)
- 4.0 后开始支持事务(多文档、跨分片多文档等)
- 常用 Client/SDK 交互,可通过插件转义支持弱 SQL
Redis
- 数据结构丰富(Hash 表、set、zset、list)
- C 语言实现,超高性能
- 主要基于内存,但支持 AOF/RDB 持久化
- 常用 redis-cli/多语言 SDK 交互
和 MySQL 相比,Elasticsearch 天然能做模糊搜索,还能自动算出关联程度。
3.5 分布式数据库
(引入分布式系统是不是一种内卷化的体现?是不是单机数据库已经很好了,我们一定要自己卷自己,搞个分布式,无中生有?)
引入分布式的可以解决的现有问题:容量、弹性、性价比
- 解决容量问题:单点容量有限,受硬件限制 -> 存储结点池化,动态扩缩容(池化技术)
- 解决弹性问题:扩缩容
- 解决性价比问题:CPU 、存储空间、内存的性价比的需求侧重不同,导致利用率过高过低
引入分布式可以进一步解决的问题:多写、内存弹性、分布式事务优化
4 新技术演进
未来方向
- 新架构:软件架构变更(Bypass OS Kernel)
- AI 增强:智能存储格式转换(相对有限)
- 新硬件革命:存储介质变更、计算单元变更、网络硬件变更(硬件更有可能)
4.1 SPDK
SPDK 是 Bypass OS Kernel 的一种。把 kernel space 变为 user space,从而避免 syscall 带来的性能损耗,直接从用户态访问磁盘;把中断变为轮询,磁盘性能提高后,中断次数增加,不利于 IO 性能,SPDK pooler 可以绑定特定 CPU 不断轮询,减少 context switch 提高性能;采用无锁数据结构,使用 Lock-free queue 降低并发时的同步开销。
4.2 AI & Storage
数据存储格式的转换:行存变为列存,甚至行列混存(此时需要 AI 判断哪些适合行存哪些适合列存以适应动态性较强的业务)
4.3 高性能硬件
RDMA 网络:传统的网络协议栈需要基于多层网络协议处理数据包,并在用户态和内核态之间反复切换,通用但性能不是最佳。RDMA 是 kernel bypass 流派,不经过传统的网络协议栈,可以把用户态虚拟内存映射给网卡,减少拷贝开销,减少 CPU 开销。
Persistent Memory:在 NVMe SSD 和 Main Memory 间有一种全新的存储产品 Persistent Memory,IO 延时介于二者之间,约为百纳秒级;可以用作易失性内存(memory mode),也可以用作持久化介质(app-direct)。
可编程交换机:P4 Switch,配有编译器、计算单元、DRAM,可以在交换机层对网络包做计算逻辑。在数据库场景下,可以实现缓存一致性协议等。
CPU/GPU/DPU:CPU 从 multi-core 走向 many-core;GPU 强大的算力和越来越大的显存空间;DPU 可以用于异构计算,减轻 CPU 的计算压力。