大数据存储Log-Structured Merge Tree
LSM 树 是什么?
只追加不原地改,靠后台合并把多个文件整理成有序大文件
类比:快递驿站的包裹先堆着,晚上统一按楼栋上架整理
核心思想
把随机写变成顺序写:所有写入先追加到日志和内存,攒够了一批就顺序写成一个新的有序文件。查询时同时查内存和多个文件,取最新的版本。
代价是读放大(要查多个文件)和写放大(合并时要重写数据),用后台 compaction 慢慢摊平。
和 B+ 树的区别
B+ 树(MySQL)是原地更新,读快写慢,页分裂会带来随机 IO;LSM 树是追加写,写快读慢,适合写多读少。这就是为什么 HBase、RocksDB、Cassandra 都用 LSM。
compaction 的两难
不做 compaction,文件越来越多,读越来越慢;做得太激进,后台 IO 抢占资源,写入延迟抖动。所以 HBase 有 major / minor compaction 之分,ClickHouse 也有类似的 part 合并策略——本质是同一个权衡。