RocksDB的代码分析报告

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 工程复杂度很高
  • 代码规模巨大
  • 调优学习曲线陡峭
  • 引用
相关推荐
知识领航员12 小时前
蘑兔AI音乐深度实测:功能拆解、实测表现与适用场景
java·c语言·c++·人工智能·python·算法·github
morestrive15 小时前
基于 fabric.js 实现浏览器端矢量 PDF 导出
前端·github
右耳朵猫AI18 小时前
GitHub Trending 本周 Top 10
github
AlexMaybeBot19 小时前
巧用 OpenClaw 为 Android 开发电脑瘦身
android·github·ai编程
阿福聊编程1 天前
GitHub Trending · 分类汇总(2026-05-11
github
逛逛GitHub1 天前
盘点 10 个刚刚开源,但 Star 攀升很快的 GitHub 项目。
github
习惯就好zz1 天前
在 Qt Creator 19.0.0 中配置 GitHub Copilot 的完整记录
qt·github·copilot
研究点啥好呢1 天前
Muses | 搭建属于你自己的AI生图网站
前端·人工智能·ai·github
没脾气的打火叽_1 天前
Codex 明明支持 Subagent,为什么却不会主动用?我做了个 Skill 来解决这个问题
github