levelDB之二:整体架构

        LevelDb本质上是一套存储系统以及在这套存储系统上提供的一些操作接口为了便于理解整个系统及其处理流程我们可以从两个不同的角度来看待LevleDb静态角度和动态角度从静态角度可以假想整个系统正在运行过程中不断插入删除读取数据),此时我们给LevelDb照相从照片可以看到之前系统的数据在内存和磁盘中是如何分布的处于什么状态等从动态的角度主要是了解系统是如何写入一条记录读出一条记录删除一条记录的同时也包括除了这些接口操作外的内部操作比如compaction系统运行时崩溃后如何恢复系统等等方面

        本节所讲的整体架构主要从静态角度来描述之后接下来的几节内容会详述静态结构涉及到的文件或者内存数据结构LevelDb日知录后半部分主要介绍动态视角下的LevelDb就是说整个系统是怎么运转起来的

        LevelDb作为存储系统数据记录的存储介质包括内存以及磁盘文件如果像上面说的LevelDb运行了一段时间此时我们给LevelDb进行透视拍照那么您会看到如下一番景象


LevelDb结构

        从图中可以看出构成LevelDb静态结构的包括六个主要部分内存中的MemTableImmutable MemTable以及磁盘上的几种主要文件Current文件Manifest文件log文件以及SSTable文件当然LevelDb除了这六个主要部分还有一些辅助的文件但是以上六个文件和数据结构是LevelDb的主体构成元素

        LevelDbLog文件和MemtableBigtable论文中介绍的是一致的当应用写入一条Key:Value记录的时候LevelDb会先往log文件里写入成功后将记录插进Memtable这样基本就算完成了写入操作因为一次写入操作只涉及一次磁盘顺序写和一次内存写入所以这是为何说LevelDb写入速度极快的主要原因

        Log文件在系统中的作用主要是用于系统崩溃恢复而不丢失数据假如没有Log文件因为写入的记录刚开始是保存在内存中的此时如果系统崩溃内存中的数据还没有来得及Dump到磁盘所以会丢失数据Redis就存在这个问题)。为了避免这种情况LevelDb在写入内存前先将操作记录到Log文件中然后再记入内存中这样即使系统崩溃也可以从Log文件中恢复内存中的Memtable不会造成数据的丢失

       当Memtable插入的数据占用内存到了一个界限后需要将内存的记录导出到外存文件中LevleDb会生成新的Log文件和Memtable原先的Memtable就成为Immutable Memtable顾名思义就是说这个Memtable的内容是不可更改的只能读不能写入或者删除新到来的数据被记入新的Log文件和MemtableLevelDb后台调度会将Immutable Memtable的数据导出到磁盘形成一个新的SSTable文件SSTable就是由内存中的数据不断导出并进行Compaction操作后形成的而且SSTable的所有文件是一种层级结构第一层为Level 0第二层为Level 1依次类推层级逐渐增高这也是为何称之为LevelDb的原因

       SSTable中的文件是Key有序的就是说在文件中小key记录排在大Key记录之前各个LevelSSTable都是如此但是这里需要注意的一点是Level 0SSTable文件后缀为.sst和其它Level的文件相比有特殊性这个层级内的.sst文件两个文件可能存在key重叠比如有两个level 0sst文件文件A和文件B文件Akey范围是{bar, car}文件BKey范围是{blue,samecity}那么很可能两个文件都存在key=”blood”的记录对于其它LevelSSTable文件来说则不会出现同一层级内.sst文件的key重叠现象就是说Level L中任意两个.sst文件那么可以保证它们的key值是不会重叠的这点需要特别注意后面您会看到很多操作的差异都是由于这个原因造成的

        SSTable中的某个文件属于特定层级而且其存储的记录是key有序的那么必然有文件中的最小key和最大key这是非常重要的信息LevelDb应该记下这些信息Manifest就是干这个的它记载了SSTable各个文件的管理信息比如属于哪个Level文件名称叫啥最小key和最大key各自是多少下图是Manifest所存储内容的示意


Manifest存储示意图

        图中只显示了两个文件manifest会记载所有SSTable文件的这些信息),Level 0test.sst1test.sst2文件同时记载了这些文件各自对应的key范围比如test.sstt1key范围是an” banana”而文件test.sst2key范围是baby”samecity”可以看出两者的key范围是有重叠的

        Current文件是干什么的呢这个文件的内容只有一个信息就是记载当前的manifest文件名因为在LevleDb的运行过程中随着Compaction的进行SSTable文件会发生变化会有新的文件产生老的文件被废弃Manifest也会跟着反映这种变化此时往往会新生成Manifest文件来记载这种变化Current则用来指出哪个Manifest文件才是我们关心的那个Manifest文件

        以上介绍的内容就构成了LevelDb的整体静态结构LevelDb日知录接下来的内容中我们会首先介绍重要文件或者内存数据的具体数据布局与结构

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值