土法炼钢兴趣小组的算法知识备份

【RocksDB 内核机制】选型与存储栈阅读地图

文章导航

分类入口
databasestoragearchitecture
标签入口
#rocksdb#innodb#columnar#lakehouse#engine-selection#storage-triangle#lsm-tree#htap#tikv#reading-map

目录

本系列前 17 篇从 LevelDB 基线 追到 生产嵌入,从 WAL / MemTable 追到 LOG 排查。读者此时需要的不是又一篇 LSM 教程,而是 不带营销排名的收束我的负载该落在 B-Tree、列存 scan、嵌入式 LSM 还是湖仓文件层?读完存储栈还缺哪几块?

本文是「RocksDB 内核机制」系列 第 18 篇(末篇)

  1. 选型决策树:写密集 KV、OLTP 行存、OLAP scan、湖仓批读四条路径。
  2. 能力对照表:优化方向、事务、Compaction 运维、嵌入生态——不给假 benchmark
  3. 存储 + 数据平台阅读地图:闭合 postgresql-kernelcolumnar-enginelakehousestream-processingquery-engine/18 的依赖与接口。

环境说明:对照表依据各项目 2026 年官方文档(A 级)与本系列前文机制;吞吐排名不在此篇出现。HTAP / TiKV Raft 全文标注为 db-frontier/12 续作,不冒充已发布系列结论。


一、存储引擎三角:闭合点

第 1 篇 LSM 生态 把存储引擎粗分为三角:行存 B-Tree OLTP列存 scan写优化 LSM。RocksDB 占据第三角——不是替代 PG 或 ClickHouse,而是 负载分工

flowchart TB
  subgraph triangle["Storage Engine Triangle"]
    PG["Row OLTP<br/>PostgreSQL / InnoDB"]
    COL["Columnar Scan<br/>MergeTree / DuckDB"]
    LSM["Write-Optimized LSM<br/>RocksDB / LevelDB"]
  end
  PG --- COL
  COL --- LSM
  LSM --- PG
代表 前台写 前台读 后台账单
行存 B-Tree PostgreSQLInnoDB 随机页写 + WAL 索引 + 缓冲池 vacuum / purge、页分裂
列存 columnar-engine 批量 part 追加 向量化 scan merge / compaction part
LSM 本系列 RocksDB 顺序 WAL + MemTable 层级 Get / scan Compaction 写放大storage/31

本系列闭合点:读者应能解释 TiKV / Flink 为何选 LSM(第 16 篇),以及 L0 stall 如何从 LOG 钉到根因(第 17 篇)。


二、选型决策树

flowchart TD
  START["Storage need"]
  START --> Q1{"Need SQL + ACID<br/>multi-row transactions?"}
  Q1 -->|yes| Q2{"Primary access<br/>point/range on indexed keys?"}
  Q2 -->|yes| PG["PostgreSQL / InnoDB<br/>B-Tree row store"]
  Q2 -->|no| Q3{"Analytics scan<br/>dominates?"}
  Q3 -->|yes| HTAP["HTAP split or lakehouse<br/>see Section 6"]
  Q1 -->|no| Q4{"Embedded KV / stream state<br/>write-heavy?"}
  Q4 -->|yes| LSM["RocksDB embedded<br/>Flink / TiKV / KStreams"]
  Q4 -->|no| Q5{"Open files on object store<br/>batch analytics?"}
  Q5 -->|yes| LAKE["Lakehouse tables<br/>Parquet + Iceberg/Delta"]
  Q5 -->|no| Q6{"Single-node embedded<br/>analytics?"}
  Q6 -->|yes| DDB["DuckDB / embedded OLAP"]
  Q6 -->|no| QE["Distributed query engine<br/>query-engine series"]

2.1 路径说明

