再学LevelDB Compaction

Posted Shi Peng

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了再学LevelDB Compaction相关的知识,希望对你有一定的参考价值。

一、LevelDB的写入过程

当向LevelDB写入数据时,分下面几步:

Step1:Memtable --> Immutable Memtable

Memtable:内存SkipList
过程:从可读可写的Memtable变为可读不可写的Memtable
当memtable存储量达到某阈值时,会从Memtable转成Immutable Memtable,并创建新的MemTable用于接收写入请求。

Step2:Compaction

Compaction可手动触发,在满足某个条件时也会系统自动触发。
Compaction的过程,分两种:

Step2.1:Minor Compaction

将内存中ImmuTable MemTable dump到磁盘上sst文件的过程,称为Minor Compaction。
Minor Compaction,大部分数据会写入Level0,但不一定都写入Level 0。
Immutable Memtable会在后台线程中导出数据,flush到磁盘上,形成一个新的sstable文件。

Minor Compaction的过程如下:

在策略上,尽量要将新的compact的文件推到高level。

因为在level 0 需要控制文件过多,compaction IO和查找都比较耗费。

另一方面也不能推至过高level,一定程度上控制查找的次数,而且若某些范围的key更新比较频繁,后续往高层compaction IO消耗也很大。

所以PickLevelForMemTableOutput就是个权衡折中。如果新生成的sstable和Level 0的sstable有交叠,新产生的sstable就直接加入level 0,否则根据一定的策略,向上推到Level1 甚至是Level 2,但是最高推到Level2。

minor compaction主要做两件事情:
1)构造sstable文件
2)新的sstable文件写入哪一层。

Minor Compaction的触发条件:
1)imm_ != NULL 表示需要将Memtable dump成SSTable,发起Minor Compaction。
2)manual_compaction_ != NULL 表示手动发起Compaction。

Step2.2:Major Compaction

当某个Level层级的文件数量超过一定阈值后,会从这个Level的sstable文件将其和高一层级的level+1的sstable文件进行compaction成为新的level+1层的文件。

Major Compaction的触发条件:

触发条件1:文件数目太多或者某一层级文件总大小过大。

1)Level0文件个数太多
2)或某一层文件总大小太大。超过限制值。

触发条件2:seek次数太多

除了level 0以外,任何一个level的文件内部是有序的,文件之间也是有序的。
但是level(n)和level(n+1)中的两个文件的key可能存在交叉重叠。这样在查找某个key时,经常去level(n) 查找无功而返,而不得不去level(n+1)查找(这个过程可想象SkipList的查找过程),这说明该层级的文件和上一级的文件,key的范围重叠的很严重,这是不合理的,会导致效率的下降。因此,需要对该level 发起一次major compaction,减少 level 和level + 1的重叠情况。

对于seek触发的compaction, 哪个文件无效seek的次数到了阈值,那个文件就是level n的参与compaction的文件。

而size 触发的compaction复杂一点,它需要考虑上一次compaction做到了哪个key,什么地方,然后大于该key的第一个文件即为level n的参与compaction的文件。

由于level0的特殊性,所以major compaction要分分为两种:

第一种:Level0 --> Level1

1)选择一个level0文件。
2)再找到一个和该level0有重复key的level1文件。
3)再查找出所有和这个level1文件有重复key的level0文件。
4)将所有level0文件和level1文件合并成一个新的level1文件。

第二种:Level N --> Level N +1

1)选择一个 Level N的文件
2)查找所有和该文件由重复key的Level N +1的文件。
3)compaction,生成新的Level N + 1的文件。

以上是关于再学LevelDB Compaction的主要内容,如果未能解决你的问题,请参考以下文章

再学LevelDB Compaction

LevelDB的源码阅读 Compaction操作

[leveldb] Compaction

Leveldb数据Compaction源码分析

LevelDB 源码剖析Compaction模块:Minor CompactionMajor Compaction文件选取执行流程垃圾回收

LevelDB 源码剖析Compaction模块:Minor CompactionMajor Compaction文件选取执行流程垃圾回收