news 2026/6/12 2:45:58

揭秘大厂数据库基石:RocksDB 读写原理与 LSM-Tree 架构深度图解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
揭秘大厂数据库基石:RocksDB 读写原理与 LSM-Tree 架构深度图解

标签:#RocksDB #Database #LSM-Tree #Architecture #Backend #Interview


📉 前言:B+ 树跌落神坛?

在传统机械硬盘时代,MySQL 的 InnoDB 选择了B+ 树。它对非常友好,但面对海量并发写入时,随机 I/O 会导致磁盘磁头疯狂跳动,性能急剧下降。

而在 SSD 普及和云原生时代,RocksDB选择了LSM-Tree (Log-Structured Merge Tree)
它的核心哲学是:利用磁盘的顺序写性能,放弃部分读性能。
简单说:不管你是插入、修改还是删除,我全部视为“追加写入日志”。


🏗️ 一、 核心架构:内存与磁盘的接力赛

RocksDB 的架构可以看作是数据从“内存”流向“磁盘”的多级瀑布。

组件全景图 (Mermaid):

磁盘 (SST Files)

内存 (Memory)

1. 写入
2. 写入
3. 满了 (Freeze)
4. Flush (转储)
5. Compaction (合并)

Compaction

Write Ahead Log (WAL)

MemTable (活跃)

Immutable MemTable (只读)

Immutable MemTable (只读)

Level 0 (无序, Key重叠)

Level 1 (有序, 无重叠)

Level 2 (有序, 无重叠)

Level N ...

客户端

  1. MemTable: 内存中的数据结构(通常是SkipList 跳表),支持高性能的并发写入。
  2. Immutable MemTable: 当 MemTable 写满后,会变成“只读”状态,等待后台线程刷盘。
  3. WAL (Write Ahead Log): 为了防止断电数据丢失,写入内存前先顺序追加写日志。
  4. SSTable (Sorted String Table): 磁盘上的数据文件,内部 Key 是有序的。

🚀 二、 写路径 (Write Path):速度的极致

RocksDB 的写操作是出了名的快,因为它把所有的随机写都变成了顺序写

写入流程:

  1. 写 WAL:追加日志,磁盘顺序写,极快。
  2. 写 MemTable:插入内存跳表,,极快。
  3. 结束:告诉客户端“写完了”。

注意:这里没有磁盘随机 I/O!哪怕是DELETE操作,在 RocksDB 眼里也是写入一条类型为Tombstone(墓碑) 的标记数据。真正的数据删除发生在后续的 Compaction 阶段。


🐢 三、 读路径 (Read Path):为了速度还的债

由于数据分层存储,读操作可能需要像“翻箱倒柜”一样查找数据。

读取流程 (Mermaid):

磁盘查找 (最耗时)

命中

未命中

命中

未命中

BloomFilter过滤

未命中

二分查找

读请求 Key=A

查 Active MemTable

Return

查 Immutable MemTables

查 Level 0 SSTs

读 L0 文件 (可能重叠)

查 Level 1 SSTs

查 Level 2 ...

性能瓶颈:

  • L0 层最慢:L0 层的文件是直接由内存 Flush 下来的,里面的 Key 范围是互相重叠的。如果我有 4 个 L0 文件,我可能需要把这 4 个文件全读一遍才能确定 Key 是否存在。
  • L1+ 层较快:L1 及更底层的 Key 是全局有序且不重叠的,可以通过二分查找快速定位。

优化神器:Bloom Filter (布隆过滤器)
为了避免无效的磁盘 I/O,RocksDB 为每个 SSTable 配备了布隆过滤器。它能以极快的速度告诉你:“这个 Key 绝对不在这个文件里”,从而跳过大量不必要的读取。


🧹 四、 Compaction (压缩):整理房间的艺术

随着数据越写越多,L0 层文件会堆积,读取性能会下降。这时需要Compaction

Leveled Compaction (分层压缩) 机制:

  1. L0 -> L1:当 L0 文件数量达到阈值(如 4 个),触发合并。系统会把 L0 的文件和 L1 中有重叠的文件读出来,进行归并排序,生成新的 L1 文件。
  2. L1 -> L2:当 L1 大小达到阈值(如 256MB),会选出一个文件,和 L2 中重叠的文件合并。
  3. 墓碑清理:在这个过程中,如果你写入了DELETE标记,旧数据和标记会在合并时“同归于尽”,真正释放磁盘空间。

写放大 (Write Amplification)
这就是 LSM-Tree 的代价。一条数据虽然写入时很快,但在生命周期中,可能会被 Compaction 机制反复读取、合并、写入磁盘多达几十次。这也是 RocksDB 调优的核心痛点。


🎯 总结:面试必问知识点

  1. 为什么 RocksDB 写得快?
  • 利用 WAL 顺序写 + 内存 SkipList,无随机 I/O。
  1. 为什么 RocksDB 读得慢?怎么优化?
  • 需要多层查找。
  • 优化:使用Bloom Filter减少磁盘访问;使用Block Cache缓存热点数据。
  1. Level 0 和 Level 1 的区别?
  • L0:Key 范围重叠(读慢),由 MemTable 直接 Flush 而来。
  • L1+:Key 全局有序且不重叠(读快),由 Compaction 归并而来。

Next Step:
下载RocksJava依赖,在你的 Spring Boot 项目中集成 RocksDB。尝试调整write_buffer_size(MemTable 大小) 和max_background_compactions参数,观察写入 100 万条数据时的 IOPS 变化。你会对“参数调优”有全新的认识。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/10 16:47:00

使用JAVA http请求实现超大附件上传的示例教程?

《Java老哥的100元奇迹》 各位同行好啊!我是一名来自甘肃的Java老程序员,最近接了个"史诗级"外包项目——预算高达100元人民币!这价格连兰州牛肉面都吃不了几碗,但客户要的功能怕是马化腾来了都得摇头… 一、需求分析…

作者头像 李华
网站建设 2026/6/4 17:32:24

【好写作AI】别慌!“AI痕迹”检测,到底在检测什么?

好写作AI官方网址:https://www.haoxiezuo.cn/一、新的焦虑正在蔓延:你的论文,有“AI味”吗? 提交论文前,除了查重,你是不是开始多了一个动作——把文段丢进各种“AI检测器”,紧张地等待结果&…

作者头像 李华
网站建设 2026/6/10 4:00:34

制造工厂研发人员需要实现5个SolidWorks共享一台服务器如何实现

在制造工厂中,当5名SolidWorks研发人员需要共享一台服务器时,合理的配置和优化能够显著提升协作效率和数据安全性。此方案核心在于集中化资源管理、动态化资源分配、智能化权限管控,结合高性能硬件配置与协同设计功能,可显著提升资…

作者头像 李华
网站建设 2026/6/6 5:33:44

数据不会说话?虎贲等考 AI 数据分析:让论文实证硬核到惊艳导师

还在对着一堆问卷数据、实验结果抓耳挠腮?用 SPSS 半天跑不出一个相关性分析,用 Excel 画的图表被批 “小学生水平”?辛苦收集的数据,最后只能用干巴巴的文字描述,论文实证部分毫无说服力? 在论文写作的实…

作者头像 李华
网站建设 2026/6/10 18:32:37

打破“数据孤岛”,实现全厂设备一站式可视化管理

核心痛点:在传统的制造工厂中,不同品牌、不同型号的PLC(西门子、三菱、欧姆龙等)控制着生产线上的各类设备。这些设备数据相互隔绝,形成一个个“数据孤岛”。管理者无法实时掌握设备运行状态、工艺参数、故障信息&…

作者头像 李华