bitcask
Bitcask模型是一种日志型kv模型。所谓日志型,是指它不直接支持随机写入,而是像日志一样支持追加操作。Bitcask模型将随机写入转化为顺序写入。
任意时刻,系统中只有一个数据文件支持写入,称为active data file。其余的数据文件都是只读文件,称为older data file。即所有写操作都是对最后更新文件的一个追加。
除了增加外,删除和更新也全部不随机读写已有文件。删除只是增加一个带删除标志的记录,随后更新索引hash;而更新也是一样。

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

上面数据项分别为:后面几项的crc校验值,时间戳,key,value,key的大小,value的大小。
而数据文件存储的就是连续一条条上面格式的数据,如下图:

kv之间的映射是通过中间的一个hash结构来处理,包含:记录文件的编号,value长度,value的在文件中的位置和时间戳。
Bitcask的总体数据结构如下图:

总体的流程如下:

为加速重启时建立hash表结构的速度,额外引入了hintfile,它将真实数据内容换成偏移。这样在建立hash时就不需要读数据文件了。

理解bitcask架构,必须要考虑下面的问题:
- bitcask hash表内存占用如何计算?
 - bitcask 文件读取流程?
 - bitcask 文件写入流程?
 - bitcask 文件合并流程?
 
bitcask的更多相关文章
- Bitcask 存储模型
		
Bitcask 存储模型 Bitcask 是一个日志型.基于hash表结构的key-value存储模型,以Bitcask为存储模型的K-V系统有 Riak和 beansdb新版本. 日志型数据存储 何 ...
 - Bitcask存储模型
		
----<大规模分布式存储系统:原理解析与架构实战>读书笔记 近期一直在分析OceanBase的源代码,恰巧碰到了OceanBase的核心开发人员的新作<大规模分布式存储系统:原理解 ...
 - infoq 微信后台存储架构
		
infoq 上微信后台存储架构 视频很是值得认真一听,大概内容摘要如下: 主要内容:同城分布式强一致,园区级容灾KV存储系统 - sync 序列号发生器 移动互联网场景下,频繁掉线重连,使用 ...
 - GO语言的开源库
		
Indexes and search engines These sites provide indexes and search engines for Go packages: godoc.org ...
 - NoSQL生态系统——事务机制,行锁,LSM,缓存多次写操作,RWN
		
13.2.4 事务机制 NoSQL系统通常注重性能和扩展性,而非事务机制. 传统的SQL数据库的事务通常都是支持ACID的强事务机制.要保证数据的一致性,通常多个事务是不可能交叉执行的,这样就导致了可 ...
 - Linux/centos下安装riak
		
必备的组件: gccgcc-c++glibc-develmakepam-devel 使用yum安装相关组件 sudo yum install gcc gcc-c++ glibc-devel make ...
 - 微信、陌陌等著名IM软件设计架构详解
		
对微信.陌陌等进行了分析,发出来分享一下(时间有些久了) 电量:对于移动设备最大的瓶颈就是电量了.因为用户不可能随时携带电源,充电宝.所以必须考虑到电量问题.那就要检查我们工程是不是有后台运行,心跳包 ...
 - Go语言(golang)开源项目大全
		
转http://www.open-open.com/lib/view/open1396063913278.html内容目录Astronomy构建工具缓存云计算命令行选项解析器命令行工具压缩配置文件解析 ...
 - LSM树存储模型
		
----<大规模分布式存储系统:原理解析与架构实战>读书笔记 之前研究了Bitcask存储模型,今天来看看LSM存储模型,两者尽管同属于基于键值的日志型存储模型.可是Bitcask使用哈希 ...
 
随机推荐
- ArrayList和Vector的扩容机制
			
ArrayList和Vector都是继承了相同的父类和实现了相同的接口.如下 public class Vector<E> extends AbstractList<E> im ...
 - Linux下mongodb的安装及启动
			
安装 1>设置mongoDB目录 cd /home/apps 附:centOS下创建目录命令 mkdir /home/apps 2>下载mongodb curl -O http://fa ...
 - android获取系统通讯录
			
package com.example.administrator.yunphone.View; import android.app.Fragment; import android.databas ...
 - E: dpkg 被中断,您必须手工运行 sudo dpkg --configure -a 解决此问题。
			
学习 : http://blog.csdn.net/darennet/article/details/9009361 http://www.uedsc.com/dpkg-sudo-dpkg-confi ...
 - Winform Combox DataSource 之不显示 displayemember 内容
			
刚开始学习数据绑定的东西, private void Form1_Load(object sender, EventArgs e) { IList<TLayer> tt = new Lis ...
 - webform连接ACCESS数据库
			
1.先建立一个名叫mydb.accdb的access数据库 2.他它复制到webform中,放在App_Data文件夹下. 3.在App_Code文件夹下建好封装语句,查询方法,连接语句,其中stud ...
 - OCR磁盘的导出和导入、备份和恢复以及移动(ocrconfig命令的应用)
			
数据库版本:10.2.0.1 一,使用导出.导入进行备份和恢复 Oracle推荐在对集群做调整时,比如增加.删除节点之前,应该对OCR做一个备份,可以使用export 备份到指定文件.如果做了repl ...
 - 为什么会出现Python Exception <class 'gdb.MemoryError'> Cannot access memory at address 问题?
			
问题描述: 把列表listview写入notebook里. 在main函数中, win = create_and_set_a_window(); book = gtk_notebook_ ...
 - readyState0 1 2 3 4..
			
0:请求未初始化(还没有调用 open()). 1:请求已经建立,但是还没有发送(还没有调用 send()). 2:请求已发送,正在处理中(通常现在可以从响应中获取内容头). 3:请求在处理中:通常响 ...
 - android 一个简单的服务例子
			
public class MessageService extends Service { // 获取消息线程 private MessageThread messageThread = null; ...