levelDB之三:log文件

        上节内容讲到log文件在LevelDb中的主要作用是系统故障恢复时能够保证不会丢失数据因为在将记录写入内存的Memtable之前会先写入Log文件这样即使系统发生故障Memtable中的数据没有来得及Dump到磁盘的SSTable文件LevelDB也可以根据log文件恢复内存的Memtable数据结构内容不会造成系统丢失数据在这点上LevelDbBigtable是一致的

        下面我们带大家看看log文件的具体物理和逻辑布局是怎样的LevelDb对于一个log文件会把它切割成以32K为单位的物理Block每次读取的单位以一个Block作为基本读取单位下图展示的log文件由3Block构成所以从物理布局来讲一个log文件就是由连续的32K大小Block构成的

levelDB之三:log文件_第1张图片

log文件布局

        在应用的视野里是看不到这些Block应用看到的是一系列的Key:ValueLevelDb内部会将一个Key:Value对看做一条记录的数据另外在这个数据前增加一个记录头用来记载一些管理信息以方便内部处理3.2显示了一个记录在LevelDb内部是如何表示的


记录结构

        记录头包含三个字段ChechSum是对类型数据字段的校验码为了避免处理不完整或者是被破坏的数据LevelDb读取记录数据时候会对数据进行校验如果发现和存储的CheckSum相同说明数据完整无破坏可以继续后续流程记录长度记载了数据的大小数据则是上面讲的Key:Value数值对类型字段则指出了每条记录的逻辑结构和log文件物理分块结构之间的关系具体而言主要有以下四种类型FULL/FIRST/MIDDLE/LAST

         如果记录类型是FULL代表了当前记录内容完整地存储在一个物理Block没有被不同的物理Block切割开如果记录被相邻的物理Block切割开则类型会是其他三种类型中的一种我们以图3.1所示的例子来具体说明

        假设目前存在三条记录Record ARecord BRecordC其中Record A大小为10KRecordB 大小为80KRecord C大小为12K那么其在log文件中的逻辑布局会如图3.1所示Record A是图中蓝色区域所示因为大小为10K<32K能够放在一个物理Block所以其类型为FULLRecord B 大小为80KBlock1因为放入了Record A所以还剩下22K不足以放下Record B所以在Block1的剩余部分放入Record B的开头一部分类型标识为FIRST代表了是一个记录的起始部分RecordB还有58K没有存储这些只能依次放在后续的物理Block里面因为Block 2大小只有32K仍然放不下Record B的剩余部分所以Block 2全部用来放RecordB且标识类型为MIDDLE意思是这是Record B中间一段数据Record B剩下的部分可以完全放在Block3类型标识为LAST代表了这是Record B的末尾数据图中黄色的Record C因为大小为12KBlock 3剩下的空间足以全部放下它所以其类型标识为FULL

       从这个小例子可以看出逻辑记录和物理Block之间的关系LevelDb一次物理读取为一个Block然后根据类型情况拼接出逻辑记录供后续流程处理

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



 

你可能感兴趣的:(levelDB之三:log文件)