📘 教案 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
算法 → 数据结构 → 系统设计