数据库:数据的持久化。
- 校验数据合法性
- 修改内存,用高效的数据结构组织数据
- 写入存储介质,以寿命、性能友好的方式写入硬件
存储系统在 IO 路径上代码不能太复杂,因为有性能要求。但在非 IO 路径或 IO 路径的错误处理分支上,我们必须考虑到各种异常情况的存在,因此代码必须“复杂”。
在从软件到硬件的存储路径:Data -> stdio calls -> stdio buffer -> I/O system calls -> kernel buffer cache -> kernel initiated write -> Disk。在这条路径上,buffer 与 cache 可以在跨软件层时,以软/硬件友好的方式提供交互。
数据库之于经典存储的优势
关系型数据库的特点
关系型数据库是在存储之外又发展出其他能力的存储系统。对结构化数据友好、支持事务、支持 SQL 等复杂查询语言。而非关系型数据库不要求严格的结构化,对半结构化数据友好,并且不一定支持事务或复杂查询语言。
事务的特点 (ACID)
- Atomicity, 保证一个事务中的操作要么全做、要么全不做
- Consistency, 事务执行前后,保障事务状态一致
- Isolation, 隔离多个并发任务,避免互相影响
- Durability, 事务一旦提交成功,数据库保证其持久性
复杂查询能力
数据库支持使用 SQL 等语言灵活、简洁地进行复杂查询,而利用其他编程语言对经典存储中地数据进行查询是非常复杂和僵化的。
例:
SELECT gender, count(*) FROM user WHERE user_name LIKE 'xiao%' AND len(password_hint) < 10 GROUP BY gender;
主流存储产品分析
单机存储——本地文件系统
文件系统的管理大院:文件。文件系统众多,但都遵循 VFS 的统一抽象接口。
Linux 文件系统的两大数据结构:Index Node 与 Directory Entry。i node记录文件元数据,是文件的唯一标识;d entry记录文件名、inode指针、层级关系等。
单机存储——Key-Value 存储
常用方法:put(k, v)、get(k),常见数据结构:LSM-Tree。如 RocksDB。
分布式存储——HDFS
支持海量数据存储、高容错性、弱 POSIX 语义、性价比高,在单机存储的基础上,通过网络来进行交互。
分布式存储——Ceph
一套系统支持对象接口、块接口、文件接口。数据写入采用主备复制模型,数据分布模型采用 CRUSH 算法。
单机数据库——关系型
主要产品:Oracle、MySQL、PostgreSQL
关键内存数据结构:B-Tree、B+-Tree、LRU List等
关键磁盘数据结构:RedoLog (WriteAheadLog)、Page
单机数据库——非关系型
主要产品:MongoDB、Redis、Elasticsearch
与关系型数据库一般直接使用 SQL 交互不同,非关系型数据库交互方式各不相同。并且,非关系型数据库数据结构千奇百怪,schema 相对灵活。
分布式数据库
- 存储节点池化,与数据库之间通过网络连接,以解决容量问题
- 动态扩缩容,解决服务器扩/缩容过程中的弹性问题
- 使用共享存储池,不用更换高规格机器,解决性价比问题
数据库新技术演进
SPDK (Storage Performance Development Kit)
- Bypass OS kernel, 避开内核态系统调用带来的性能损耗,直接从用户态访问磁盘。
- 中断改轮询,提高 IO 链路性能
- 使用 lock-free queue,降低并发时的同步开销
AI & Storage
通过 AI 进行存储形式中的一些决策,以适应动态性较强的业务。
高性能硬件
- RDMA 网络,bypass kernel,不经过传统网络协议栈,减少 CPU 开销
- Persistent memory,IO 时延介于 SSD 和 Memory 之间,既可以用作易失性内存,也可以作持久化介质
- 可编程交换机,在交换机层对网络包做计算逻辑,可实现缓存一致性
- CPU/GPU/DPU,多核、强大算力、专用计算单元减轻 CPU workload,释放 CPU 通用计算能力。