LevelDb之四:SSTable文件

        SSTableBigtable中至关重要的一块对于LevelDb来说也是如此LevelDbSSTable实现细节的了解也有助于了解Bigtable中一些实现细节本节内容主要讲述SSTable的静态布局结构我们曾在LevelDb之二整体架构中说过SSTable文件形成了不同Level的层级结构至于这个层级结构是如何形成的我们放在后面Compaction一节细说本节主要介绍SSTable某个文件的物理布局和逻辑布局结构这对了解LevelDb的运行过程很有帮助

        LevelDb不同层级有很多SSTable文件以后缀.sst为特征),所有.sst文件内部布局都是一样的上节介绍Log文件是物理分块的SSTable也一样会将文件划分为固定大小的物理存储块但是两者逻辑布局大不相同根本原因是Log文件中的记录是Key无序的即先后记录的key大小没有明确大小关系.sst文件内部则是根据记录的Key由小到大排列的从下面介绍的SSTable布局可以体会到Key有序是为何如此设计.sst文件结构的关键


1 .sst文件的分块结构

        图1展示了一个.sst文件的物理划分结构Log文件一样也是划分为固定大小的存储块每个Block分为三个部分红色部分是数据存储区 蓝色的Type区用于标识数据存储区是否采用了数据压缩算法Snappy压缩或者无压缩两种),CRC部分则是数据校验码用于判别数据是否在生成和传输中出错

        以上是.sst的物理布局下面介绍.sst文件的逻辑布局所谓逻辑布局就是说尽管大家都是物理块但是每一块存储什么内容内部又有什么结构等4.2展示了.sst文件的内部逻辑解释


逻辑布局

  从图2可以看出从大的方面可以将.sst文件划分为数据存储区和数据管理区数据存储区存放实际的Key:Value数据数据管理区则提供一些索引指针等管理数据目的是更快速便捷的查找相应的记录两个区域都是在上述的分块基础上的就是说文件的前面若干块实际存储KV数据后面数据管理区存储管理数据管理数据又分为四种不同类型紫色的Meta Block红色的MetaBlock 索引和蓝色的数据索引块以及一个文件尾部块LevelDb 1.2版对于Meta Block尚无实际使用只是保留了一个接口估计会在后续版本中加入内容下面我们看看数据索引区和文件尾部Footer的内部结构


数据索引

  图3是数据索引的内部结构示意图再次强调一下Data Block内的KV记录是按照Key由小到大排列的数据索引区的每条记录是对某个Data Block建立的索引信息每条索引信息包含三个内容以图4.3所示的数据块i的索引Index i来说红色部分的第一个字段记载大于等于数据块i中最大的Key值的那个Key第二个字段指出数据块i.sst文件中的起始位置第三个字段指出Data Block i的大小有时候是有数据压缩的)。后面两个字段好理解是用于定位数据块在文件中的位置的第一个字段需要详细解释一下在索引里保存的这个Key值未必一定是某条记录的Key,以图4.3的例子来说假设数据块的最小Key=“samecity”最大Key=“the best”;数据块i+1的最小Key=“the fox”,最大Key=“zoo”,那么对于数据块i的索引Index i来说其第一个字段记载大于等于数据块i的最大Key(“the best”)同时要小于数据块i+1的最小Key(“the fox”)所以例子中Index i的第一个字段是the c”这个是满足要求的Index i+1的第一个字段则是zoo”即数据块i+1的最大Key

        文件末尾Footer块的内部结构见图4metaindex_handle指出了metaindex block的起始位置和大小inex_handle指出了index Block的起始地址和大小这两个字段可以理解为索引的索引是为了正确读出索引值而设立的后面跟着一个填充区和魔数


Footer

        上面主要介绍的是数据管理区的内部结构下面我们看看数据区的一个Block的数据部分内部是如何布局的1中的红色部分),5是其内部布局示意图


数据Block内部结构

  从图中可以看出其内部也分为两个部分前面是一个个KV记录其顺序是根据Key值由小到大排列的Block尾部则是一些重启点Restart Point,其实是一些指针指出Block内容中的一些记录位置

        “重启点是干什么的呢我们一再强调Block内容里的KV记录是按照Key大小有序的这样的话相邻的两条记录很可能Key部分存在重叠比如key i=“the Car”Key i+1=“the color”,那么两者存在重叠部分the c”为了减少Key的存储量Key i+1可以只存储和上一条Key不同的部分olor”两者的共同部分从Key i中可以获得记录的KeyBlock内容部分就是这么存储的主要目的是减少存储开销重启点的意思是在这条记录开始不再采取只记载不同的Key部分而是重新记录所有的Key假设Key i+1是一个重启点那么Key里面会完整存储the color”而不是采用简略的olor”方式Block尾部就是指出哪些记录是这些重启点的


记录格式

  在Block内容区每个KV记录的内部结构是怎样的6给出了其详细结构每个记录包含5个字段key共享长度比如上面的olor”记录 key和上一条记录共享的Key部分长度是the c”的长度5key非共享长度对于olor”来说4value长度指出Key:ValueValue的长度在后面的Value内容字段中存储实际的Valuekey非共享内容则实际存储olor”这个Key字符串

  上面讲的这些就是.sst文件的全部内部奥秘

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

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值