优雅的Bitcask

如何从0到1实现一个基于bitcask的kv存储引擎 保姆级教程带你从0到1实现基于bitcask的kv存储引擎 阅读详情

Bitcask是一个日志型的基于hash表结构和key-value存储模型,我了解到他也就几天时间,但是其简洁有效的设计思路,让我的某种技术癖好得到了极大满足,于是酝酿出这篇东西。

Bitcask模型指导下的存储系统有Riak和豆瓣的beansdb新版本(beansdb新版本信息,参见这里),下面就简单的介绍一下Bitcask模型:

1.日志型的数据文件

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

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

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

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

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

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

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.有用的hint file

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

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

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

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

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

结语:

以上就是Bitcask数据模型的所有内容,非常之精简易懂,但是记住,他只是一个模型,如果我们要实现一个基于Bitcask的存储系统的话,相信还有很多工作要做,还有很多细节可以优化。有兴趣的同学可以看一看Riak或豆瓣beansdb 0.5.2 版本的源码。

参考文献:http://downloads.basho.com/papers/bitcask-intro.pdf

更多资料:http://goo.gl/b7Bqg

谈谈在Bitcask中用读写锁实现并发控制的性能表现 可以看到,对于存储引擎,IO才是最大的瓶颈。那么为什么MySQL要实现MVCC呢。MySQL一般是读多写少,所以做MVCC收益比较大。另外MySQL是有数据缓存在内存的,可能对于大多数读取操作来说,根本不需要磁盘IO去读取。这样一来,又是一大波优化。但是当我们把目光拉会到bitcask,读写操作都需要经过磁盘,批次写只是延迟写入,我认为这样只是降低了写操作的比例,因为几个写操作合并成一个写入磁盘了。本质上没多大差别。所以这也符合了我一开始心中的想法,读写锁,也没那么不堪。 阅读详情

相关推荐

NMOS管和PMOS管做开关控制电路

NMOS管和PMOS管做开关控制电路

while(1) 3万+

BitCask 持久化hash存储引擎 原理介绍

十年前的持久化hash存储引擎 bitcask

天行健,地势坤 1931

电子产品的老化测试有哪些类型?

因此,越来越多的人在寻找“已知合格的测试连接器”,即经过测试具有可靠性和有效性的测试连接器,可以在老化测试中制定优化方法。例如对于芯片来说,不同的封装有不同的老化测试座,QFP老化测试座,QFN老化测试座等。老化测试时,专用老化电路板上的元件将承受等于或高于其额定工作条件的压力,以消除任何在额定寿命之前过早失效的元件。静态老化:在此类系统中,将测试设备安装到老化板上的插座中,然后放入老化箱中,其中每隔12至24小时施加电源和高温。动态老化:在动态老化系统中,设备以老化速度设定的最大速率进行测试。

软件技术的专栏 1839

存储架构|Bitcask 引擎的设计,秒!

坚持思考,就会很酷Bitcask 是什么?Bitcask 是一种很有趣的存储模型的设计,这是一种底层格式为日志模样的 kv 存储。Bitcask 起源于 Riak 分布式数据库,Bitca...

架构师小秘圈 578

【ISAR成像】基于Matlab的飞机点目标模型仿真与图像优化

本文详细介绍了如何使用Matlab进行ISAR成像仿真,重点讲解了从构建飞机点目标模型到生成清晰图像的完整流程。通过模拟雷达回波、距离压缩、运动补偿及方位压缩等核心信号处理步骤,并结合相位梯度自聚焦等优化技巧,有效提升了ISAR图像的清晰度与分辨率。文章还分享了雷达参数调优、加窗处理等实战经验,为雷达信号处理与目标识别研究提供了实用指导。

weixin_29071809的博客 389

精通DC-DC变换器:Boost升压电路全解析

Boost升压变换器是一种将低直流电压转换为高直流电压的常用电路。其核心工作原理是通过电感储能:开关导通时电感充电,关断时电感与电源串联向负载供电。关键公式表明输出电压Vo=Vi/(1-D),占空比D越大,升压比越高。变换器工作时会产生电感电流纹波和输出电压纹波,需合理选择电感和电容参数。开关管和二极管需承受完整的输出电压,对元器件选型要求较高。理解这些原理是设计高效升压电源的基础。

2511_92918351的博客 3709

