主流产品
单机存储
单个计算机节点上的存储软件系统,一般不涉及网络交互
- 本地文件系统
- Linux哲学:一切皆文件
- 文件系统的管理单元:文件
- 文件系统接口:各种文件系统(ext2/3/4、sysfs、rootfs等)都遵循VFS的统一抽象接口
- Linux文件系统的两大核心数据结构
- Index Node
- 记录文件元数据,如ID、大小、权限、磁盘位置等
- inode是一个文件的唯一标识,会被存储到硬盘上
- inode的总数在格式化文件系统时就固定了
- Directory Entry
- 记录文件名、inode指针、层级关系(Parent)等
- dentry是内存结构,与inode的关系是 N:1 (Hardlink的实现)
- Index Node
- Key-Value 存储
- put(k, v) & get(k)
- 常见数据结构:LSM-Tree 某种程度上牺牲读性能,追求写入性能
- 拳头产品:RocksDB
Linux哲学:“一切皆文件” 是指在Linux系统中,几乎所有的硬件设备、接口、进程、通信等都被抽象成文件,这种统一的抽象方式简化了系统管理和编程。Linux支持多种文件系统,它们遵循虚拟文件系统(VFS)的统一抽象接口,这使得不同的文件系统可以在用户和应用程序层面上表现一致,不需要修改应用程序代码。
Key-Value 存储则是一种轻量级的数据存储方式,每个数据项由一个唯一的键(key)和对应的值(value)组成。这种存储方式非常适合需要快速存储和检索数据的场景。
LSM-Tree(Log-Structured Merge-Tree)是一种在写入时牺牲一定的读取性能来换取更好写入性能的数据结构。它将数据写入内存中的一组数据结构(memtable),然后定期将内存中的数据合并到磁盘上的多个层次结构(SSTables),以优化写入性能和数据的持久化。
分布式存储
在单机存储的基础上实现了分布式协议,涉及大量网络交互
- 分布式文件系统
- HDFS:堪称大数据时代的基石
- 支持海量数据存储、高容错性、弱POSIX语义、使用普通x86服务器,性价比高
- 在其之上发展出了Hadoop体系
- HDFS:堪称大数据时代的基石
- 分布式对象存储
- Ceph:开源分布式存储系统里的「万金油」
- 一套系统支持对象接口、块接口、文件接口,但一切皆对象
- 数据写入采用主备复制模型
- 数据分布模型采用CRUSH算法(Hash+权重+随机抽签)
- Ceph:开源分布式存储系统里的「万金油」
HDFS(Hadoop Distributed File System)是大数据时代的分布式文件系统基石。它通过将大文件分割成多个块,并在集群的多个节点上分布存储这些块来实现高容错性和高吞吐量。
HDFS 上的数据存储是以块为单位进行的,每个块有一个默认大小,可以通过配置进行调整。HDFS 的特点包括数据冗余存储、容错性强、适合大文件存储等。
CRUSH(Controlled Replication Under Scalable Hashing)算法是 Ceph 中的数据分布算法,它通过使用哈希和权重等机制来决定数据在存储集群中的分布,从而实现负载均衡和容错性。
单机数据库
即单个计算机节点上的数据库系统。事务在单机内执行,也可能通过网络交互实现分布式事务
关系型数据库
关系型数据库是基于关系模型的数据库系统,使用表来组织和存储数据,支持事务的一致性和SQL查询。
商业产品Oracle称王、开源产品MySQL、PostgreSQL称霸
- 关系型数据库通用组件
- Query Engine:负责解析query,生成查询计划
- Txn Manager:负责事务并发管理
- Lock Manager:负责锁相关的策略
- Storage Engine:负责组织内存/磁盘数据结构
- Replication:负责主备同步
- 关键内存数据结构
- B-Tree、B+树、LRU List等
- 关键磁盘数据结构
- WriteAheadLog(RedoLog)、Page
非关系型数据库
非关系型数据库(NoSQL)是一类不使用传统的关系表格来存储数据的数据库系统。它们的数据模型更加灵活,适合处理半结构化和非结构化数据。
- 关系型数据库一般直接使用SQL交互,而非关系型数据库交互方式各不相同
- 非关系型数据库的数据结构千奇百怪,没有关系约束后,schema相对灵活
- 不管是否关系型数据库,大家都在尝试支持SQL(子集)和“事务”
MongoDB、Redis、Elasticsearch 三足鼎立
- Elasticsearch
- 面向「文档」存储
- 文档可序列化为JSON,支持嵌套
- 存在「index」,即文档的集合
- 存储和构建索引能力依赖Lucene引擎
- 实现了大量搜索数据结构 & 算法
- 支持RESTFUL API,也支持弱SQL交互
- 天然支持「模糊搜索」,还能自动算出关联程度
- MongoDB
- 面向「文档」存储
- 文档可序列化为JSON/BSON,支持嵌套
- 存在「collection」,即文档的集合
- 存储和构建索引能力依赖wiredTiger引擎
- 4.0后开始支持事务(多文档、跨分片多文档等)
- 常用client/SDK交互,可通过插件转译支持弱SQL
- Redis
- 数据结构丰富(Hash表、Set、Zset、List)
- C语言实现,超高性能
- 主要基于内存,但支持AOF/RDB持久化
- 常用redis-cli/多语言SDK交互
分布式数据库
- 解决容量、弹性、性价比问题
- 存储节点池化,动态扩缩容
- 单写 vs 多写
- 从磁盘弹性到内存弹性
- 分布式事务优化
新技术
- 软件架构变更
- Bypass OS kernel
- SPDK(Storage Performance Development Kit)
- 内核空间 -> 用户空间:避免syscall带来的性能损耗,直接从用户态访问磁盘
- 中断 -> 轮询:磁盘性能提高后,中断次数随之上升,不利于IO性能;SPDK poller可以绑定特定的CPU核心不断轮询,减少cs,提高性能
- 无锁数据结构:使用Lock-Free queue,降低并发时的同步开销
- SPDK(Storage Performance Development Kit)
- Bypass OS kernel
- AI增强
- 智能存储格式转换
- 行存储、列存储 进化到 AI决策的行列混存
- 新硬件革命
- 存储介质、计算单元、网络硬件变更
- RDMA网络
- 传统的网络协议栈,需要基于多层网络协议处理数据包,存在用户态 & 内核态的切换,足够通用但性能不是最佳
- RDMA 是 Kernel Bypass 的流派,不经过传统的网络协议栈,可以把用户态虚拟内存映射给网卡,减少拷贝开销,减少CPU开销
- Persistent Memory
- 在NVMe SSD和Main Memory间的一种存储产品(如英特尔傲腾)
- IO时延介于SSD和内存之间,约百纳秒量级
- 可以用作易失性内存(Memory Mode),也可以用作持久化介质(App-Direct)
- 可编程交换机
- P4 Switch,配有编译期、计算单元、DRAM,可以在交换机层对网络包做计算逻辑
- 在数据库场景下,可以实现缓存一致性协议等
- CPU/GPU/DPU
- CPU:从 Multi-Core 走向 Many-Core
- GPU:强大的算力+越来越大的显存空间
- DPU:异构计算,减轻CPU的Workload
总结
存储系统
- 块存储:存储软件栈里的底层系统,接口过于朴素
- 文件存储:日常使用最广泛的存储系统,接口十分友好,实现五花八门
- 对象存储:公有云上的王牌产品,immutable语义加持
- Key-Value存储:形式最灵活,存在大量的开源/黑盒产品
块存储是一种底层存储系统,将数据划分为块,通常是固定大小的块,如磁盘扇区。块存储在操作系统和文件系统中扮演关键角色,但对于应用开发者来说,它的使用往往被抽象出来,因为开发者更关注高级的文件系统和存储接口。
对象存储具备高度的可扩展性和可靠性,适用于海量数据存储和分布式访问。其immutable(不可变)语义意味着一旦对象被创建,就不能被修改,这有助于保证数据的一致性和可靠性。
数据库系统
- 关系型数据库:基于关系和关系代数构建的,一般支持事务和SQL访问,使用体验友好的存储产品
- 非关系型数据库:结构灵活,访问方式灵活,针对不同场景有不同的针对性产品
非关系型数据库(NoSQL)是一类不同于传统关系型数据库的数据库系统,它们强调结构灵活性、高可扩展性和更适合特定场景的数据模型。NoSQL数据库分为多个子类,包括文档型(如MongoDB)、列族型(如HBase)、键值型(如Redis)、图型(如Neo4j)等。每个子类都适用于不同的数据存储需求。
分布式架构
- 数据分布策略:决定了数据怎么分布到集群里的多个物理节点,是否均匀,是否能做到高性能
- 数据复制协议:影响IO路径的性能、机器故障场景的处理方式
- 分布式事务算法:多个数据库节点协同保障一个事务的ACID特性的算法,通常基于2pc的思想设计(Two-Phase Commit 是一个常用的分布式事务算法,它包括投票和提交两个阶段,用于协调多个节点的事务状态)