Bitcask-高吞吐量日志型KV存储模型

Bitcask是一个基于哈希表结构的高性能日志型KV存储模型

存储结构

Datafiles

在Bitcask模型中,数据文件以日志追加的形式只增不删保存。当单个数据文件的体积增加到一定限制时,会创建一个新的文件用于写入,旧的文件则变为只读不写(Close and immutable datafiles)。在任意时间点,只有一个文件是可写的(Active datafile),而且是顺序追加写入的,这个特点使Bitcask有非常高的读写吞吐量。记录的结构非常简单,包含(CRC,Timestamp,Key-Size,Value-Size,Key,Value),如下图所示(图片引用自arpitbhayani的参考文章,最后附有链接)。

KeyDir

在只追加的日志数据文件以外,Bitcask在内存中维护一个KeyDir哈希表,其中包含了Key及其对应的数据的元信息(ID,Value-Size,Value-Position,Timestamp)。

操作

1. 添加键值对:当一个新的键值对被提交,首先数据被追加到Active datafile中,并在KeyDir创建对应的包含偏移量的条目,这两步是原子的,要么都成功,要么都失败。

2. 更新值:当发生值更新时,Bitcask不会删除旧的数据记录,而是追加一个时间更新的数据记录到Active datafile中,并更新KeyDir中的数据记录元信息,这两步也是原子的。

3. 删除记录:当删除键值对时,Bitcask不会删除旧的数据记录,而是添加一个带有删除标记的时间更新的数据记录到Active datafile中,并更新KeyDir中的偏移量信息为悬空。

4. 读取键值对:发起查询请求时,通过KeyDir对应的数据记录元信息(Value-Size,Value-Position)找到最新的记录。

合并压缩

更新和删除操作导致大量的多余磁盘空间消耗,删除操作可能导致KeyDirs中的一些Key悬空无用。因此,经过一定的时间后,Bitcask会由一个异步的进程将较旧的只读日志文件合并压缩为更少的记录数量(移除已经被更新、删除的记录)。合并后的文件结构和现有的文件结构相同。

高性能重启

重启Bitcask的本质是重建KeyDir,这可以通过两种方式来完成。

  1. 读取全部的日志数据文件,重建KeyDir。

  2. 对于每个日志数据文件(特别是close and immutable datafiles),将其KeyDir包含的元信息直接保存为一个提示文件(在合并压缩后创建,或者由异步进程在适当时候创建),这样重建时则只需要读取这个更小的提示文件。即使Bitcask是异常崩溃退出的,来不及为active datafile创建该提示文件,重建时也只需要扫描active datafile即可,close and immutable datafiles的提示文件仍然是可用的。

优缺点

优点

  • 读写操作延迟低
  • 高写入吞吐量
  • 单磁盘寻道检索任意值
  • 可预测的查找和插入性能
  • 崩溃恢复快速且有限
  • 备份很简单 - 只需复制目录就足够了

缺点

KeyDir维护在内存中,而内存相比于磁盘来说,一般大小更加的有限。 一类可行的解决方案是对Key进行水平分片拓展。

Refs

arpitbhayani.me/blogs/bitca...
en.wikipedia.org/wiki/Log-st...
riak.com/assets/bitc...
en.wikipedia.org/wiki/Bitcas...

相关推荐
半路_出家ren15 小时前
MySQL数据库,DDL,DML,查询,权限,主从复制
数据库·mysql·主从复制·权限·ddl·dml
运维成长记15 小时前
Mysql的数据备份和高可用
数据库·mysql
IT技术与企业应用结合的爱好者15 小时前
c#using Oracle.ManagedDataAccess.Client 批量保存数据
数据库·oracle
l1t16 小时前
利用DeepSeek改写递归CTE SQL语句为Python程序及优化
数据库·人工智能·python·sql·算法·性能优化·deepseek
江湖一码农18 小时前
[小白]spring boot接入emqx
java·数据库·spring boot
HitpointNetSuite20 小时前
连锁餐饮行业ERP如何选择:为何Oracle NetSuite成为增长新引擎
大数据·运维·数据库·oracle·netsuite
冻咸鱼21 小时前
MySQL基础知识大全
数据库·mysql·oracle
emma羊羊21 小时前
【Redis】
数据库·redis·缓存
程序猿小蒜1 天前
基于springboot的车辆管理系统设计与实现
java·数据库·spring boot·后端·spring·oracle
数据库知识分享者小北1 天前
如何构建企业级数据分析助手:Data Agent 开发实践
数据库·阿里云·1024程序员节·dataagent