最近在学习《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.读写分离:内存、磁盘分工明确,读写性能优化明显。

