美文网首页
LevelDB原理深入学习

LevelDB原理深入学习

作者: 蓝Renly | 来源:发表于2018-11-18 20:06 被阅读0次

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操作,也就是说要么全部成功要么全部失败;
  • 双向迭代器
  • 快照:提供对某个时间点的数据库状态的引用.

相关文章

网友评论

      本文标题:LevelDB原理深入学习

      本文链接:https://www.haomeiwen.com/subject/ltzgfqtx.html