SinceNow.net

数据库

哈希存储引擎-Bitcask

phpangel   2022-07-07 13:22:49

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表。 

4cb88835-6d7b-47f7-8cc7-13dbc4b0c421.png

定期合并

记录更新后,原来的记录成为垃圾数据。如果一直保存下去,文件会无限膨胀。 

需要定期执行合并操作。 

对同一个key的多个操作以只保留最新一个的原则进行删除。

快速恢复

hash索引存储在内存中,服务器断电重启后重建hash需要扫描一遍数据文件,如果数据文件很大,这是一个非常耗时的过程。 

对老数据进行合并操作后,将产生的新数据文件备份一份到硬盘,当重建hash的时候,不需要扫描所有的数据文件,只需要读取备份文件中的数据。

数据库

Related Articles

0 Comments

message
沪ICP备2024072411号 © 2022 SinceNow.net - GitHub
Login