LevelDB速记
LevelDb的基本结构如下:

由六大部分组成:
一、MemTable,用户写入和读取的直接对象,
二、Immutable MemTable,用户状态写入的对象写满的MemTable之后会转为ImmutableMemTable,之后会写sst文件,
三、LOG文件,是WAL机制的部分,用户在写入MemTable的时候会先写入LOG文件,用来进行灾备恢复
四、SST文件,在磁盘上的文件,基本是一种KV结构,进行state持久存储的地方,
五、Current文件,有多个manifest文件,current文件指明了最新的manifest文件是哪个,
六、Manifest文件,记载了所有的sst文件的level层级,以及响应的key的范围分布。
杂记如下:
leveldb Compaction 会在以下场景触发:
DB::Open时检查条件满足时,触发
DB::Write操作里的MakeRoomForWrite的条件满足时,触发
DB::Get操作时,在内存中没有命中且Seek文件超过阈值时,触发
DB::CompactRange时,触发
Compaction带来的问题
写放大
从上面的compaction可以得知,当一个key频繁更新时,每次compaction在该key上都会导致重叠,
因此会 发生一次该key的搬移,导致实际的磁盘写量大于用户调用的写量。
读放大
leveldb是以文件为单位读取的,当Get一个已经被compaction搬移到深层次的key时,会发生多次文件的 读取,
导致实际的磁盘读量大于用户Get的调用量。同时compaction时也会产生大量的读取操作。
level的文件大小的限制
level0 有4个文件 每个1M 是4M
level1 十倍之 10M
level2 十倍之 100M
level3 1000M
level4 10G
level5 100G
level6 无限制
每一层文件的大小限制 为了控制每一层的文件是数量 进而优化每次major compaction的参与文件的多少和大小 优化效率
minor compaction的优先级高于major compaction 当需要进行minor compaction的时候发现有major compaction 则暂停major compaction
以进行minor compaction 因为minor compaction会影响到数据的插入
minor compaction
从memTable到sstFile 需要选择Level 根据memTable中的key的范围 如果和上层level中的数据有overlap 则直接合并到上层 但是
一般会是L1或者L2 这个也有参数控制
如果是比较新的key 则直接都生成在level0里面
Major compaction
从level0到上层level之间的合并
1.选择一个L层的文件,选择L+1层的所有key重叠的文件,与L层的文件做多路归并排序,生成新的文件到L+1层,原始的文件被删除。
记录L层文件的endKey
2.下次合并的时候,在L层中选择上次记录的endKey的近邻的key的文件用来合并。
3.如果L层的文件,没有和L+1层的有overlap,则直接更改指针,不发生文件的读写
4.选择L0层的文件时,会首先确定一个key range,但是由于L0的key在文件之间会有重叠,则需要选择该范围之内的
所有L0层的文件参与合并。
5.积分计算 计算每一层的积分 如果积分小于1 则不发生合并 如果大于1 则选择最大的一个 进行合并
寻找输入文件
正常合并 轮询选择 记录上一次的最大key 下次选择此key之后的文件
seek失效合并 则输入文件即该失效文件
sstFile
data block 固定大小存储kv数据
meta block 存储kv对应的filter 即bloom filter 可能存在多个filter 目前就一个
metaindex block 指向meta block的索引 目前就一个filter 所以也就一行记录
index block 指向data block的索引 包含data block的偏移和大小以及包含的key的范围
footer 指向索引的索引 包含metaindex和index
读取的时候,根据metaFile定位到sstFile,读取footer定位到block,进而读取metaBlock判断是否存在,如果存在再读取dataBlock
cache
table cache 缓存文件指针 metablock index-block
block cache 缓存数据 datablock indexblock
snapshot
insert sequence number 对应每一次的插入 亦即对应到一个key上
做快照 就只是保存一下这个number
读快照的时候 就需要读取所有小于这个Number的数据即可
LevelDB速记的更多相关文章
- leveldb 性能、使用场景评估
最近有个业务写远远大于读,读也集中在最近写入,这不很适合采用leveldb存储么,leveldb业界貌似ssdb用得挺广,花了两天时间就ssdb简单做下测试,以下总结. ssdb 是leveldb的r ...
- HTML5特性速记图
今天推荐大家一张HTML5特性速记图,供大家平时查阅,也可以打印放在电脑旁帮助速记.速查.此图笔者收集于网络图片.
- Golang语法与代码格式速记【转】
// Description: Golang语法与代码格式速记 // Author: cxy // Date: 2013-04-01 // Version: 0.3 // TODO 说明 // TOD ...
- leveldb源码分析--SSTable之Compaction
对于compaction是leveldb中体量最大的一部分,也应该是最为复杂的部分,为了便于理解我们首先从一些基本的概念开始.下面是一些从doc/impl.html中翻译和整理的内容: Level 0 ...
- leveldb 学习。
1)大概浏览了leveldb文档的介绍.本想逐步看代码,想想还是自己先实现一个看看如何改进. 2)完成了一个非常丑陋的初版,但是还是比初初版有进步. 3)key value的数据库,不允许有key重复 ...
- 解决: org.iq80.leveldb.DBException: IO error: C:\data\trie\000945.sst: Could not create random access file.
以太坊MPT树的持久化层是采用了leveldb数据库,然而在抽取MPT树代码运行过程中,进行get和write操作时却发生了错误: Caused by: org.fusesource.leveldbj ...
- 用Qt Creator 对 leveldb 进行简单的读写
#include <iostream> #include <string> #include <leveldb/db.h> #include <boost/l ...
- leveldb 学习笔记之VarInt
在leveldb在查找比较时的key里面保存key长度用的是VarInt,何为VarInt呢,就是变长的整数,每7bit代表一个数,第8bit代表是否还有下一个字节, 1. 比如小于128(一个字节以 ...
- leveldb源码学习系列
楼主从2014年7月份开始学习<>,由于书籍比较抽象,为了加深思考,同时开始了Google leveldb的源码学习,主要是想学习leveldb的设计思想和Google的C++编程规范.目 ...
随机推荐
- JetBrains PyCharm 2017.3注册码
JetBrains PyCharm 2017.3注册码 (1)在激活界面的License server输入:http://idea.liyang.io:或者:点击help→Register→Licen ...
- IDEA项目启动报Unable to open debugger port (127.0.0.1:51554): java.net.SocketException "socket closed"
启动报错: Unable to open debugger port (127.0.0.1:51554): java.net.SocketException "socket closed&q ...
- php 使用当前时间点进行时间范围查询
/** * 判断是否是吃早饭时间 */ $nowtime = time(); $start = strtotime('8:30:00'); $end = strtotime('9:30:00'); i ...
- discuzX3.2 X3.4网站漏洞修复 SQL注入与请求伪造攻击利用与修复
2018年12月9日,国内某安全组织,对discuz X3.2 X3.4版本的漏洞进行了公开,这次漏洞影响范围较大,具体漏洞是discuz 的用户前段SQL注入与请求伪造漏洞,也俗称SSRF漏洞,漏洞 ...
- 如何防御网站被ddos攻击 首先要了解什么是流量攻击
什么是DDOS流量攻击?我们大多数人第一眼看到这个DDOS就觉得是英文的,有点难度,毕竟是国外的,其实简单通俗来讲,DDOS攻击是利用带宽的流量来攻击服务器以及网站. 举个例子,服务器目前带宽是100 ...
- 笔记-python-动态添加属性
笔记-python-动态添加属性 1. 添加对象/类属性 添加对象属性 class Person(object): def __init__(self, newName, newAge): ...
- 使用java多线程分批处理数据工具类
最近由于业务需要,数据量比较大,需要使用多线程来分批处理,提高处理效率和能力,于是就写了一个通用的多线程处理工具,只需要实现自己的业务逻辑就可以正常使用,现在记录一下 主要是针对大数据量list,将l ...
- delphi 数据库中Connection与Query连接数量问题思考
今天闲着没事,测试了一下Connection连接MSSQL,可以承受多少连接. 1.看看ADOConnection的连接数:写了一个代码,动态创建,测试了10000个连接,花了大约5~10分钟创 ...
- CSS3复选框动画
本示例实现了两种单选按钮动画效果,一种是移动,一种是滑块,以下是html布局以及css样式 html:这里使用了label标签的for属性,以此来绑定radio <div class=" ...
- Hbase读写流程和寻址机制
写操作流程 (1) Client通过Zookeeper的调度,向RegionServer发出写数据请求,在Region中写数据. (2) 数据被写入Region的MemStore,直到MemStore ...