leveldb进行Compaction对文件进行合并和层级下沉,原因有如下几个:
- 记录一经写入不会修改,对同一个key的多次操作会产生多条记录,占用了额外空间需要清理
- 合并倾向于把不活跃key沉降到下层level,上层level活跃度高,利用局部性原理减少IO开销
leveldb会进行2种Compaction
minor compaction
将immutable memtable刷到磁盘。内存中的memtable有大小限制,一方面内存是有限的,另一方面过大的memtable会导致过大的LOG文件,从LOG文件中恢复内存状态慢。
major compaction
这种compaction的输入全部为磁盘文件,合并level n和level n+1的若干文件,新产生文件到level n+1。细分为如下三种
- size compaction:某个level的总文件大小超过一定值触发
- seek compaction:某个文件访问次数超过一定限制触发,优先级比size compaction低,即同时有size compaction需要处理时,优先执行size compaction
- manual compaction:手动触发,指定某个level的一定key范围内的文件和下一层进行compaction,在leveldb中只用于单测,一般业务不应该调用此接口
major compaction效果如图,是一个多路归并排序的过程