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 compaction)。与许多key-value存储如LevelDB和RocksDB采用的传统的SSTable-grained compaction(在本文中我们称之为表合并)不同,块合并只读取合并操作涉及的数据块,而不是读取整个SSTable。此外,它只是将数据块添加到sstable中,而不是回写整个sstable。因此,通过采用块粒度的合并单元,块合并可以显著减少写放大。此外,通过块合并,许多数据块不需要重新构建,这意味着块缓存中的大多数块在块合并后仍然有效。因此,块合并可以缓解LSM-tree合并导致的块缓存失效问题。