揭秘大厂数据库基石: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 变化。你会对“参数调优”有全新的认识。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1163747.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

COOH-TK-Glucose-COOH,羧基-酮缩硫醇键-葡萄糖-羧基,化学特性与反应机制

COOH-TK-Glucose-COOH,羧基-酮缩硫醇键-葡萄糖-羧基,化学特性与反应机制COOH–TK–Glucose–COOH 是一种功能化小分子,其结构由以下组成部分构成:羧基(–COOH):分子两端的羧基为活性位点&#x…

COOH-TK-Amino-COOH,羧基-酮缩硫醇键-氨基-羧基,化学反应特性

COOH-TK-Amino-COOH,羧基-酮缩硫醇键-氨基-羧基,化学反应特性COOH–TK–Amino–COOH 是一种功能化小分子,结合了 羧基、酮缩硫醇键(TK)以及氨基-羧基(Amino–COOH) 的结构特性。其分子可表示为&…

JAVA如何实现文件夹结构的大文件上传示例?

大文件传输系统解决方案设计与实现 一、项目背景与需求分析 作为河南XX软件公司的Java高级工程师,近期负责公司核心项目的大文件传输模块重构工作。原百度WebUploader方案在20G文件传输、跨浏览器兼容性、断点续传稳定性等方面存在严重缺陷,尤其在IE8和…

新手进阶Python:给办公看板加自动备份+异常监控,数据安全不翻车

大家好!我是CSDN的Python新手博主~ 上一篇我们给云端看板集成了AI智能分析功能,大幅提升了数据处理效率,但很多小伙伴反馈两个核心痛点:① 服务器上的Excel报表、用户配置文件一旦丢失(比如服务器故障、误删…

医院电子病历怎样导入PDF中的医学公式至XHEDITOR?

企业网站Word粘贴与导入功能解决方案 作为山西IT行业的PHP工程师,我最近正在评估如何为企业网站后台管理系统集成Word粘贴和文档导入功能。以下是针对这一需求的详细技术分析方案。 需求分析 客户需要实现两个核心功能: Word粘贴功能:从W…

外泌体介导的IFN-α抗HBV效应传递机制研究

摘要 干扰素α在乙型肝炎病毒治疗中发挥核心作用,但其作用机制尚未完全阐明。复旦大学袁正宏团队最新研究发现,巨噬细胞来源的外泌体可通过模拟病毒入侵的分子机制,将IFN-α诱导的抗病毒效应传递至HBV感染的肝细胞内。该过程涉及TIM-1受体介…

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

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

EchoEar喵伴智能AI开发套件的技术核心与应用展望

EchoEar喵伴智能AI开发套件是乐鑫科技与火山引擎扣子大模型团队联合打造的典型产品。其核心智能与交互能力的实现,高度依赖于所搭载的ESP32-S3-WROOM-1-N16R16VA模组。这款模组不仅是设备的运算中枢,更是其实现端侧AI、全双工语音交互等先进特性的硬件基…

石油化工车间的“通讯救星”:耐达讯自动化Profibus总线光纤中继器有多实用?

在石油化工车间里,现场变送器和中控系统的通讯简直是“生命线”——压力、温度数据传不准,轻则影响产品质量,重则可能引发安全事故。但老车间的通讯问题真的让人头大:要么是不同品牌的变送器和中控系统“语言不通”,得…

ppo价值函数是用当前图像提取的特征来计算的吗

价值函数是否用“当前图像提取的特征”来计算? 简短回答: ✅ 是的,在基于视觉输入(如图像)的深度强化学习中,价值函数通常是通过从当前图像中提取的特征来计算的。但这不是“必须”的——它取决于状态表示的…

教育信息化如何实现Word公式粘贴到XHEDITOR在线作业?

山西PHP程序员的逆袭之路:用代码搞钱,用QQ群发家! 各位老铁们好!我是老张,一个在山西太原窝着写PHP的"码农"。最近接了个CMS企业官网的外包项目,客户提出了个"变态"需求:要…

LeetCode 2943.最大化网格图中正方形空洞的面积:小小思维

【LetMeFly】2943.最大化网格图中正方形空洞的面积:小小思维 力扣题目链接:https://leetcode.cn/problems/maximize-area-of-square-hole-in-grid/ 给你一个网格图,由 n 2 条 横线段 和 m 2 条 竖线段 组成,一开始所有区域均为…

别让通讯拖后腿!耐达讯自动化Profibus总线光纤中继器,助力焊接精度“一臂之力”

汽车焊装车间的工程师们,是不是常被这几个问题搞得头大?机械臂焊接精度忽高忽低、不同品牌设备“鸡同鸭讲”、改造成本高还耽误生产……这些通讯痛点,今天咱们就用耐达讯自动化的Profibus总线光纤中继器来解决!电缆VS光纤&#xf…

吐血推荐10个AI论文写作软件,自考毕业论文轻松搞定!

吐血推荐10个AI论文写作软件,自考毕业论文轻松搞定! 自考论文写作的救星:AI工具如何帮你轻松应对挑战 在自考论文写作过程中,许多学生常常面临时间紧张、思路混乱、格式不规范等问题。而随着AI技术的不断进步,越来越多…

如何在C++中使用Redis的事务功能?

一、Redis 事务核心原理(C 视角)Redis 事务通过 MULTI(开启事务)→ 执行多个命令(入队)→ EXEC(提交事务)/DISCARD(取消事务)完成,hiredis 库中需…

医疗数据用Apache Beam实时流处理稳预警

📝 博客主页:jaxzheng的CSDN主页 实时医疗预警:Apache Beam驱动的流处理架构与稳健性革命目录实时医疗预警:Apache Beam驱动的流处理架构与稳健性革命 引言:医疗数据实时化浪潮中的关键瓶颈 一、技术应用场景&#xff…

C++ 中解锁 Redis

一、核心前提:选择 Redis C 客户端库C 本身没有内置 Redis 客户端,主流选择是hiredis(官方推荐的 C 语言客户端,轻量、稳定,C 可直接调用),也是最基础、最常用的库。1. 环境安装(以 …

互联网大厂Java求职面试实录:Spring Boot、微服务与AI技术全解析

互联网大厂Java求职面试实录:Spring Boot、微服务与AI技术全解析 本文通过互联网大厂Java求职者谢飞机与严肃面试官的三轮面试对话,涵盖Java核心技术栈、微服务、数据库、消息队列及AI应用场景,结合电商及智能客服业务,逐步深入&a…

网络安全入门教程(非常详细)从零基础入门到精通,看完这一篇你就是网络安全高手了。

关于我 我算是“入行”不久的一个新人安全工作者,为什么是引号呢,因为我是个“半个野路子”出身。早在13年的时候,我在初中时期就已经在90sec、wooyun等社区一直学习、报告漏洞。后来由于升学的压力,我逐渐淡出了安全圈子&#x…

Windows Server SMB 共享文件 回收站

1. 项目简介 ShareRecycleBin 是一个专为 Windows Server (特别是 SMB 共享环境) 设计的增量回收站服务。它通过硬链接 (Hard Link) 技术实现对文件的“即时备份”,并能在文件被删除时将其移动到指定的回收站目录,同时保留原始的目录结构和权限锁定。 …