1. 项目概述
Meta 开源的 RocksDB 是一个高性能嵌入式 KV 存储引擎,核心采用 LSM-Tree(Log Structured Merge Tree) 架构,重点优化 SSD 场景下的大规模随机写入性能。其设计继承自 LevelDB,并扩展了:
- 多级 Compaction
- Column Family
- WAL
- Snapshot
- Transaction
- Block Cache
- 并发 Flush / Compaction
- Prefix Bloom Filter
整体结构可概括为:
+--------------------+
| Client API |
| Put/Get/Delete |
+----------+---------+
|
+---------v---------+
| DBImpl |
+---------+---------+
|
+-------------------+------------------+
| |
+------v------+ +--------v--------+
| Write Path | | Read Path |
+------+------| +--------+--------+
| |
+------v------+ +--------v--------+
| MemTable | | MemTable/SST |
+------+------| +--------+--------+
| |
+------v------+ +--------v--------+
| WAL Log | | Block Cache |
+------+------| +--------+--------+
|
+------v------+
| Flush Thread|
+------+------+
|
+------v------+
| SST Files |
+------+------+
|
+------v------+
| Compaction |
+-------------+
RocksDB 官方架构说明指出,其核心数据结构包括:
- MemTable(内存表)
- WAL(预写日志)
- SST File(不可变有序文件)
- Compaction(后台压缩合并)
2. 代码目录结构分析
RocksDB 项目整体为典型大型 C++ 存储引擎工程。
2.1 顶层目录结构
rocksdb/
├── db/ # 核心 DB 实现
├── table/ # SST Table 实现
├── memtable/ # MemTable 实现
├── util/ # 工具库
├── env/ # 文件系统抽象
├── include/rocksdb/ # 对外 API
├── cache/ # Block Cache
├── logging/ # 日志系统
├── monitoring/ # 监控统计
├── options/ # 配置系统
├── port/ # 平台兼容层
├── file/ # 文件读写封装
├── tools/ # 调试工具
├── java/ # RocksJava JNI
├── utilities/ # 扩展功能
└── plugin/ # 插件扩展
2.2 核心模块职责
| 模块 | 作用 |
|---|---|
| db/ | 数据库核心逻辑 |
| table/ | SST 文件组织与读取 |
| memtable/ | 内存写缓冲 |
| cache/ | Block Cache |
| env/ | 操作系统抽象 |
| file/ | 文件 IO |
| util/ | 通用工具 |
| monitoring/ | 性能统计 |
| logging/ | 日志 |
| utilities/ | Transaction / TTL 等扩展 |
3. 核心类结构视图
3.1 核心类关系图
+----------------+
| DB |
+--------+-------+
^
|
+-------+--------+
| DBImpl |
+-------+--------+
|
+----------------+------------------+
| |
+-------v------+ +-------v-------+
| ColumnFamily | | VersionSet |
+-------+------+ +-------+-------+
| |
+-------v------+ +-------v-------+
| MemTable | | Version |
+-------+------+ +-------+-------+
| |
+-------v------+ +-------v-------+
| WAL Writer | | SST FileMeta |
+--------------+ +---------------+
3.2 关键类分析
1)DBImpl
文件:
db/db_impl/db_impl.h
核心职责:
- Put/Get/Delete
- 管理 MemTable
- Flush
- Compaction
- Recovery
- Snapshot
- WAL 管理
属于 RocksDB 的核心控制器。
2)MemTable
文件:
memtable/memtable.h
特点:
- SkipList 实现
- 有序内存结构
- 支持并发读
核心接口:
Add(...)
Get(...)
ApproximateMemoryUsage()
3)VersionSet
文件:
db/version_set.h
作用:
- 管理整个 LSM Tree 的版本
- 维护各层 SST 文件元数据
- 实现 MVCC 风格视图
4)TableCache
文件:
db/table_cache.h
作用:
- 缓存 SST 文件句柄
- Block Cache 管理
- 避免频繁打开文件
4. 写入流程分析(Put)
4.1 Put 主流程
用户调用:
db->Put(write_options, key, value);
内部调用链:
DB::Put
↓
DBImpl::Put
↓
DBImpl::Write
↓
WriteThread
↓
WAL Append
↓
MemTable Insert
4.2 写流程时序图
Client
|
| Put()
v
DBImpl
|
| Write()
v
WriteThread
|
| append WAL
v
LogWriter
|
| insert
v
MemTable
|
| ack
v
Client
4.3 WAL + MemTable 双写机制
RocksDB 的核心可靠性机制:
Write Request
|
+--------+--------+
| |
v v
WAL Log MemTable
|
v
Disk Persist
官方文档指出:
所有写入首先进入 MemTable,同时顺序追加到 WAL 中。
这样即使宕机,也可以通过 WAL 恢复。
5. Flush 流程分析
当 MemTable 达到阈值:
active memtable
|
v
immutable memtable
|
v
flush thread
|
v
Level-0 SST File
5.1 Flush 流程图
+----------------+
| Active MemTable|
+--------+-------+
|
memory full
|
v
+--------+-------+
| Immutable MT |
+--------+-------+
|
Flush Job
|
v
+--------+-------+
| SST File (L0) |
+----------------+
6. 读取流程分析(Get)
6.1 Get 查找顺序
RocksDB 读取遵循:
MemTable
↓
Immutable MemTable
↓
L0 SST
↓
L1 SST
↓
...
Ln SST
因为:
- 最新数据优先在内存
- L0 文件可能 key 重叠
- 高层 Level 不重叠
6.2 Get 流程图
Client Get
|
v
+---+------------------+
| Search MemTable |
+---+------------------+
|
miss|
v
+---+------------------+
| Search Immutable MT |
+---+------------------+
|
miss|
v
+---+------------------+
| Search L0 Files |
+---+------------------+
|
miss|
v
+---+------------------+
| Search Lower Levels |
+----------------------+
6.3 Block Cache 机制
Read Request
|
v
Block Cache Hit?
/ \
yes no
| |
return read SST
缓存热点数据块。
7. Compaction 核心机制
Compaction 是 RocksDB 的灵魂。
7.1 为什么需要 Compaction
LSM 写入会产生:
- 重复 key
- 删除标记
- 文件碎片
- 多层 SST
Compaction 用于:
- 合并 SST
- 清理旧版本
- 降低读放大
7.2 Compaction 流程图
Level-0 Files
|
v
Select Files
|
v
Merge Sort
|
v
Remove obsolete KV
|
v
Generate New SST
|
v
Install Version
7.3 Compaction 时序图
BackgroundThread
|
| PickCompaction()
v
CompactionJob
|
| Read SSTs
v
MergeIterator
|
| Merge Keys
v
TableBuilder
|
| Write New SST
v
VersionSet
8. Version 管理机制
RocksDB 使用:
VersionSet
├── Version
│ ├── L0 files
│ ├── L1 files
│ └── ...
实现:
- Snapshot
- MVCC
- 原子切换
8.1 Version 切换流程
Old Version
|
v
Compaction
|
v
Generate New Version
|
v
Atomic Install
9. 并发模型分析
9.1 后台线程
RocksDB 内部典型线程:
| 线程 | 作用 |
|---|---|
| WriteThread | 串行写 |
| FlushThread | Flush MemTable |
| CompactionThread | Compaction |
| WAL Sync Thread | WAL fsync |
| BackgroundScheduler | 后台任务调度 |
9.2 并发设计特点
写入串行化
Multiple Writers
|
v
WriteThread
|
Group Commit
减少锁竞争。
后台异步 Compaction
Foreground Write
|
| async
v
Background Compaction
提升吞吐量。
10. SST 文件结构分析
10.1 SST 文件结构
+-------------------+
| Data Blocks |
+-------------------+
| Meta Blocks |
+-------------------+
| Filter Block |
+-------------------+
| Index Block |
+-------------------+
| Footer |
+-------------------+
10.2 BlockBasedTable
默认 Table Format:
table/block_based/
核心类:
BlockBasedTable
Block
BlockBuilder
IndexReader
FilterBlockReader
11. WAL 日志机制
11.1 WAL 格式
+---------+---------+-------+
| Header | Payload | CRC |
+---------+---------+-------+
11.2 恢复流程
Open DB
|
v
Replay WAL
|
v
Rebuild MemTable
官方说明:
RocksDB 在启动时会重放 WAL 日志恢复 MemTable。
12. 代码设计亮点
12.1 模块化设计
特点:
- Env 抽象文件系统
- TableFactory 插件化
- Cache 可替换
- Compaction 策略可配置
12.2 高性能优化
多线程 Compaction
官方指出:
多线程 Compaction 可显著提升 SSD 写吞吐。
Bloom Filter
减少无效 SST 查询:
key -> bloom filter -> maybe/no
Prefix Seek
针对前缀扫描优化。
13. RocksDB 核心架构总图
+----------------+
| Application |
+--------+-------+
|
Put/Get/Delete
|
+--------v-------+
| DBImpl |
+--------+-------+
|
+----------------------+--------------------+
| |
+--------v--------+ +----------v----------+
| Write Path | | Read Path |
+--------+--------+ +----------+----------+
| |
+--------v--------+ +----------v----------+
| WAL | | Block Cache |
+--------+--------+ +----------+----------+
| |
+--------v--------+ +----------v----------+
| MemTable | | SST Reader |
+--------+--------+ +----------+----------+
|
+--------v--------+
| Flush |
+--------+--------+
|
+--------v--------+
| SST Files (L0) |
+--------+--------+
|
+--------v--------+
| Compaction |
+--------+--------+
|
+--------v--------+
| VersionSet |
+-----------------+
14. 总结
RocksDB 的本质是:
WAL + MemTable + SST + Compaction + VersionSet
其核心设计思想:
| 设计 | 目的 |
|---|---|
| WAL | 崩溃恢复 |
| MemTable | 高速写 |
| SST | 顺序 IO |
| Compaction | 降低读放大 |
| VersionSet | MVCC |
| Block Cache | 热点加速 |
15. 核心源码阅读建议
推荐阅读顺序:
1. include/rocksdb/db.h
2. db/db_impl/*
3. memtable/*
4. db/version_set.*
5. table/block_based/*
6. db/compaction/*
7. db/write_thread.*
8. db/log_writer.*
16. 推荐重点阅读源码文件
| 文件 | 作用 |
|---|---|
| db_impl.cc | DB 主实现 |
| write_thread.cc | 写入调度 |
| memtable.cc | 内存表 |
| version_set.cc | Version 管理 |
| compaction_job.cc | Compaction |
| block_based_table.cc | SST 读取 |
| log_writer.cc | WAL |
| db_iter.cc | Iterator |
17. 架构特点总结
优势
- 写性能极强
- SSD 友好
- 可扩展性高
- Compaction 灵活
- 工程成熟
缺点
- Compaction 复杂
- 写放大问题
- 参数极多
- 调优成本高
社区讨论中也经常提到:
- RocksDB 工程复杂度很高
- 代码规模巨大
- 调优学习曲线陡峭
- 引用
