Bitcask 存储模型的实现 - merge与hint文件

《Bitcask存储模型的实现 - 基本框架》中,我们了解了Bitcask存储模型中数据的存储方式、内存索引的组织形式,以及如何使用缓存加速数据读取。另外,Bitcask存储模型中提出闲时进行merge减少数据冗余、运用hint文件加速创建内存索引,下面我们来看merge的具体实现、如何用hint文件加速索引创建。

merge

Bitcask是日志型存储模型,对于新增和更改的操作,都Append到磁盘,磁盘使用率将随着操作的增多而增长。

以上图例表示,key及对应val最开始存放在25.w,之后对数据进行了更改,并通过Append存放到26.w中,内存中的索引相应地修改,这时25.w中的key数据即变成废弃的数据。

怎么清理这些冗余的数据呢?因内存索引指向磁盘中当前有效的key数据,我们可以利用这个特性清理冗余的数据。在数据存放目录下,我们再定义一个文件:

xxx.m:数据存储文件,存储经过merge后的数据,相比xxx.w文件,减少了废弃数据

假设一条磁盘上的记录为一条Record,清理冗余数据的过程如下:

1. 遍历.w文件中的Record,根据Record中的key反查对应的MemIdx_t

(参照《Bitcask存储模型的实现 - 基本框架》一文,通过对key计算hash值可取得相应MemIdx_t)

2. 如果 Record.iFileNo == stMemIdx.iFileNo && Record.iOffset == stMemIdx.iOffset,则表示该条Record为有效数据

3. 将满足以上条件的Record记录到一个.m文件中,同时更新内存索引MemIdx_t中的iFileNo、iOffset,跳过不满足条件的Record

4. 当遍历完一个.w文件之后,将其删除

以上过程将.w中的多余数据滤去,将有效的数据迁移到.m文件中,因为数据在磁盘中的位置变了,所以相应地要修改内存中的索引数据。随着有更多的更新操作,.m文件中也将存在冗余数据,因而对.w进行完以上操作之后,还会遍历已有的.m文件进行同样的操作。

hint文件

以上谈到的Bitcask实现中,内存索引有很大的作用,不仅加速了数据读取,在merge过程中还以其为标准,判断哪些数据是有效数据,哪些数据可以删除。但内存数据易失,当程序或机器重启时即丢失,如果想重建内存索引数据,要遍历磁盘上所有的.m和.w文件,这样效率很低,hint文件是加速内存索引创建的一种方式:

xxx.h:加速内存索引创建的hint文件,相比.w、.m文件,只保存key/valLen/iFileNo/iOffset,并不保存val数据

在merge的过程中,当检查到有效Record数据、写入.m文件后,将该Record的key/keyLen/valLen/iFileNo/iOffset指标写入.h文件。当程序重启时,遍历.h文件,即可重建内存索引数据。

时间: 2024-12-17 05:36:59

Bitcask 存储模型的实现 - merge与hint文件的相关文章

Bitcask存储模型

----<大规模分布式存储系统:原理解析与架构实战>读书笔记 近期一直在分析OceanBase的源代码,恰巧碰到了OceanBase的核心开发人员的新作<大规模分布式存储系统:原理解析与架构实战>.看完样章后决定入手,果然物有所值. 对于准备学习分布式的同学,这是一本不错的书籍,相对系统,全面的介绍了分布式的相关技术和项目,基本都是干货. 另一半是在介绍OceanBase的内容,对我来说,正是踏破铁鞋无觅处.接下来会有几篇专门研究存储引擎的读书笔记哟.废话不多说,转入正题. 1.存

Bitcask 存储模型

Bitcask 存储模型 Bitcask 是一个日志型.基于hash表结构的key-value存储模型,以Bitcask为存储模型的K-V系统有 Riak和 beansdb新版本. 日志型数据存储 何谓日志型?就是append only,所有写操作只追加而不修改老的数据,就像我们的各种服务器日志一样.在Bitcask模型中,数据文件以日志型只增不减的写入文件,而文件有一定的大小限制,当文件大小增加到相应的限制时,就会产生一个新的文件,老的文件将只读不写.在任意时间点,只有一个文件是可写的,在Bi

一种 Bitcask 存储模型的实现

