最近在学习《TiDB 数据库核心原理与架构(101) :TiKV-持久化》这篇课程的时候https://learn.pingcap.cn/learner/player/1110001;id=1110001;classroomId=1560001;rcoId=1710006;courseDetailId=960001;learnerAttemptId=1737590879178学习到了作为持久化层RocksDB的结构和写入流程,在这里重新梳理下:
RocksDB 的写入流程基于 LSM-Tree(Log-Structured Merge Tree)结构,核心目标是高效地管理内存和磁盘之间的数据流动,同时保证持久化和一致性。
一、流程
1. 写入 WAL(Write-Ahead Log)
-
数据首先被写入 WAL 文件(磁盘上的顺序日志文件)。
-
如果
sync_log=true
:- 每次写入会强制同步到磁盘,避免依赖操作系统缓存,防止因操作系统崩溃而丢失数据。
-
WAL 的作用:
- 提供数据的 崩溃恢复能力。
- 在系统崩溃后,能够通过 WAL 重建数据。
2. 写入 MemTable(内存表)
-
数据被写入 MemTable(内存中的有序结构)。
-
如果写入的 MemTable 数据量达到
write_buffer_size
限制:- 当前 MemTable 被标记为 Immutable MemTable。
- 开辟一个新的 MemTable 接收后续写入。
3. Immutable MemTable 刷盘
-
Immutable MemTable 不可修改,只能被异步刷入磁盘生成 SST 文件:
- 生成的 SST 文件存储在 Level 0。
-
通过这种机制:
- 避免数据阻塞在 MemTable 中,保证写入性能。
4. Write Stall(写入限制)
-
如果 Immutable MemTable 累积到超过阈值(默认 5 个),会触发 Write Stall:
- RocksDB 限制写入速度,客户端可能感受到写入性能下降。
- 相关信息可在日志中看到 write stall 的提示。
二、数据存储结构与压缩过程
1. Level 0
-
刷入的 Immutable MemTable 会生成无序的 SST 文件,直接存储在 Level 0。
-
默认 Level 0 最多存放 4 个 SST 文件:
- 超过阈值时,会触发 Compaction(压缩)。
2. Compaction(压缩机制)
-
Level 0 → Level 1 压缩:
- 将多个无序的 SST 文件合并为一个有序的 SST 文件,并写入 Level 1。
- SST 文件内部的键值是按顺序排列的,可以通过 二分查找 快速定位。
-
每一层的数据按范围划分,越低层的数据范围越大,数据密度越高。
3.删除操作与修改的特点
-
删除并不立即从磁盘中移除数据:
- 数据会在 MemTable 中写入一条 delete 标记。
- 在后续的 Compaction 过程中,带有删除标记的数据才会被真正移除。
-
修改就是追加一条新数据,版本比之前的新
三、读优化机制
1. Block Cache
- RocksDB 使用 Block Cache 缓存最近访问的热数据块,减少磁盘 IO。
2. Bloom Filter
-
每一层 SST 文件配备 Bloom Filter:
- 快速判断某个键是否存在。
- 如果返回“不存在”,则该键一定不在文件中;
- 如果返回“可能存在”,则需要进一步查询 SST 文件。
四、优势与特点
-
高效写入:数据写入是顺序的,避免了随机写磁盘的开销。
2.层级存储:数据通过 Compaction 从上层迁移到下层,结构简单且高效。
3.可靠性:WAL 提供持久性保障,确保数据不会因系统崩溃而丢失。
4.读写分离:内存、磁盘分工明确,读写性能优化明显。