Go 存储系列:Hash存储引擎 Bitcask

Bitcask 是一种底层格式为日志模样的 kv 存储,就是只追加,保证文件是一直顺序写入的,写入性能非常好大部分接触的KV存储引擎是可能都是Redis。Redis的所有数据都是装在内存的,也可以根据配置持久化在磁盘里面,但是读都是从内存里面读的,这意味着redis的读写速度都非常快。但是这有一个限制,那就是单机Redis存储的数据不能大于内存本身。而Bitcask的最大限制是内存必须装得下所有的key,因为Bitcask的value是存在磁盘上的。

CoLiuRs 1606

手机摄影新宠:In-line Hardware EIS如何让你的4K视频稳如鸡头(附实测对比)

本文深入解析了手机摄影中的In-line Hardware EIS(硬件级行内电子图像稳定)技术。通过对比传统软件EIS,阐述了其通过硬件管道实时处理实现极低延迟、减少画面裁切和有效抑制果冻效应的核心优势,并结合4K视频的日夜间实测,展示了该技术如何让手持拍摄的视频“稳如鸡头”,显著提升创作体验与成片质量。

tree的博客 994

优雅的bitcask

<br /><br />Bitcask是一个日志型的基于hash表结构和key-value存储模型,我了解到他也就几天时间,但是其简洁有效的设计思路,让我的某种技术癖好得到了极大满足,于是酝酿出这篇东西。<br />Bitcask模型指导下的存储系统有Riak和豆瓣的beansdb新版本(beansdb新版本信息,参见这里),下面就简单的介绍一下Bitcask模型:1.日志型的数据文件<br />何谓日志型?就是append only,所有写操作只追加而不修改老的数据,就像我们的各种服务器日志一样。在B

Make Progress Everyday! 822

【CASS精品教程】013:CASS9.1生成标准图幅案例教程

在CASS中,可以很方便的生成标准图幅,如50*50。本文演示cass中,根据测区范围标准图幅生成过程。

智慧空间实验室 1万+

Winform从入门到精通(38)——StatusStrip(史上最全)

本文介绍StatusStrip控件的详细用法,包含所有属性和事件,绝对史上最全!

qq_34059233的博客 2758

[转]优雅的Bitcask

Bitcask是一个日志型的基于hash表结构和key-value存储模型,我了解到他也就几天时间,但是其简洁有效的设计思路,让我的某种技术癖好得到了极大满足,于是酝酿出这篇东西。 Bitcask模型指导下的存储系统有Riak和豆瓣的beansdb新版本(beansdb新版本信息,参见这里),下面就简单的介绍一下Bitcask模型: 1.日志型的数据文件 何谓日志型?就是append onl...

weixin_30364147的博客 99

QT+OSG/osgEarth编译之七十六:gltf+Qt编译(一套代码、一套框架,跨平台编译,版本:osgEarth-3.3插件库osgdb_gltf)

通过一套gltf代码和框架,实现osgdb_gltf跨平台编译。 在Qt环境下,集成头文件、库文件,构建跨平台编译的pro文件。 通过构建的一套配置工程,基于Qt Creator IDE,完成跨平台的编译实践。 在Windows、Linux、MacOS等操作系统上进行测试,成功编译,形成的成果(头文件、库文件等)可在不同系统下调用或使用,从而更好地构建跨平台解决方案。 采用的是osgEarth3.3版本。 读者可参考博客中的集成原理,构建不同版本的osgdb_gltf跨平台包。

LuckyHanMo的博客 1801

beansdb文档集合

优雅的Bitcask

SAN_YUN的专栏 276

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

NOSQL

优雅的Bitcask 转载于:https://www.cnblogs.com/pengyou8696/p/4001932.html

weixin_30414155的博客 66

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

FastAPI请求超时终极指南:如何配置超时设置保障服务稳定

在现代Web开发中,处理请求超时是确保服务稳定性和用户体验的关键环节。FastAPI作为一款高性能、易学习的Python Web框架,提供了多种灵活的超时配置方案。本文将详细介绍在FastAPI应用中如何设置请求超时,帮助开发者有效避免因长时间未响应导致的资源耗尽和用户体验下降问题。 ## 为什么请求超时配置至关重要 ⏱️ 在Web应用中,未设置超时的请求可能导致严重后果:资源被长时间占用、服

