KeyValue存储层文件结构的设计

Time: 三月 10, 2012
Category: storage

主要参考了一下HFile存储格式的设计,也可以说完全是HFile的一个简约版。我去除了一些目前暂时可能用不上的结构,毕竟HFile作为HBase数据库底层存储的文件结构,融合了过多的通用特性,比如Meta,另外我还做了一下稍微的修改,比如trailer块中的某些字段。

数据文件主要由四部分组成,连续的Data Block,一块File Info,一块的Index Block,最后是 Trailer 块

 

Data Block 数据块

DATA_BLOCK_MAGIC 主要的作用是数据校验,避免数据损坏带来的意外情况。Block中所有的数据其实整个数据文件的keyvalue都是有序的。Block的大小可以自定义,主要是针对IO性能和解析的粒度。

File Info 数据块

File Info Block 主要记录了整个数据文件的一些基本信息。ItemsNum表示File Info Block里记录的数量,AVG_KEY_LEN 表示平均的 key 长度,其他同理,LASTKET保存了整个数据文件的最后一个Key,方便进行key的检索。

Index Block 索引数据

Index Block 主要是连续的entries组成,每个entry对应一个Data Block,包含了各自所对应的Data Block的偏移量 Offset,Data Block的大小 DataSize,KeyLen和KeyData为每块Data Block的第一个Key。

Trailer 块

数据文件被打开时,首先应该被读取的是Trailer块,Trailer块的长度是固定的,当然这个可以自己修改,理所当然的做法就是给Trailer增加一个Version,解决各版本之间数据格式不兼容的问题。Trailer 结构里主要保存了 File Info 和Index Block等其他结构在文件中的偏移量和数据大小,如下

我写了一个c版本的上述设计的实现,仅关注存储形式而不涉及上层DB的实现逻辑。代码未经测试,谨慎使用

https://github.com/pipul/Hfile

Leave a Comment