LSM Compaction
LogAppend简化了写入路径, 带来了高吞吐低延时的写. 相同Key的数据持续累积, 读放大逐渐变得严重, 空间也慢慢膨胀. Compaction用来合并LSM持续写入的多个数据版本, 提升读的性能, 降低空间浪费.
Compaction合并多个文件到一个文件, 把不再使用的数据丢弃. 在存储水位较高时, Compaction需要把相当一部分的有效数据读写一遍, 存在较多的IO操作. 但这个过程也可引入EC转换, 压缩, 重删, 进一步降低存储成本.
Compaction之后会进行CompactedData Import和OriginalData Delete, 这可能导致Cache失效.
1 Amplification
1.1 Write Amplification
In PebblesDB paper:
- RocksDB: x42;
- HyperLevelDB: x40;
- LevelDB: x27;
- PebblesDB: x17;
- UserData: 45GB;
Analysis of HDFS Under HBase: A Facebook Messages Case Study.
1.2 Read Amplification
1.3 Space Amplification
2 Compaction
2.1 目标
控制写放大, 读放大, 空间放大;
2.2 约束
- 控制Compaction资源占用;
- 前端IO的保障;
2.3 策略
- Size-Tired Compaction;
- Leveled Compaction;
- Time-based Compaction;
- Time-window Compaction;
3 Operations
3.1 Put
- Manifest;
- Version;
- Compress;
- LruCache;
- BloomFilter;
- Optional WAL ?
3.2 Get
3.3 GetRange
3.4 Delete
4 Tired
大小接近的文件, 存在N份. 数据范围有层叠. 总量到一定数量时, 合并生成下一级;