每天学一个算法--LSM-Tree(Log-Structured Merge Tree)

📘 教案 24:LSM-Tree(Log-Structured Merge Tree · 工程级)


一、问题模型(为什么需要 LSM-Tree)

设有一个存储系统,需要支持:

  • 高吞吐写入(write-heavy)
  • 大规模数据(磁盘存储)
  • 可接受的读取性能

传统结构(B-Tree)的核心问题:

写入会导致随机 I/O(频繁磁盘修改)


核心矛盾

text 复制代码
写入:希望顺序写(快)
读取:希望随机查(快)

👉 LSM-Tree 的目标:

用"顺序写 + 延迟整理"来优化写性能


二、核心思想(必须精确理解)


所有写入先进入内存,再批量写入磁盘;

磁盘数据通过"分层 + 合并"逐步整理。


结构组成


1️⃣ 内存层(MemTable)

  • 有序结构(通常:跳表 / 红黑树)
  • 所有写入先进入这里

2️⃣ 磁盘层(SSTable)

  • 不可修改(immutable)
  • 按 key 排序
  • 一旦写入,不再更新

三、写入流程(精确步骤)


Step 1:写入 MemTable

text 复制代码
put(key, value)
→ 插入内存结构

Step 2:MemTable 满

text 复制代码
flush → 写入磁盘

生成一个:

text 复制代码
SSTable(有序文件)

Step 3:多层结构形成

text 复制代码
Level 0
Level 1
Level 2 ...

四、读取流程(关键)


查找顺序:

text 复制代码
1. MemTable
2. Level 0(多个文件)
3. Level 1
4. Level 2 ...

👉 每一层都需要查


五、问题:读会变慢


因为:

text 复制代码
数据分散在多个文件中

六、解决方案1:Bloom Filter(你刚学过的)


每个 SSTable 配一个 Bloom Filter:

text 复制代码
判断:key 是否可能存在

👉 大幅减少磁盘查找次数


七、核心机制:Compaction(合并)


为什么需要合并?

否则:

text 复制代码
SSTable 越来越多 → 查询变慢

Compaction 做什么?

text 复制代码
多个有序文件 → 合并 → 新文件

👉 本质就是:

外部排序 + 多路归并(你刚学的)


八、两种 Compaction 策略(重点)


1️⃣ Leveling(分层式)


特点:

  • 每层数据量指数增长
  • 每层 key 范围不重叠

优点:

  • 查询快

缺点:

  • 写放大高(频繁重写数据)


2️⃣ Tiering(分组式)


特点:

  • 每层允许多个重叠文件
  • 到一定数量再合并

优点:

  • 写入更快

缺点:

  • 查询慢

九、核心指标(必须掌握)


1️⃣ 写放大(Write Amplification)


text 复制代码
一个数据被写多少次

  • Leveling:高
  • Tiering:低

2️⃣ 读放大(Read Amplification)


text 复制代码
查询需要读多少文件

  • Leveling:低
  • Tiering:高

3️⃣ 空间放大(Space Amplification)


text 复制代码
重复数据占用空间


十、删除操作(重要)


LSM-Tree 不直接删除:

text 复制代码
写入一个"删除标记"(Tombstone)

在 Compaction 时:

👉 真正删除


十一、整体结构示意


text 复制代码
MemTable
   ↓ flush
Level 0(多个文件)
   ↓ compaction
Level 1(更大)
   ↓
Level 2 ...

十二、与前面算法的关系(体系串联)


组件 来源算法
SSTable 排序
Compaction 外部排序
Bloom Filter 概率结构
查询 二分查找

👉 你之前学的东西全用上了


十三、真实系统应用


1️⃣ LevelDB(Google)


2️⃣ RocksDB(Facebook)


3️⃣ Cassandra(分布式数据库)


4️⃣ HBase(大数据)


十四、本质总结(严肃表达)


LSM-Tree 通过将写操作缓存在内存中并顺序写入磁盘,同时利用多层有序文件与归并机制,将随机写转化为顺序写,从而在大规模数据场景下显著提升写入性能,其代价是通过增加读放大与写放大在查询与维护成本之间进行权衡。


🔥 这一节的真正意义

你现在已经不只是"学算法",而是在理解:

text 复制代码
算法 → 数据结构 → 系统设计
相关推荐
好想像大佬一样能够ak所有6 小时前
Leetcode35.搜索插入位置
数据结构·算法·leetcode
aqiu1111117 小时前
【C++算法打怪专栏】LeetCode 165. 比较版本号(双指针与字符串流法)
c++·算法·leetcode
黄金龙PLUS7 小时前
如何基于置换算法来设计对称加密算法
算法·网络安全·密码学·哈希算法·同态加密
不会就选b7 小时前
算法日常・每日刷题--<动态规划>14
算法
赛博守夜人7 小时前
跨境业务与出海合规之九:海外买量投放与营销虚假流量(Ad Fraud):跨国机房群控与归因欺诈识别算法
算法·安全
Joy T7 小时前
Spring AI 接入已有 Java 项目的三种架构设计
java·人工智能·springai·ai入门·chatclient·ai service·ai能力接入
杨运交7 小时前
[076][核心模块]构建优雅的Java异常处理框架:从错误码到全局异常处理
java·开发语言
caoerzhong8 小时前
仓库数字化成熟度分级:JeeWMS 开源 Java 仓库管理系统如何支撑从可见到自治的四级跃迁
java·开源
MayBaymax8 小时前
RocketMQ 存储机制
java·rocketmq
程序猿_极客8 小时前
【免费】分享一套优质的基于SpringBoot的服装商城管理系统的设计与实现(带可视化图表、协同过滤功能),源码+文档+视频详解(讲解)
java·spring boot·后端·服装商城管理系统