日志结构的key/value存储系统Bitcask

Bitcask来自于riak,是一个日志(log-structured)存储系统。用在riak的分布式数据库的底层key/value的存储。

 

Bitcask的一些基本特征:

1.   key/value以日志的形式按顺序存储,只能追加(append-only)写入key/value,每次写操作都是顺序写入。当某个key所对应的value发生变化时,新的key/value被追加到文件末尾。

2.   通过hash表存储key与其物理存储位置的对应关系(索引),读取操作的时间复杂度为0(1);可通过对索引进行持久化以减少重启时重建索引的时间。

3.   当系统运行一段时间后,可进行merge操作将相同的key进行合并以腾出空间。

4.   写操作只需一次磁盘寻道;读操作先查找索引,获取key所对应的value的位置与大小,然后读取value的数据,需要两次磁盘寻道;因此读写的效率都相当高。

 

Bitcask的数据存储

Bitcask中,每一对key/value都以如下图所示的结构进行存储,其中crc是数据体的校检码,tstamp为时间戳,kszkey的长度,valueszvalue的长度,最后紧接着是keyvalue。


key/value按照上面的格式一条一条进行存储,当有key/value加入时,Bitcask将其直接追加到数据文件的末尾,即使对应的key已经存在于数据文件中,这样就可能造成Bitcask存储一个key对应的多个版本,为了节省存储空间,Bitcask会定期的进行merge操作,对同一个key上的多个操作进行合并,每次merge后,数据文件中将不会有冗余数据了。

 

基于hash表的索引数据

日志类型的数据文件会让写入操作非常快(日志型的优势之一是将磁盘当作磁带,进行顺序读写的效率非常高),而如果在这样的日志型数据上进行key值查找,效率将非常的低,Bitcask在内存中使用hash表建立key与其存储位置的索引,从而使得读操作能高效的完成。Hash表的每个条目如下所示,主要存储了key所对应value的大小和偏移位置。

 

Hint file加速索引重建

Bitcask的索引存储在内存中,如果我们不做额外的工作,那么系统启动时重建hash表时,就需要整个扫描一遍数据文件,如果数据文件很大,这将是一个非常耗时的过程。Bitcask模型中包含了一个称作hint file的部分,目的在于提高重建hash表的速度。

每个key/value对与hint file的一个条目对应,该条目主要存储了keyvalue大小及位置的对应关系,hint file会被持久化到硬盘上,每次系统启动时,只需要顺序读取hint file便可快速的构造hash索引表。

 

参考资料:

http://downloads.basho.com/papers/bitcask-intro.pdf

http://lgone.com/html/y2010/861.html

http://www.unclejoey.com/?tag=bitcask 

 

posted @ 2013-04-19 14:09  ydzhang  阅读(1323)  评论(0编辑  收藏  举报