RocksDB 内核机制:LevelDB · WAL · Compaction · Column Family · 生产嵌入
读者读完 PostgreSQL 行存
OLTP、列存引擎 与 数据平台 query-engine
系列 之后,写优化 LSM 仍多停在 lsm-tree DIY 五篇 与 storage
工程调参。而 TiKV、Flink RocksDB state、Kafka Streams
本地状态实际跑的是 RocksDB——stream-processing
第 12 篇 从 Flink 视角讲了 KeyGroup 与增量
checkpoint,但没有把
DBImpl::Write、CompactionJob、write
stall 状态机按源码路径讲透。
本系列不写 SQL,也不重复 storage/32 的 200+ 参数 cookbook,写:
- LevelDB 单线程 leveled 基线与 RocksDB fork 后的多线程 compaction、Column Family、RateLimiter 差异地图。
- WAL → MemTable → Flush → SST → MANIFEST 写路径,与
Get/Iterator/ Block Cache / Bloom 读路径。 - Leveled / Universal compaction 如何驱动三种放大与 write stall。
- Flink / TiKV 等嵌入场景如何把 key 映射到 CF 与 LSM 层(对读 stream/12,不迁移其全文)。
系列状态:已完成(2026-07-07)。全 18 篇正文均已发布,可点进阅读。
版本锚定:RocksDB 9.x(源码路径与 Wiki);LevelDB 1.23(对照);Flink 1.20+(第 16 篇引用边界)。本机 WSL2 实验见
reproduce/;未部署 Flink 集群的篇目不伪造 checkpoint 耗时。
适合谁看
- 流计算 / 数据平台工程师:维护 Flink RocksDB state,排查 L0 堆积、checkpoint 与 compaction 争抢 I/O。
- 从 lsm-tree DIY 过来的读者:对照 toy engine 与生产 RocksDB 的 MANIFEST、SuperVersion、stall。
- 分布式存储开发者:TiKV 等 LSM 底座的预修(Raft 层留 HTAP 续作)。
- DBA / 后端:在 B-Tree(PG/InnoDB)与 LSM 之间做选型。
存储引擎三角阅读顺序
| 阶段 | 系列 | 核心问题 |
|---|---|---|
| 1 | PostgreSQL 内核 | B-Tree + MVCC 行存 |
| 2 | 列存引擎 | 读优化列存 scan |
| 3 | 本系列 | 写优化 LSM 生产实现 |
| 4 | lsm-tree DIY | 可选:亲手实现对照 |
| 5 | 数据平台栈 | 湖仓 + 流 + 查询(已闭合) |
推荐阅读路径
| 路径 | 篇目 | 适合 |
|---|---|---|
| 存储三角闭合 | 1 → 4 → 7 → 10 → 13 → 18 | 从 PG/列存补 LSM |
| 从 lsm-tree DIY 来 | 2 → 3 → 6 → 10 → 17 | toy vs 生产 |
| 从 stream/Flink 来 | 1 → 5 → 9 → 11 → 16 → 17 | state 慢根因 |
| Compaction 调优 | 10 → 11 → 12 → 17 | DBA / 平台 |
| 完整通读 | 1 → … → 18 | 系统掌握 |
一、六个关键问题
- LevelDB 的瓶颈在哪,RocksDB 改了什么? → 第 1、2、3 篇
Get/Iterator如何从 MemTable 追到 Ln SST? → 第 4–9 篇- Leveled / Universal compaction 如何驱动 write stall 与三种放大? → 第 10、11、12 篇
- Column Family 与 WAL 如何共享又隔离 LSM 树? → 第 13 篇
- Flink state / TiKV 等嵌入场景如何映射到 CF 与 key 编码? → 第 16 篇(对读 stream/12)
- 写 stall、空间膨胀、读放大如何从 LSM 层诊断? → 第 17、18 篇
二、篇目依赖
flowchart TD
A["01 LSM 生态全景"] --> B["02 LevelDB 基线"]
B --> C["03 RocksDB 架构演进"]
C --> D["04 WAL WriteBatch"]
D --> E["05 MemTable Flush"]
E --> F["06 SST MANIFEST"]
F --> G["07 Get Snapshot"]
G --> H["08 Iterator Merge"]
H --> I["09 Cache Bloom Index"]
I --> J["10 Leveled Compaction"]
J --> K["11 Universal FIFO Stall"]
K --> L["12 Concurrent RateLimit"]
L --> M["13 ColumnFamily"]
M --> N["14 事务 OCC"]
N --> O["15 Checkpoint Backup Ingest"]
O --> P["16 嵌入场景对照"]
P --> Q["17 故障排查"]
Q --> R["18 选型阅读地图"]
跨系列:lsm-tree → 01/05/06/08;stream/12–13 → 16;storage/31–32 → 10–12/17(调参边界)。
三、目录与每篇价值点
第一部分:基线与架构
- LSM
生态全景:存储引擎三角与 RocksDB 生态位
- TiKV/Flink/Kafka Streams/CH Embedded;与 lsm-tree、storage/32、stream/12 分工;18 篇地图。
- LevelDB
基线:单线程 Leveled 与 DBImpl 骨架
- 无 CF、单 compaction
线程;
Write/Get最小路径;SST/MANIFEST 语义铺垫。
- 无 CF、单 compaction
线程;
- RocksDB
架构演进:相对 LevelDB 的 diff 地图
- 多线程 flush/compaction、CF、RateLimiter;bLSM 学术锚点与 LevelDB 单线程对照。
第二部分:写路径
- WAL 与
WriteBatch:持久化与原子批写
- WAL record、sync、Group Commit;
WriteBatch在DBImpl::Write中的提交顺序。
- WAL record、sync、Group Commit;
- MemTable
与 Flush:SkipList 到 L0 SST
- Immutable 队列、
FlushJob、与 lsm-tree WAL/MemTable 篇对照。
- Immutable 队列、
- SST 格式与
MANIFEST:BlockBasedTable 与 VersionSet
- Data/Index/Filter
Block、Footer;
VersionEdit如何描述 LSM 快照。
- Data/Index/Filter
Block、Footer;
第三部分:读路径
- Get 与
Snapshot:SuperVersion 与 sequence number
- 自 MemTable 到 Ln 的层级查找;Snapshot 与 MVCC 序列号边界。
- Iterator
与 MergeIterator:范围扫描与 tombstone
- 多路归并;与 lsm-tree compaction 归并迭代器对读。
- Block Cache 与
Bloom:读放大裁剪
- Full/Ribbon Filter、Partitioned Index;Bloom 谱系与 learned index 争论边界;引用 storage/68。
第四部分:Compaction
- Leveled
Compaction:层级不变式与 CompactionPicker
- L0 重叠、size ratio;与 storage/31 三种放大衔接。
- Universal、FIFO
与 Write Stall
StopWritesTrigger、delayed write;stall 状态机与 LOG 判读。
- 并发
Compaction 与 Rate Limiter
CompactionJob线程池;bLSM + exp12 三轮中位数;kWritesOnly 与前台写争抢。
第五部分:高级特性
- Column
Family:共享 WAL 与独立 LSM
ColumnFamilyHandle、per-CF 选项、Flink 多 state 变量映射。
- 事务与
OptimisticTransactionDB
- WritePrepared/OCC 边界;TiKV 前置(B 级前瞻标注)。
- Checkpoint、Backup
与 External Ingest
- 硬链接快照;
SstFileWriter/IngestExternalFile。
- 硬链接快照;
第六部分:生产与收束
- 生产嵌入对照:Flink
· TiKV · Kafka Streams
- KeyGroup 前缀、增量 checkpoint SST;stream/12 内核侧补全。
- 经典故障与排查
- L0 堆积、compaction 落后、cache 失效、ENOSPC stall;stall=背压;exp11 本机片段与第 11 篇对齐。
- 选型与存储栈阅读地图
- RocksDB vs InnoDB vs 列存;数据平台 + HTAP 续作入口。
四、与相邻系列的分工
| 话题 | 本系列 | 相邻系列 |
|---|---|---|
| LSM 三种放大推导 | 引用 | lsm-tree/01、storage/31 |
| 200+ 参数调优模板 | 不展开 | storage/32 |
| Flink KeyGroup 目录 | 第 16 篇内核侧 | stream/12 |
| MPP 查询 spill | 不展开 | query-engine/16 |
| HTAP / TiKV Raft | 第 18 篇续作入口 | db-frontier/12 |
参考
- 系列规划(PLAN.md)(写作执行文档,非发布页)
- 实验复现(reproduce/)
- 数据库内核索引
- 全部系列索引
返回 数据库索引 · lsm-tree DIY · 流式处理系列
同主题继续阅读
把当前热点继续串成多页阅读,而不是停在单篇消费。
【RocksDB 内核机制】LSM 生态全景:存储引擎三角与 RocksDB 生态位
闭合存储引擎三角的最后一角:对照 PG B-Tree 与列存 scan,定位 LSM 写优化引擎在 TiKV、Flink、Kafka Streams、ClickHouse Embedded 中的嵌入方式,并划分本系列与 lsm-tree DIY、storage/31–32、stream/12 的分工边界。
【RocksDB 内核机制】Column Family:共享 WAL 与独立 LSM
从 RocksDB 3.0 引入的 Column Family 出发,拆解共享 WAL、独立 MemTable/SST/Version 链、`ColumnFamilyHandle` 生命周期与 DBOptions/ColumnFamilyOptions 分层;并对照 Flink 多 state 变量到 CF 的映射边界。
【RocksDB 内核机制】生产嵌入对照:Flink · TiKV · Kafka Streams
从 RocksDB 内核侧补全 Flink KeyGroup 前缀与增量 checkpoint SST 上传机制,对照 TiKV Region 引擎与 Kafka Streams changelog 容错;不重复 stream/12 作业侧全文,给出 Docker 复现步骤而不伪造 checkpoint 指标。
从零写一个 LSM-Tree 存储引擎
五篇长文,从 LSM-Tree 的设计哲学讲到完整 KV 引擎实现,最后用 Rust 重写并三方 benchmark 对比。每篇含完整 C 代码、架构图、数学推导。