作家
登录

庖丁解LevelDB之整体感知

作者: 来源: 2017-12-20 09:53:08 阅读 我要评论

  •   WriteBatchInternal::SetSequence(updates, last_sequence + 1); 
  •   last_sequence += WriteBatchInternal::Count(updates); 
  •    
  •   // 将当前的WriteBatch内容写入Binlog以及Memtable 
  •   ...... 
  •  
  •   versions_->SetLastSequence(last_sequence); 
    • 在MakeRoomForWrite中为当前的写入预备Memtable空间:Level0层有过多的文件时,会延缓或挂起当前写操作;Memtable已经写满则测验测验切换到Immutable Memtable,生成新的Memtable供写入,并触发后台的Immutable Memtable向Level0 SST文件的Dump。Immutable Memtable Dump不及时也会挂起当前写操作。
    • BuildBatchGroup中会测验测验将当前等待的所有其他Writer中的写入归并到当前的WriteBatch中,以进步写入效力。
    • 之后将WriteBatch中内容写入Binlog并轮回写入Memtable。
    • 存眷上述代码的最后一行,在所有的值写入完成后才将Sequence真正更新,而LevelDB的读请求又是基于Sequence的。如许就包管了在WriteBatch写入过程中,不会被读请求部分看到,大年夜而供给了原子性。

    2,读流程

    • 起首,生成内部萌芽所用的Key,该Key是由用户请求的UserKey拼接上Sequence生成的。个中Sequence可以用户供给或应用当缁ゎ新的Sequence,LevelDB可以包管仅萌芽在这个Sequence之前的写入。
    • 用生成的Key,依次测验测验大年夜 Memtable,Immtable以及SST文件中攫取,直到找到。
    • 大年夜SST文件中查找须要依次测验测验在每一层中攫取,得益于Manifest中记录的每个文件的key区间,我们可以很便利的知道某个key是否在文件中。Level0的文件因为直接由Immutable Dump 产生,弗成避免的会互相重叠,所以须要对每个文件依次查找。对于其他层次,因为归并过程包管了其互相不重叠且有序,二分查找的方法供给了更好的萌芽效力。
    • 可以看出同一个Key涌如今上层的操作会樊篱基层的。也是以删除Key时只须要在Memtable压入一条标记为删除的条目即可。被其樊篱的所有条目会在之后的归并过程中清除。

    紧缩操作

    1,CompactMemTable

    CompactMemTable会将Immutable中的数据整体Dump为Level 0的一个文件,这个过程会在Immutable Memtable存在时被Compaction后台线程调剂。过程比较简单,起首会获得一个Immutable的Iterator用来遍历个中的所有内容,创建一个新的Level 0 SST文件,并将Iterator读出的内容依次次序写入该文件。之后更新元信息并删除Immutable Memtable。

    2,BackgroundCompaction

    SST文件的Compaction可以由用户经由过程接口手动提议,也可以主动触发。LevelDB中触发SST Compaction的身分包含Level 0 SST的个数,其他Level SST文件的总大年夜小,某个文件被拜访的次数。Compaction线程一次Compact的过程如下:

    • 起首根据触发Compaction的原因以及保护的相干信息找到本次要Compact的一个SST文件。对于Level0的文件比较特别,因为Level0的SST文件由Memtable在不应时光Dump而成,所以可能有Key重叠。是以除该文件外还须要获得所有与之重叠的Level0文件。这时我们获得一个包含一个或多个文件的文件集合,处于同一Level。
    • SetupOtherInputs: 在Level+1层获取所有与当前的文件集合有Key重呵9依υ?件。
    • DoCompactionWork:对获得的包含相邻两层多个文件的文件集合,进行归并操作并将结不雅输出到Level + 1层的一个新的SST文件,归并的过程中删除所有过时的数据。
    • 删除之前的文件集合里的所有文件。经由过程上述过程我们可以看到,这个新生成的文件在其地点Level不会跟任何文件有Key的重叠。

    总结

    经由过程对LevelDB设计思路,整体构造以及其工作过程的介绍。信赖已经对LevelDB有一个整体的印象。接下来还将用几篇博客,更深刻的介绍LevelDB的数据治理,版本控制,迭代器,缓存等方面的设计和实现。

    作为KV数据存储引擎,根本的读写操作是必弗成少的,经由过程对读写操作流程的懂得,也能让我们更直不雅的窥测其内部实现。




      推荐阅读

      Firefox 将跟进把 HTTP 传输的网站全部列为不安全

    相干链接 【限时免费】岁尾最强一次云计算大年夜会,看传统、社区、互联网企业若何碰撞? Google 在 HTTPS 的推动上可谓下足了工夫,客岁9月就曾宣布将慢慢下调 Chrome 浏览器对 HTTP 网站的>>>详细阅读


    本文标题:庖丁解LevelDB之整体感知

    地址:http://www.17bianji.com/lsqh/39969.html

    关键词: 探索发现

    乐购科技部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与乐购科技进行文章共享合作。

    网友点评
    自媒体专栏

    评论

    热度

    精彩导读
    栏目ID=71的表不存在(操作类型=0)