LSMT 存储引擎浅析 | 青训营笔记
这是我参与「第四届青训营 」笔记创作活动的的第16天
LSMT 的历史
- LSMT 是 Log-Structured Merge-Tree 的缩写,由Partrick O 'Neil etc. 在1996年的论文,The Log-Structured Merge-Tree (LSM-Tree),提出。
- 相比较而言, B-Tree 出现就早很多,在1970年由 Bayer,R.;McCreight,E.提出。
- 早期的数据库系统一般都采用 B-Tree 家族作为索引,例如 MySQL。2000年后诞生的数据库大多采用LSMT 索引。
LSMT 与 B+Tree 的异同
经典 B+Tree 写入流程
-
在 B+Tree 中,数据插入是原地更新的,装有 (10, 20, 30, 40) 的节点在插入和分裂后,原节点覆写成 (10, 15)。此外,B+Tree 在发生不平衡或者节点容量到达阈值后,必须立即进行分裂来平衡。
-
反观 LSMT,数据的插入是追加的(Append-only),当树不平衡或者垃圾过多时,有专门 Compact 线程进行 Compact,可以称之为延迟(Lazy)的。
-
所以从高层次的数据结构角度来看,B+Tree 和 LSMT 并没有本质的不同,可以统一到一个模型里,根据 Workload 的不同互相转换。
为什么要采用LSMT模型
- 在计算机存储乃至整个工程界都在利用 Indirection 处理资源的不对称性
- 存储引擎面对的资源不对称性在不同时期是不同的
HDD 时代
- 顺序与随机操作性能不对称
- 由于机械硬盘需要磁盘选择和机械臂移动来进行读写,顺序写吞吐是随机的25倍
SSD 时代
- 顺序写与随机写性能不对称
- 由于SSD随机写会给主控带来GC压力,顺序写吞吐是随机写的6倍 这二者的共性是顺序写是一个对设备很友好的操作,LSMT 符合这一点,而 B-Tree 依赖原地更新,导致随机写。
LSMT 存储引擎的优势
- 相对于 B+Tree 的优势
- 顺序写模型对于 SSD 设备更友好
- SST 不可修改的特性使得其能使用更加紧凑的数据排列和加上压缩
- 后台延迟 Compact 能更好利用 CPU 多核处理能力,降低前台请求延迟
- 相对于 HashTable 的优势
LSMT 存储引擎是有序索引抽象,HashTable 是无序索引抽象。无序索引是有序索引的真子集。LSMT 相比于 HashTable 更加通用。HashTable 能处理点查请求,LSMT 也能,但 LSMT 能处理 TopK 请求,但 HashTable 就不行了。为了避免维护多套存储引擎,绝大多数数据库都直接采用一套有序的存储引擎而非针对点查和顺序读取分别维护两个引擎。
All problems in computer science can be solved by another level of indirection
---- From Butler Lampson