引言 Bitcask 是一种 key-value 存储实现模型,其中心思想是 Append 写文件,内存索引加速文件读,通过闲时 Merge 文件减少数据冗余.下面我们从存储方式.索引和缓存三个方面学习 Bitcask 的具体实现方法. 数据存储方式 Bitcask 中,数据以文本的形式存储,增删改的数据以 Append 的形式追加到数据文件结尾,在数据存放目录下,我们定义两类文件: xxx.w:数据存储文件,xxx 是一个数值,写满1G数据将新建文件,数值自增,程序往数值最大的一个文件 App

LSM树存储模型

----<大规模分布式存储系统:原理解析与架构实战>读书笔记 之前研究了Bitcask存储模型,今天来看看LSM存储模型,两者虽然同属于基于键值的日志型存储模型.但是Bitcask使用哈希表建立索引,而LSM使用跳跃表建立索引.这一差别导致了两个存储系统的构造出现明显的分化.为此,我还先去捣腾了一番跳跃表的实现.今天算是进入了正题. LSM的结构 LSM的基本思想是将修改的数据保存在内存,达到一定数量后在将修改的数据批量写入磁盘,在写入的过程中与之前已经存在的数据做合并.同B树存储模型一样,L

剖析Elasticsearch集群系列第一篇 Elasticsearch的存储模型和读写操作

剖析Elasticsearch集群系列涵盖了当今最流行的分布式搜索引擎Elasticsearch的底层架构和原型实例. 本文是这个系列的第一篇,在本文中,我们将讨论的Elasticsearch的底层存储模型及CRUD(创建.读取.更新和删除)操作的工作原理. Elasticsearch是当今最流行的分布式搜索引擎,GitHub. SalesforceIQ.Netflix等公司将其用于全文检索和分析应用.在Insight,我们用到了Elasticsearch的诸多不同功能,比如: 全文检索 比如找

C语言存储模型

描述方法(三个方面) 作用域 代码块.函数原型 文件作用域 链接类型 外部链接 内部链接 空链接 存储时期 静态存储时期 动态存储时期 变量类型 变量存储类型 作用域 链接类型 存储时期 C语言存储模型(类) 文件 外部 静态 具有外部链接的静态 内部(static) 具有内部链接的静态 代码块 无链接 静态(static) 空链接静态变量 动态 自动变量 寄存器(性质与自动变量类似,存储在寄存器中) 寄存器 注: 具有外部链接的在其他文件使用前必须以exturn声明 具有静态存储期的变量必须使

多核程序设计——存储模型

最近在看<现代体系结构上的UNIX系统--内核程序员的SMP和Caching技术>,这里抄点东西作为笔记吧! 顺序存储模型强制存储器操作(load和store)都按照程序次序来执行,即这些指令是按照在随程序执行的指令流中出现的顺序次序来执行的.它也指定了,由不同处理器完成的load和store操作也要以某种顺序.但又是非确定性的方式排序.这种存储模型应该是大家最容易理解的,甚至都认为实际MP也是这样工作的.但是,这种存储结构是非常落后的,现代处理器应该已经淘汰了这种结构. 书中讲到了一个例子,

教你构建iSCSI服务器实现SAN存储模型

iSCSI(Internet Small Computer System Interface)Internet 小型计算机系统接口,是一种基于 TCP/IP的协议,用来建立和管理 IP 存储设备.主机和客户机等之间的相互连接,并创建存储区域网络(SAN).SAN 使得 SCSI 协议应用于高速数据传输网络成为可能,这种传输以数据块级别(block-level)在多个数据存储网络间进行. SCSI 结构基于客户/服务器模式,其通常应用环境是:设备互相靠近,并且这些设备由 SCSI 总线连接.iSC

智能合约从入门到精通:Solidity语法之内存变量的布局和状态变量的存储模型

简介:在前面我们已经讲过Solidity语言的一些语法内容,在矩阵元JUICE开放平台的JIDE开发时,一定要注意Layout in Memory和Layout of State Variables in Storage,即内存变量的布局和状态变量的存储模型.内存变量的布局(Layout in Memory) Solidity预留了3个32字节大小的槽位: 0-64:哈希方法的暂存空间(scratch space) 64-96:当前已分配内存大小(也称空闲内存指针(free memory poi