gitblog_01080的博客 439

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Android应用安全与权限管理终极指南:10个必备最佳实践

在Android应用开发中,**安全与权限管理**是确保用户数据保护和应用稳定性的核心要素。随着Android系统的不断演进,权限管理机制也在不断完善,从最初的安装时权限到现在的运行时权限请求,开发者需要掌握最新的安全实践来构建可信赖的应用。本文将为您全面解析Android安全与权限管理的最佳实践。 ## 🔐 Android权限机制演进与现状 Android的权限系统经历了多次重大变革。在A

gitblog_00822的博客 332

Rust 语言完全指南:为什么它是 AI 时代的强力语言?如何从零开始掌握它?(8000+字深度解析·附 20 段实战代码)

9000字深度解析 Rust 性能优化的 7 大实战技巧:release 模式、零分配迭代器、避免 dyn/Rc、Vec 预分配、AoS→SoA 缓存优化、SIMD、Rayon 并行。配 6 张实测性能图 + 8 张对比表 + 16 段 criterion benchmark 代码,覆盖 criterion/pprof/cargo-bloat/perf 完整工具链。

热爱技术与前沿创新,深耕科技领域,在科创中精进自我;探索技术乐趣,分享技术干货与成长心得,以技术为伴,热爱生活,在科创与生活中双向成长。 1308

Rust 语言完全指南:为什么它是 AI 时代的强力语言?如何从零开始掌握它?

本文系统化梳理 IT 开发者从"码农"到"超能力者"的完整技能树,覆盖基础层(思维+工具)、核心层(语言+架构+算法)、进阶层(框架+数据库+调试)、高阶层(分布式+性能+安全)、大师层(领导力+影响力+终身学习)共 **5 大层级 20+ 关键能力**,并附 **10+ 段可运行 Python 代码**、**6 张能力对比表**、**6 个常见误区 FAQ**、**21 天修炼计划**与**5 篇精选参考文献**。无论你是刚入门的编程新手、迷茫的初中级工程师,还是寻求突破的高级开发者,都能从本文获得清晰的

热爱技术与前沿创新,深耕科技领域,在科创中精进自我;探索技术乐趣,分享技术干货与成长心得,以技术为伴,热爱生活,在科创与生活中双向成长。 246

rosedb01--Bitcask 简单实现

Bitcask 是一种简单而高效的键值存储机制,主要通过顺序写入和合并操作来优化性能。存储索引:如何高效存储索引信息,减少内存和磁盘空间的使用。高效构建内存哈希表:如何利用提示文件(hint file)等方式加速内存哈希表的构建。

m0_72618948的博客 1234

bitcask论文翻译/笔记

Bitcask的起源与Riak分布式数据库的历史紧密相连。在Riak的K/V集群中,每个节点都使用了可插拔的本地存储;几乎任何结构的K/V存储都可以用作每个主机的存储引擎。这种可插拔性使得Riak的处理能够并行化,从而可以在不影响代码库其他部分的情况下改进和测试存储引擎。有很多类似的本地K/V存储系统,包括但不限于Berkeley DB、Tokyo Cabinet和Innostore。读取或写入每个项目的低延迟高吞吐量,尤其是在写入随机项目的传入流时处理比RAM大得多的数据集的能力,无退化。

weixin_42367537的博客 2011

ELK-EFK-v7.12.0日志平台部署

文章目录ELK和EFK是什么关于ElasticsearchElasticSearch 重要特性ElasticSearch 基本概念ElasticSearch与关系性数据库的类比文档(Document)文档的存在场景文档的格式文档 ID文档的元数据索引(Index)映射(Mapping)弃用该概念的原因:节点Master-eligible 节点 和 Master 节点Data 节点 和 Coordinating 节点其他节点配置节点的类型分片(Primary Shard & Replica Shar

以梦为马|越骑越傻 2640

BitCask:基于日志结构哈希表的高性能 KV 引擎

BitCask 是分布式数据库 RIAK KV 的存储引擎,同时也是世界上最高效的 KV 存储引擎之一,其基于日志结构哈希表(Log-Structured Hash Table)实现。

凌桓丶的博客 1383
上一篇: 检测socket链接是否断开
下一篇: linux平台下svn环境搭建【未完】
nellson
博客等级 码龄20年 48粉丝 84原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值