暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Bitcask模型入门学习

游在鱼里的水 2022-12-12
515

这是我一直以来欠的债,想静下心来看看bitcask这个东西到底是什么?

如果你也感到好奇,跟着我一起来探个究竟吧。

大家对redis肯定很熟悉,知道redis是将数据保存在内存中,但是redis为了保证数据不丢失,会定时将操作日志落盘,具体怎么保存的我还真不知道,又增加了一个要研究的问题。

先放上经典论文: Bitcask 论文: https://riak.com/assets/bitcask-intro.pdf

bitcask核心思想就是把所有的插入、更新和删除操作都当成一条日志append到数据文件中,保证了顺序写的速度。

一开始让我对bitcask了解的是rosedb这个项目,作者使用bitcask模型实现了一个k-v数据库,心生崇拜,所以才了解到了bitcask.

rosedb作者也根据论文实现了一个简易版的k-v数据库,有兴趣的小伙伴可以下载下来看看。

https://mp.weixin.qq.com/s/s8s6VtqwdyjthR6EtuhnUA

  1. 1. 全局只有在内存记录了key映射到哪一个文件块的信息,全局只有一个active data file来进行日志的append操作。

  2. 2. 当一个文件append到达一定量的时候,就会变成一个不可变文件块,另外再开一个新的文件块来进行新的日志的append。

  3. 3. 一条append日志主要包括crc、timestamp、keysize、valuesize、key 、 value这几个字段值。

  4. 4. 历史的文件块里面肯定有很多冗余数据,因此需要寻找合适的时机把老的文件块重新遍历一遍,把有效的数据保存到另外一个merge file里面。比如,一个key可能经过了插入、更新操作,最终进行了删除操作,但是这个key其实在内存里面没有这个key的信息,那么这三条日志其实不需要保存了,所以可以把这三条日志全部删除。

因为顺便要遍历所有的文件,那么对目前所有有效的key的信息可以保存一份成hint file存起来,万一突然宕机,下次重新启动的时候可以根据这份hint file文件加速加载过程,而不需要把所有的文件块重新遍历一遍。

  1. 1. Bitcask 先写文件,持久化落盘之后更新内存 hash 表。

主要的思想就是以上这几点,还是动手实现一下更有深刻的印象吧(我也只是嘴炮哈哈)。

就先到这里吧。


文章转载自游在鱼里的水,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论