再学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模块:Minor CompactionMajor Compaction文件选取执行流程垃圾回收
LevelDB 源码剖析Compaction模块:Minor CompactionMajor Compaction文件选取执行流程垃圾回收