路径 首选 依据
OLTP 事务 + 索引点查 PostgreSQL / InnoDB B-Tree 页缓存、MVCC、成熟 SQL(postgresql-kernel
写密集嵌入 KV RocksDB 顺序写、多 CF、Checkpoint(本系列第 4–15 篇)
Serving 层 OLAP QPS ClickHouse 等 MergeTree 主路径(columnar-engine
湖上批读 + 交互查 Iceberg/Delta + Trino/Spark lakehouse + query-engine/18
无界流 + 大状态 Flink + RocksDB stream/12–13 + 本系列 16–17
分布式强一致 KV TiKV(RocksDB 本地引擎) 本系列为 单 Region LSM 预修;Raft 见 db-frontier

常见组合:PostgreSQL OLTP + Kafka/Flink 入湖 + Trino 查湖 + ClickHouse Serving;TiKV 在线 KV + TiFlash 列存副本(HTAP,见第六节)。

2.2 何时 选 RocksDB

2.3 何时 考虑 RocksDB


三、RocksDB vs InnoDB vs 列存 vs 湖仓

口径:单机或嵌入层存储语义,非分布式集群全貌;无吞吐排名

维度 RocksDB (LSM) InnoDB (B-Tree) 列存 (MergeTree 等) 湖仓 (Iceberg/Delta)
优化方向 读写均衡 OLTP 读 scan 批读 + 开放格式
数据单元 SST + WAL 页 (16KB) + redo/undo Part / column chunk Parquet/ORC 文件
点查 MemTable→L0…Ln 二级索引 + BP 弱(主键/稀疏索引) 依赖 stats / manifest 裁剪
范围 scan Iterator(读放大) 索引范围 向量化列扫 文件清单 + 列裁剪
更新 Put 覆盖 + tombstone 原地/undo 异步 merge Copy-on-write 新文件
事务 可选 TransactionDB 完整 ACID 视引擎 表级快照 / 乐观并发
后台作业 Compaction purge、页整理 merge part compaction、expire snapshots
空间放大 高(未 merge tombstone) 中(碎片、版本) 低(压缩) 中(小文件、快照)
典型嵌入 Flink、TiKV、KStreams MySQL ClickHouse、DuckDB 列存 Spark/Flink 写、Trino 读
本仓库系列 本系列 18 篇 mysql-innodb columnar-engine lakehouse

读放大 / 写放大:LSM 与 B-Tree、列存的公式推导不在此重复——分别见 storage/31postgresql-kernel 缓冲池篇、columnar-engine merge 篇。


四、学术文献地图:选型不是排行榜

第三节对照表回答 工程能力;本节回答 论文坐标:每类存储在顶会里通常讨论什么、与 RocksDB 嵌入场景如何衔接。完整读法见 db-frontier/02 顶会阅读路线

4.1 存储三角的论文锚点

奠基 / 代表文献 会议·年份 选型时该带走什么
行存 B-Tree OLTP Bayer & McCreight, B-Tree;Graefe, B-Tree 综述 1972;多篇 随机页写 + 缓冲池 是 OLTP 默认;MVCC 与 vacuum 是后台账单(postgresql-kernel
列存 scan MonetDB/X100;Abadi et al., C-Store VLDB 2005;TODS 2008 向量化 + 列压缩 换 scan;更新走 merge 而非原地改(columnar-engine
写优化 LSM O’Neil et al., LSM-Tree Acta Informatica 1996 顺序写 + 后台归并\(WA\)/\(RA\) 是设计旋钮(第 1 篇 §二)
Compaction 策略 Dayan & Idreos, Merge Bush / Dostoevsky SIGMOD 2017–2018 Leveled vs Tiering 无 universally optimal第 10–11 篇
放大不可能三角 Data et al., RUM Conjecture SIGMOD 2016 读 / 更新 / 内存(空间)三选二;与 \(WA\)/\(RA\)/\(SA\) 直觉同构
Stall 与并发 compaction Sears & Ramanan, bLSM SIGMOD 2012 Stall 是 背压;多核 compaction 减 stall 时长——RocksDB 实现以源码为准(第 11 篇

争论边界(有文献、无口号)

4.2 HTAP 与「第四角」:行列双维护

HTAP 不是三角的第四引擎,而是 在 OLTP 行存之上叠 OLAP 读路径 的系统问题。代表性 A 级文献:

路线 代表论文 / 系统 新鲜度档位 与本系列接口
Raft Learner 列存副本 Huang et al., TiDB: A Raft-based HTAP Database VLDB 2020;准实时快照 TiKV Region 内 RocksDB → TiFlash Learner(db-frontier/12 §二
行列一体存储 SingleStore Universal Storage;SAP HANA 系 事务提交即可见(同一引擎) 不经过 RocksDB;对照 为何 OLTP 仍多选 B-Tree/LSM 行存
CDC + 湖仓 OLAP Delta/Iceberg 可更新性讨论 秒级~分钟级 lakehouse + query-engine/18
基准方法 CH-benCHmark;HATtrick 混合负载怎么测;不给出吞吐排名(db-frontier/12 §五)

未决争论双引擎 HTAP(TiKV + TiFlash)与 统一 LSM 扛 OLAP scan 谁更省运维?工业界按新鲜度档位与 DDL 能力选型;顶会无「RocksDB 应替代列存」一类结论

4.3 工程间隙:论文假设 vs 嵌入生产

论文 / 教程常见设定 Flink / TiKV / MyRocks 现实
单机、长时间 steady-state checkpoint 突发、Region 迁移、云盘 IOPS 顶
均匀随机 key KeyGroup 倾斜、热点 Region
单 CF、忽略 tail 多 CF、barrier 对齐 + JVM GC + stall 叠加
忽略 disaggregation Remote compaction、WAL 与 SST 分介质(db-frontier/14

本系列 1–17 篇单进程 RocksDB 语义;端到端 SLA 须叠加上层调度与分布式协议,不能从 LSM 论文实验直接外推。

4.4 开放问题(选型后的续读入口)

  1. 自适应 compaction: workload 漂移时 leveled ↔︎ universal 能否 无 DBA 切换且 tail 可控?研究线与 RocksDB AutoTune 实验并存;生产默认仍靠阈值 + 人工 POC(storage/32)。
  2. LSM 能否承担 HTAP 列扫:TiFlash 选择 独立列存副本 而非在 RocksDB SST 上做向量化 scan——是否最优仍开放;读 db-frontier/12 时对照 隔离方式 × 新鲜度 两轴。
  3. Disaggregated LSM:NVMe-oF / CXL 下 compactions 是否应远程执行?NSDI/OSDI 存储分离论文与 RocksDB 产品功能 版本不同步,以 release note 为准。
  4. ForSt / 替代嵌入后端:Flink 社区在评估 ForSt 等 LSM 变体;与 RocksDB 的 checkpoint 文件布局 兼容性决定迁移成本——属产品演进,非本系列已发布结论。

五、存储栈 + 数据平台阅读地图

flowchart LR
  PG["postgresql-kernel<br/>B-Tree OLTP"]
  INN["mysql-innodb<br/>InnoDB"]
  COL["columnar-engine<br/>OLAP scan"]
  LSM["rocksdb<br/>本系列"]
  LAKE["lakehouse<br/>表格式"]
  STREAM["stream-processing<br/>Flink/Kafka"]
  QE["query-engine<br/>Trino/Spark"]
  DF["db-frontier<br/>HTAP"]
  PG --> COL
  INN -.->|行存对照| PG
  COL --> LAKE
  LSM --> STREAM
  STREAM --> LAKE
  LAKE --> QE
  LSM -.->|TiKV Region| DF
  PG --> DF
  COL --> DF

5.1 推荐阅读顺序(按目标)

目标 路径
存储三角闭合 postgresql-kernel indexcolumnar indexrocksdb 01 → 04 → 07 → 10 → 13 → 18
从 DIY LSM 来 lsm-tree 五篇rocksdb 02–06 → 10–11 → 17
Flink 运维 stream/12–13rocksdb 05–06、11–12、16–17
数据平台全栈 PG → columnar → lakehouse → stream → query-engine/18
调参实操 rocksdb 10–12、17 + storage/31–32(本系列不重复参数表)

5.2 与 query-engine/18 的接口

query-engine 系列第 18 篇 收束 Trino / Spark / ClickHouse / DuckDB查询层 选型。与本系列的分工:

问题 query-engine/18 本系列 rocksdb/18
交互式 SQL 联邦 Trino vs Spark 不覆盖
谁扫 Iceberg manifest Coordinator planning 不覆盖
流状态落哪 指向 Flink + RocksDB RocksDB 文件语义
OLTP 点查 指向 PostgreSQL 指向 B-Tree 角
写优化嵌入 KV 一句带过 全文 1–17 篇

闭合句:lakehouse 公式 Lakehouse = 列式文件 + 对象存储 + 表格式 + catalog + 查询引擎 中,文件与表 由 lakehouse/stream 覆盖;查询规划 由 query-engine 覆盖;进程内写优化 KV本系列 覆盖。读完两系列 18 篇,应能说明:Flink 状态 bytes 如何变成 SST(本系列 16),以及 Trino 如何对 Iceberg 发起 split(query-engine 15)。

5.3 与 postgresql-kernel 的对照阅读

机制 PostgreSQL RocksDB
持久化日志 WAL (XLog) WAL .log第 4 篇
内存结构 shared buffer MemTable + Block Cache
版本 MVCC xmin/xmax sequence number(第 7 篇
后台整理 vacuum / freeze Compaction(第 10–12 篇)
快照 Snapshot isolation Snapshot + SuperVersion

PostgreSQL 不会 用 leveled compaction 换写吞吐;RocksDB 不会 提供 SQL planner——选型在 工作负载,不在「哪个更先进」。


六、HTAP / TiKV 续作入口

分布式 HTAP(同一份数据 OLTP + OLAP)在 db-frontier/12 HTAP 讨论:TiDB + TiFlash 行列双副本、SingleStore Universal Storage、Lakehouse 可更新性等。Huang et al. (VLDB 2020) 把 Raft Learner + 列存副本 作为准实时 HTAP 的代表架构——与本系列 单 Region RocksDB 的关系见 §4.2

与本系列关系:

话题 本系列已覆盖 续作(db-frontier / 未来 TiKV 专题)
Region 内 RocksDB LSM 第 1、13–14、16–17 篇 Raft log、Percolator、coprocessor
行存 vs 列存 vs LSM 三角 第 18 篇决策树 TiFlash Learner、新鲜度档位
Flink 状态 第 16 篇 Changelog v2、ForSt
基准与 POC 方法 不展开 CH-benCHmark、HATtrick(db-frontier/12)

TiKV 读者路径:本系列 01 → 13 → 16 → 17 → 18 建立单 Region LSM 心智 → db-frontier/12Raft + 列存副本 如何叠在 RocksDB 之上。


七、本系列核心结论收束

  1. RocksDB = LevelDB 骨架 + 多线程 flush/compaction + CF + RateLimiter + 丰富 utilities第 2–3 篇)。
  2. 写路径:WAL → MemTable → Flush → SST → MANIFEST(第 4–6 篇);读路径:SuperVersion → MergeIterator → Block Cache / Bloom(第 7–9 篇)。
  3. Compaction 驱动写 stall 与三种放大(第 10–12 篇);Column Family 共享 WAL、隔离 LSM(第 13 篇)。
  4. Checkpoint / Ingest 服务备份与 bulk load(第 15 篇);Flink 增量 checkpoint 是 Checkpoint + 不可变 SST 的嵌入特例(第 16 篇)。
  5. 生产稳定性GetProperty、LOG、Statistics 与磁盘容量规划(第 17 篇、storage/76)。
  6. 选型 按负载分工嵌入存储三角,对照 §4 论文坐标 与决策树;不与 InnoDB / 列存 / 湖仓做 fictitious 排名(本篇)。

八、开放边界(不承诺)


九、小结

存储引擎没有「万能内核」。RocksDB 适合 写密集、嵌入、可运维 compaction 的场景;InnoDB / PostgreSQL 适合 SQL 事务 OLTP;列存适合 scan 聚合;湖仓适合 开放格式 + 批处理 + 多引擎读。论文侧 Leveled/Tiering、RUM、HTAP 双副本 提供争论坐标,不替代 本机 POC。

数据平台栈在 query-engine/18 闭合 查询层;本系列闭合 写优化 LSM 层

继续深入:数据库索引全部系列索引db-frontier HTAP


上一篇经典故障与排查

下一篇系列目录

返回 系列目录 · PostgreSQL 内核 · query-engine/18


参考资料

  1. O’Neil et al., The Log-Structured Merge-Tree, Acta Informatica 1996(LSM 奠基;A 级)。
  2. Dayan & Idreos, The Log-Structured Merge-Bush / Dostoevsky, SIGMOD 2017–2018(compaction 策略;A 级)。
  3. Data et al., RUM Conjecture, SIGMOD 2016(放大三角;A 级)。
  4. Sears & Ramanan, bLSM, SIGMOD 2012(stall / 多核 compaction;A 级)。
  5. Huang et al., TiDB: A Raft-based HTAP Database, VLDB 2020(HTAP 行列副本;A 级)。
  6. RocksDB Wiki, Overview / Architecture(A 级)。
  7. PostgreSQL、MySQL/InnoDB、ClickHouse、Apache Iceberg 官方文档(2026 stable;A 级)。
  8. query-engine 第 18 篇(数据平台查询层收束)。
  9. db-frontier/02 阅读路线db-frontier/12 HTAP(顶会方法与 HTAP 基准;B 级前瞻接口)。
  10. 本系列 index第 1 篇 §二学术谱系。
  11. storage/31–32lsm-tree DIY(放大与 DIY 对照)。

同主题继续阅读

把当前热点继续串成多页阅读,而不是停在单篇消费。

2026-04-22 · db / storage

数据库内核实验索引

汇总本站数据库内核文章:PostgreSQL / MySQL InnoDB / 列存引擎 / 数据湖与开放表格式 / 流式数据处理 / 分布式 OLAP 查询引擎 / RocksDB 内核,以及 LSM-Tree 从零实现实验。


By .