Yanyg - Software Engineer

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份. 数据范围有层叠. 总量到一定数量时, 合并生成下一级;

5 Products

5.1 LevelDB

5.2 RocksDB

5.3 HBase

5.4 PebblesDB

5.5 Dostoevsky

5.6 Youchao(Alibaba)

5.7 Lethe

5.8 Redis

5.9 Memcached

5.10 InfluxDB

5.11 KeyDB

5.12 SkyTable

5.13 Dragonfly

6 References