LevelDb日知录之八:Compaction操作

来源:互联网 发布:甬温动车事故 知乎 编辑:程序博客网 时间:2024/06/09 17:15

        前文有述对于LevelDb来说写入记录操作很简单删除记录仅仅写入一个删除标记就算完事但是读取记录比较复杂需要在内存以及各个层级文件中依照新鲜程度依次查找代价很高为了加快读取速度levelDb采取了compaction的方式来对已有的记录进行整理压缩通过这种方式来删除掉一些不再有效的KV数据减小数据规模减少文件数量等

        levelDbcompaction机制和过程与Bigtable所讲述的是基本一致的Bigtable中讲到三种类型的compaction:minormajorfull所谓minor Compaction就是把memtable中的数据导出到SSTable文件中major compaction就是合并不同层级的SSTable文件fullcompaction就是将所有SSTable进行合并LevelDb包含其中两种minormajor我们将为大家详细叙述其机理

        先来看看minorCompaction的过程Minorcompaction 的目的是当内存中的memtable大小到了一定值时将内容保存到磁盘文件中1是其机理示意图

 

minorcompaction

        从1可以看出memtable数量到了一定程度会转换为immutablememtable此时不能往其中写入记录只能从中读取KV内容之前介绍过immutable memtable其实是一个多层级队列SkipList其中的记录是根据key有序排列的所以这个minorcompaction实现起来也很简单就是按照immutablememtable中记录由小到大遍历并依次写入一个level0 的新建SSTable文件中写完后建立文件的index 数据这样就完成了一次minor compaction从图中也可以看出对于被删除的记录minorcompaction过程中并不真正删除这个记录原因也很简单这里只知道要删掉key记录但是这个KV数据在哪里?那需要复杂的查找所以在minorcompaction的时候并不做删除只是将这个key作为一个记录写入文件中至于真正的删除操作在以后更高层级的compaction中会去做

        当某个level下的SSTable文件数目超过一定设置值后levelDb会从这个levelSSTable中选择一个文件level>0),将其和高一层级的level+1SSTable文件合并这就是majorcompaction

        我们知道在大于0的层级中每个SSTable文件内的Key都是由小到大有序存储的而且不同文件之间的key范围文件内最小key和最大key之间不会有任何重叠Level 0SSTable文件有些特殊尽管每个文件也是根据Key由小到大排列但是因为level 0的文件是通过minorcompaction直接生成的所以任意两个level0下的两个sstable文件可能再key范围上有重叠所以在做majorcompaction的时候对于大于level0的层级选择其中一个文件就行但是对于level 0来说指定某个文件后level中很可能有其他SSTable文件的key范围和这个文件有重叠这种情况下要找出所有有重叠的文件和level1的文件进行合并level0在进行文件选择的时候可能会有多个文件参与majorcompaction

        levelDb在选定某个level进行compaction还要选择是具体哪个文件要进行compactionlevelDb在这里有个小技巧 就是说轮流来比如这次是文件A进行compaction那么下次就是在key range上紧挨着文件A的文件B进行compaction这样每个文件都会有机会轮流和高层的level 文件进行合并

如果选好了levelL的文件Alevel L+1层的文件进行合并那么问题又来了应该选择level L+1哪些文件进行合并levelDb选择L+1层中和文件Akeyrange上有重叠的所有文件来和文件A进行合并

        也就是说选定了level L的文件A,之后在levelL+1中找到了所有需要合并的文件B,C,D…..等等剩下的问题就是具体是如何进行major 合并的就是说给定了一系列文件每个文件内部是key有序的如何对这些文件进行合并使得新生成的文件仍然Key有序同时抛掉哪些不再有价值的KV 数据2说明了这一过程


SSTableCompaction

        Major compaction的过程如下对多个文件采用多路归并排序的方式依次找出其中最小的Key记录也就是对多个文件中的所有记录重新进行排序之后采取一定的标准判断这个Key是否还需要保存如果判断没有保存价值那么直接抛掉如果觉得还需要继续保存那么就将其写入level L+1层中新生成的一个SSTable文件中就这样对KV数据一一处理形成了一系列新的L+1层数据文件之前的L层文件和L+1层参与compaction 的文件数据此时已经没有意义了所以全部删除这样就完成了L层和L+1层文件记录的合并过程

        那么在major compaction过程中判断一个KV记录是否抛弃的标准是什么呢其中一个标准是:对于某个key来说如果在小于L层中存在这个Key那么这个KVmajorcompaction过程中可以抛掉因为我们前面分析过对于层级低于L的文件中如果存在同一Key的记录那么说明对于Key来说有更新鲜的Value存在那么过去的Value就等于没有意义了所以可以删除

 备注:本文转载自朗格科技:http://www.samecity.com/blog/Article.asp?ItemID=129

 

 

 

 

 

 

 

 

原创粉丝点击