LevelDB原理补充
对于LevelDB的学习,在博客和维基以及百度上学习了一些基本概念和原理,但还是不是十分理解,于是重新进入LevelDB的官网,终于在最下面找到了一篇关于LevelDB介绍及原理说的比较好的文章,于是总结一些!
文章网址:http://web.archive.org/web/20130502222338/http://dailyjs.com/2013/04/19/leveldb-and-node-1/
共有三个部分,主要介绍LevelDBV及其原理,以及其在node中的使用,我这里只总结第一篇,关于LevelDB的介绍以及原理.
1.LevelDB是什么
LevelDB是一个开源的,无依赖,内含键值对的数据库.
C++写的,主语基于Google的BigTable写的.
特点
- 任意字节数组:key和value都被视为简单的字节数组,因此可以说长度任意;
- 按键排序:默认情况下,按键的字典顺序排序.
- 压缩存储:Snappy压缩裤是一个可选的依赖项,可以减少LevelDB存储的磁盘大小.
- 基本操作:Get(),Put(),Del(),Batch()
基础架构
Log Structured Merge(LSM) Tree
日志结构化合并树
[图片上传失败...(image-2d0fe6-1542542626540)]
- 1.LevelDB的所有写入都直接存储到Log和"memtable"中;
- 2.日志定期刷新到已排序的字符串表文件中(SST);
- 3.数据读取存储将合并这两个不同的数据结构,即log和SST文件.SST表示成熟数据,日志表示新数据.(包括删除操作);
- 4.可配置cache加速常见的读取.
字符串排序表文件(SST)
- 1.每个SST文件限制为~2M;
- 2.文件内部划分为4K块,每个块在一次操作中读取;
- 3.最后一个块指向每个数据块开始的索引,并且它是区块开始处的键值对的key.
- 4.bloom过滤器用来加速查找,允许快速的索引扫描去查找获取包含想要的key的块.
- 5.块中的键可以共享前缀;
- 6.块中的key的任何公共前缀将被存储一次.后续entry(条目)仅存储唯一后缀.
- 7.块中的entry(条目)数量固定之后,共享前缀会被重置;
- 8.共享前缀意味着key的详细命名空间不会导致过多的存储需求;
表文件层次结构
表文件不是以简单的顺序存储,而是按照一系列级别进行组织.这是LevelDB中的"级别".
来自log中的entry直接被组织到级别0,一组最多4个文件.当其它条目的强制级别0多于4个文件时,将选择其中一个SST文件并与级别1的SST文件合并,这是一组最多10MB的文件.此过程继续,如果级别溢出,一次以以文件形式与下一级别重叠的SST文件合并.
[图片上传失败...(image-41c09c-1542542626540)]
日志: | 最大大小为4MB(可配置),然后刷新为一组0级SST文件 |
---|---|
0级: | 最多4个SST文件,然后一个文件压缩到1级 |
1级: | 最大总大小为10MB,然后将一个文件压缩为级别2 |
2级: | 最大总大小为100MB,然后将一个文件压缩为3级 |
3级以上: | 最大总大小为10 x之前的级别,然后将一个文件压缩到下一级别 |
0↠4SST,1↠10M,2↠100M,3↠1G,4↠10G,5↠100G,6↠1T,7↠10T
在该数据库中,您拥有大量的成熟数据和更多不稳定的新数据集;
高级功能
- 批处理操作:提供原子的集合的Put和Del操作,也就是说要么全部成功要么全部失败;
- 双向迭代器
- 快照:提供对某个时间点的数据库状态的引用.
网友评论