1. LSM-Tree 的读写放大中写放大与读放大相互制约,compaction 策略(size-tiered/leveled)如何取舍?
LSM-Tree 的读写放大为什么相互制约?compaction 策略(size-tiered 与 leveled)如何取舍?
- 写放大:compaction 反复重写数据;读放大:多层查找的 I/O 次数
- size-tiered:合并大文件少、写放大低但读放大高(需合并查询)
- leveled:分层合并读放大低(O(L) 层)但写放大高(约 10-30 倍)
LSM-Tree 通过"内存 memtable + 多层 SSTable + 后台 compaction"实现顺序写,代价是两种放大:写放大(同一数据被 compaction 重写的次数)与读放大(一次查询需检查的 SSTable/块数)。二者天然制约:减少 compaction(如 size-tiered:按大小把相似 SSTable 合并成更大文件)会降低写放大,但每层文件多、查询需合并多个文件,读放大上升;增加 compaction 频率/分层(如 leveled:每层大小按 L 倍增长、与下一层交叉合并)使每层文件数受控(每层约 L 个),读放大降为 O(内存层 + L × 层数),但数据被反复下推重写,写放大升到约 L/(L-1) × 层数(典型 10-30 倍)。取舍规则:写密集(日志、时序)选 size-tiered 或更激进的内存缓冲;读密集(在线服务)选 leveled(RocksDB 默认 L = 10);两者也可混合(RocksDB 的 universal/leveled 切换、Cassandra 的 STCS/LCS)。
本题考察存储引擎的"放大三角"权衡:写放大、读放大与空间放大三者互相制约。回答时先定义两种放大,再对比两种 compaction 的机制与数值特征,最后给出按负载选型的建议。