Compaction是所有LSM-Tree存储引擎必要的操作,Compaction会持续性地将当前的数据库中的SST文件按照一定规则进行合并,来回收一些无效的数据空间(例如对同一个key的多次更新操作,只需要保留最近的一次结果即可);同时compaction操作对于读性能也有一定的提升,尤其是在LSM-Tree的布局采用tiering的数据放置策略时,一个读操作可能需要在多个sorted run中进行查找,导致较高的读放大;此时compaction会将多个sorted run合并为一个,减少额外的写操作。Compaction也是LSM-Tree中影响性能的一个重要因素,因此有许多针对Compaction的优化策略。这里我们只着眼于LevelDB的compaction实现,因为它足够简单直接。

数据库元数据VersionSet

在正式介绍LevelDB的Compaction流程之前,有必要先介绍一下整个DB与元数据管理相关的数据结构VersionSet。 无论是进行Compaction还是对Level0的SST进行刷盘,这些操作都涉及到文件的创建和删除。VersionSet的作用就是记录这些元数据信息并保证持久化。