Bitcask是一个基于哈希表结构的键值存储系统,Append-only,所有的写操作只追加不修改老的数据。每个文件有一定的大小限制,当文件增加到相应大小,就会产生一个新文件,老的文件只读不写。
数据结构
Bitcask数据文件中的数据是一条一条写入操作,记录包含,key,value,主键长度,value长度,时间戳(timestamp)以及crc校验值。(删除操作不会删除旧的条目,而是将value设定为一个特殊的标识值)。
内存中是采用基于hash表的索引数据结构,通过主键快速定位到value。hash表中的每一项包含三个用于定位数据的信息,文件编号,value在在文件中的位置,value长度。通过读取file_id对应文件的value_pos开始的value_sz个字节,得到value值。
写入时,首先将Key-Value记录追加到活跃数据文件的末尾,然后更新内存hash表。

定期合并
记录更新后,原来的记录成为垃圾数据。如果一直保存下去,文件会无限膨胀。
需要定期执行合并操作。
对同一个key的多个操作以只保留最新一个的原则进行删除。
快速恢复
hash索引存储在内存中,服务器断电重启后重建hash需要扫描一遍数据文件,如果数据文件很大,这是一个非常耗时的过程。
对老数据进行合并操作后,将产生的新数据文件备份一份到硬盘,当重建hash的时候,不需要扫描所有的数据文件,只需要读取备份文件中的数据。
0 Comments