分类: 服务器与存储
2015-09-10 11:27:29
原文地址:日志结构的key/value存储系统Bitcask 作者:zyd_cu
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为时间戳,ksz是key的长度,valuesz是value的长度,最后紧接着是key和value。
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的一个条目对应,该条目主要存储了key与value大小及位置的对应关系,hint file会被持久化到硬盘上,每次系统启动时,只需要顺序读取hint file便可快速的构造hash索引表。
参考资料: