log_writer.h/block_builder.h/filter_block.h分析

一、log_writer.h分析

功能:可以将随机写的IO变成Append,极大提高了写磁盘速度;可以防止数据丢失

日志文件的名称由6位数字编号和log后缀组成  xx.log

日志文件格式:

 header放在buf中:crc(4字节)、length(2字节)、RecordType(1字节)

函数功能:

  • EmitPhysicalRecord():每次完成一个fragment的写入到物理磁盘(header\data)
  • AddRecord():把一个slice写入到文件中,把要写入的记录进行分片,分为多个fragment,并加入了crc校验
    • 写入的过程主要根据:当前block剩余的数量、本身slice的长度、头部的长度这三者之间的关系写入的。根据写入块的分布,得出type的值。最后是调用EmitPhysicalRecord()函数写入的。

二、block_builder.h分析

SST文件由5个区块组成,其中三个区块由blockbuilder(存储的key都是有序的)构建。blockbuilder接收一组key-value,并将其序列到buffer中

  • 为了节约空间,leveldb存储键值对时会利用局部性原理将省略掉键与上一个键的共同前缀部分,按一定形式存储键值对
  • 节省了空间但无法方便的进行二分查找,解快方法: 每隔K=16个键值对设定一个复活点.复活点上将完整存储键,不进行前缀共享,block的结尾存储所有复活点的位置

函数:

  • Add():插入当前key,新加入的key>已加入的任何一个

  

  • Finish():把restarts_的每个元素编码序列到buffer_中,并最后写入重启点的数量。Finish()被调用后block即完成了全部的序列化工作了,buffer最终的结构如下:

  

 三、fliter_block.h分析

filter_block为SST中的一个区块,有多个filter组成,每个data_block对应一个filter

leveldb在进入data_block查找前会检查filter,如果filter判断不在,那么一定不在

函数功能:

  • Addkey():把key保存到key_列表中
  • startBlock():根据block_offset创建filter。默认每2k block_offset就创建一个filter

 举个例子:

  

 

posted @ 2022-03-01 11:09  Z9Y1J5  阅读(37)  评论(0编辑  收藏  举报