日志型key/value存储模型 Bitcask

Bitcask是一个key-value存储模型,基于hash表结构,并且有个特点,是日志型的数据文件

设计思路非常简洁,值得学习一下 基于Bitcask模型实现的存储系统例如: (1)Riak Erlang编写的高度可扩展的分布式数据存储 (2)beansdb 豆瓣开源数据存储系统

什么是日志型数据文件?

Bitcask模型使用物理文件保存数据,使用了类似日志服务一样的方式,就是只追加,保证文件是一直顺序写入的,写入性能非常好 所以Bitcask模型的文件存储结构非常简单,一直向一个文件中写入,当文件大小达到预定值时,新建一个文件再接着写 就形成了 N个旧文件 + 1个活跃文件 的结构

数据文件中每条数据的结构如下

如何高效读取数据?

Bitcask模型使用了索引哈希表,表中记录了全部的主键和位置信息,哈希表是存放在内存中的 get key 时,从内存的hash表中快速取得key对应的value的位置信息,然后读取数据文件,取得value hash表每条记录的结构

如何处理删除修改数据?

Bitcask模型只支持文件的顺序操作,如何处理修改删除数据呢? 删除数据 不直接删除记录,而是新增一条相同key的记录,把value设置一个删除的标记 原有记录依然存在于数据文件中,只是更新索引哈希表 修改数据 Bitcask不支持随机写入,修改数据时不会找到目标记录进行修改 还是新增一条相同key的记录,把value设置为新值

如何处理旧数据?

从删除修改数据的处理方式中可以看到,时间一长,肯定会出现大量的无用记录,浪费存储空间 Bitcask会定期进行Marge操作,扫描所有旧数据文件中的数据,生成新的数据文件 扫描时,把已经被置为删除状态的记录直接过滤掉,修改过的数据,只保留时间最近的一条

如何提高重建hash索引表的效率?

Bitcask模型不保证重启时hash表数据不丢 那么启动时重建hash表,就需要整个扫描一遍数据文件,非常耗时 Bitcask模型中包含了一个hint file,目的在于提高重建hash表的速度 hint file 会在Marge操作时产生

hint file 的记录与数据文件的格式基本相同,唯一不同的是value部分,不是记录实际的value值,而是value的位置 这样,重建hash索引表时,不用扫描数据文件了,直接读取hint file就可以了,hint file要比数据文件小很多,所以重建的效率大大提高了

Bitcask模型的整体结构

hash index file 内存中的hash表,记录key和value的位置,用于快速查找 data file 只支持顺序写入,数据大小达标后就新建一个文件,形成 1个活跃文件 + N个旧数据文件 定期对数据文件进行Marge,清理掉无用数据 hint file 相当于存在于DISK中的索引文件,用于在重建hash index file时进行提速,在Marge操作中产生

原文发布于微信公众号 - 性能与架构(yogoup)

原文发表时间:2016-03-08

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Albert陈凯

2018-11-23 当我们输入一条 SQL 查询语句时,发生了什么?

我们经常说,看一个事儿千万不要直接陷入细节里,你应该先鸟瞰其全貌,这样能够帮助你从高维度理解问题。同样,对于 MySQL 的学习也是这样。平时我们使用数据库,看...

1595
来自专栏散尽浮华

Mysql数据库之Binlog日志使用总结

binlog二进制日志对于mysql数据库的重要性有多大,在此就不多说了。下面根据本人的日常操作经历,并结合网上参考资料,对binlog日志使用做一梳理: 一、...

1.7K9
来自专栏云数据库

MyDumper原理简介

相对于 MySQL 官方提供的逻辑备份工具 mysqldump,mydumper 最突出的特性就是可采用多线程并行备份,极大提高了数据导出的速度。本文基于 my...

4618
来自专栏AI深度学习求索

文字识别小项目-调用百度api文字识别,并将结果存入txt文件

1501
来自专栏java沉淀

MySQL · 特性分析 ·MySQL 5.7新特性系列三无标题文章

1714
来自专栏Eternally运维

Mysql配置文件的理解

1903
来自专栏匠心独运的博客

消息中间件—Kafka数据存储(一)

摘要:消息存储对于每一款消息队列都非常重要,那么Kafka在这方面是如何来设计做到高效的呢? Kafka这款分布式消息队列使用文件系统和操作系统的页缓存(pa...

1412
来自专栏数据和云

【错综复杂】一个执行计划异常变更的案例(中)

前文回顾: 一个执行计划异常变更的案例(上) 上篇文章我们说了,绑定变量实际是一些占位符,可以让仅查询条件不同的SQL语句可以重用解析树和执行计划,避免硬解析。...

3145
来自专栏Albert陈凯

SQL语句执行原理清空缓存的方法

文章转载:原文地址 原理: 第一步:应用程序把查询SQL语句发给服务器端执行。 我们在数据层执行SQL语句时,应用程序会连接到相应的数据库服务器,把SQL语句发...

3775
来自专栏玩转JavaEE

elasticsearch文档操作

上篇文章向读者介绍了Elasticsearch中修改数据的操作,使用了Elasticsearch提供的一整套强大的REST API,本文继续来看通过这一套API...

3873

扫码关注云+社区