Reducing Write Amplification of LSM-Tree with Block-Grained Compaction
LSM-tree作为一种写优化的存储引擎,广泛应用于LevelDB和RocksDB等键值存储系统中。然而,传统的LSM-tree上的合并操作需要读取、合并和写入许多sstable,本文称之为表合并。表合并会导致两个主要问题,即写放大和块缓存失效。它们会降低lsm树的写和读性能。为了解决这些问题,我们提出了一种新的合并方案——块合并方案,该方案采用块粒度的合并策略来执行LSM-tree上的合并操作。块合并(Block Compaction)通过确定数据块的边界,尽量避免数据块的重复使用,既减少了写放大,又缓解了块缓存失效问题。通过代价分析,从理论上证明了块合并比表合并更高效。
此外,我们还分析了块合并的副作用,并提出了3种优化方法:(1)选择性合并,通过将表合并与块合并相结合来减少块合并带来的空间放大;(2)并行合并将合并任务划分为多个子任务,使用多个worker并行完成子任务。(3)延迟删除减少了在合并操作的末尾遍历文件所带来的开销。我们基于块合并及其优化实现了一个名为BlockDB的新的键值存储。然后,我们使用YCSB基准将BlockDB与LevelDB、RocksDB和L2SM进行比较。实验结果表明,BlockDB与同类算法相比,最高可降低32%的写放大,最高可降低43.6%的运行时间。此外,它还能保持点查找和范围扫描的高性能。
方法:
本文提出了一种新的合并方法,称为块合并(Block