Bitcask模型是什么

36次阅读
没有评论

共计 2000 个字符,预计需要花费 5 分钟才能阅读完成。

今天就跟大家聊聊有关 Bitcask 模型是什么,可能很多人都不太了解,为了让大家更加了解,丸趣 TV 小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。

Bitcask 是一个日志型的基于 hash 表结构和 key-value 存储模型,但是其简洁有效的设计。下面丸趣 TV 丸趣 TV 小编来讲解下 Bitcask 模型是什么?

Bitcask 模型是什么

1. 日志型的数据文件

何谓日志型? 就是 appendonly,所有写操作只追加而不修改老的数据,就像我们的各种服务器日志一样。在 Bitcask 模型中,数据文件以日志型只增不减的写入文件,而文件有一定的大小限制,当文件大小增加到相应的限制时,就会产生一个新的文件,老的文件将只读不写。在任意时间点,只有一个文件是可写的,在 Bitcask 模型中称其为 activedatafile,而其他的已经达到限制大小的文件,称为 olderdatafile,如下图:

文件中的数据结构非常简单,是一条一条的数据写入操作,每一条数据的结构如下:

上面数据项分别为 key,value,key 的大小,value 的大小,时间戳 (应该是),以及对前面几项做的 crc 校验值。(数据删除操作也不会删除旧的条目,而是将 value 设定为一个特殊的值以作标示)

数据文件中就是连续一条条上面格式的数据,如下图:

好了,上面是日志型的数据文件,如果数据文件这样持续的存下去,肯定是会无限膨胀的,为了解决个问题,和其他日志型存储系统一样 Bitcask 也有一个定期的 merge 操作。

merge 操作,即定期将所有 olderdatafile 中的数据扫描一遍并生成新的 datafile(没有包括 activedatafile 是因为它还在不停写入),这里的 merge 其实就是将对同一个 key 的多个操作以只保留最新一个的原则进行删除。每次 merge 后,新生成的数据文件就不再有冗余数据了。

Bitcask 模型是什么

2. 基于 hash 表的索引数据

上面讲到的是数据文件,日志类型的数据文件会让我们的写入操作非常快 (日志型的优势之一是将磁盘当作磁带,进行顺序读写的效率非常高,可以参见这里),而如果在这样的日志型数据上进行 key 值查找,那将是一件非常低效的事情。于是我们需要使用一些方法来提高查找效率。

例如在 Bigtable 中,使用 bloom-filter 算法为每一个数据文件维护一个 bloom-filter 的数据块,以此来判定一个值是否在某一个数据文件中。

而在 Bitcask 模型中,我们使用了另一种方法,使用了一个基于 hash 表的索引数据结构。

在 Bitcask 模型中,除了存储在磁盘上的数据文件,还有另外一块数据,那就是存储在内存中的 hash 表,hash 表的作用是通过 key 值快速的定位到 value 的位置。hash 表的结构大致如下图所示:

hash 表对应的这个结构中包括了三个用于定位数据 value 的信息,分别是文件 id 号 (file_id),value 值在文件中的位置 (value_pos),value 值的大小 (value_sz),于是我们通过读取 file_id 对应文件的 value_pos 开始的 value_sz 个字节,就得到了我们需要的 value 值。整个过程如下图所示:

由于多了一个 hash 表的存在,我们的写操作就需要多更新一块内容,即这个 hash 表的对应关系。于是一个写操作就需要进行一次顺序的磁盘写入和一次内存操作。

3. 有用的 hintfile

至此,Bitcask 模型基本上已经讲述完成,而这一节讲到的 hintfile,则是一个有用的技巧,本人认为并不一定是 Bitcask 模型的必须特性。

从上面我们可以知道,我们称其为索引的 hash 表,是存储在内存中的,虽然在各自的实现中可以做一些持久化的保证,但是 Bitcask 模型中并不对在断电或重启后的 hash 表数据不丢失做出保证。

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

我们上面讲到在 olddatafile 进行 merge 操作时,会产生新的 datafile,而 Bitcask 模型实际还鼓励生成一个 hintfile,这个 hintfile 中每一项的数据结构,与 datafile 中的数据结构非常相似,不同的是他并不存储具体的 value 值,而是存储 value 的位置 (像在 hash 表中的一样),其结构如下图:

这样,在重建 hash 表时,就不需要再扫描所有 datafile 文件,而仅仅需要将 hintfile 中的数据一行行读取并重建即可。大大提高了利用数据文件重启数据库的速度。

看完上述内容,你们对 Bitcask 模型是什么有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注丸趣 TV 行业资讯频道,感谢大家的支持。

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-07-19发表,共计2000字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)