LevelDb本质上是一套存储系统以及在这套存储系统上提供的一些操作接口。为了便于理解整个系统及其处理流程,我们可以从两个不同的角度来看待LevleDb:静态角度和动态角度。
从静态角度,可以假想整个系统正在运行过程中(不断插入删除读取数据),此时我们给LevelDb照相,从照片可以看到之前系统的数据在内存和磁盘中是如何分布的,处于什么状态等;
从动态的角度,主要是了解系统是如何写入一条记录,读出一条记录,删除一条记录的,同时也包括除了这些接口操作外的内部操作比如compaction,系统运行时崩溃后如何恢复系统等等方面。
本节所讲的整体架构主要从静态角度来描述,之后接下来的几节内容会详述静态结构涉及到的文件或者内存数据结构,LevelDb日知录后半部分主要介绍动态视角下的LevelDb,就是说整个系统是怎么运转起来的。
LevelDb作为存储系统,数据记录的存储介质包括内存以及磁盘文件,如果像上面说的,当LevelDb运行了一段时间,此时我们给LevelDb进行透视拍照,那么您会看到如下一番景象:
从图中可以看出,构成LevelDb静态结构的包括六个主要部分:内存中的MemTable和Immutable MemTable以及磁盘上的几种主要文件:Current文件,Manifest文件,log文件以及SSTable文件。当然,LevelDb除了这 六个主要部分还有一些辅助的文件,但是以上六个文件和数据结构是LevelDb的主体构成元素。
LevelDb的Log文件和Memtable与Bigtable论文中介绍的是一致的,当应用写入一条Key:Value记录的时候,LevelDb会 先往log文件里写入,成功后将记录插进Memtable中,这样基本就算完成了写入操作,因为一次写入操作只涉及一次磁盘顺序写和一次内存写入,所以这 是为何说LevelDb写入速度极快的主要原因。
Log文件在系统中的作用主要是用于系统崩溃恢复而不丢失数据,假如没有Log文件,因为写入的记录刚开始是保存在内存中的,此时如果系统崩溃,内存中的 数据还没有来得及Dump到磁盘,所以会丢失数据(Redis就存在这个问题)。为了避免这种情况,LevelDb在写入内存前先将操作记录到Log文件 中,然后再记入内存中,这样即使系统崩溃,也可以从Log文件中恢复内存中的Memtable,不会造成数据的丢失。
当Memtable插入的数据占用内存到了一个界限后,需要将内存的记录导出到外存文件中,LevleDb会生成新的Log文件和Memtable,原先 的Memtable就成为Immutable Memtable,顾名思义,就是说这个Memtable的内容是不可更改的,只能读不能写入或者删除。新到来的数据被记入新的Log文件和 Memtable,LevelDb后台调度会将Immutable Memtable的数据导出到磁盘,形成一个新的SSTable文件。SSTable就是由内存中的数据不断导出并进行Compaction操作后形成 的,而且SSTable的所有文件是一种层级结构,第一层为Level 0,第二层为Level 1,依次类推,层级逐渐增高,这也是为何称之为LevelDb的原因。
SSTable中的文件是Key有序的,就是说在文件中小key记录排在大Key记录之前,各个Level的SSTable都是如此,但是这里需要注意的 一点是:Level 0的SSTable文件(后缀为.sst)和其它Level的文件相比有特殊性:这个层级内的.sst文件,两个文件可能存在key重叠,比如有两个 level 0的sst文件,文件A和文件B,文件A的key范围是:{bar, car},文件B的Key范围是{blue,samecity},那么很可能两个文件都存在key=”blood”的记录。对于其它Level的 SSTable文件来说,则不会出现同一层级内.sst文件的key重叠现象,就是说Level L中任意两个.sst文件,那么可以保证它们的key值是不会重叠的。这点需要特别注意,后面您会看到很多操作的差异都是由于这个原因造成的。
SSTable中的某个文件属于特定层级,而且其存储的记录是key有序的,那么必然有文件中的最小key和最大key,这是非常重要的信 息,LevelDb应该记下这些信息。Manifest就是干这个的,它记载了SSTable各个文件的管理信息,比如属于哪个Level,文件名称叫 啥,最小key和最大key各自是多少。下图是Manifest所存储内容的示意:
图中只显示了两个文件(manifest会记载所有SSTable文件的这些信息),即Level 0的test.sst1和test.sst2文件,同时记载了这些文件各自对应的key范围,比如test.sstt1的key范围是“an”到 “banana”,而文件test.sst2的key范围是“baby”到“samecity”,可以看出两者的key范围是有重叠的。
Current文件是干什么的呢?这个文件的内容只有一个信息,就是记载当前的manifest文件名。因为在LevleDb的运行过程中,随着 Compaction的进行,SSTable文件会发生变化,会有新的文件产生,老的文件被废弃,Manifest也会跟着反映这种变化,此时往往会新生 成Manifest文件来记载这种变化,而Current则用来指出哪个Manifest文件才是我们关心的那个Manifest文件。
以上介绍的内容就构成了LevelDb的整体静态结构,在LevelDb日知录接下来的内容中,朗格科技会首先介绍重要文件或者内存数据的具体数据布局与结构。
http://blog.chinaunix.net/uid-26111972-id-3342224.html
相关推荐
LevelDB 的 ctypes 绑定 现有的三个接口( 、 、 )使用 Python C API 并编译与 LevelDB 的 C++ 接口一起使用的 Python 模块。 这个 Python 模块只是简单地使用 ctypes 库到 LevelDB 的 C 接口 - 使其在 Python 实现...
leveldb-sharp 是一个可移植的 C# 绑定,用于的 C API。 支持最广泛的 leveldb-sharp 在 3-clause BSD 许可下可用,这与 LevelDB 使用的许可相同。 leveldb-sharp 使用 C API 而不是 C++ API 来实现可移植性。 ...
LevelDb是能够处理十亿级别规模Key-Value型数据持久性存储的C++ 程序库。LevelDb是一个持久化存储的KV系统,和Redis这种内存型的KV系统不同,LevelDb不会像Redis一样狂吃内存,而是将大部分数据存储到磁盘上。
leveldb: https://github.com/google/leveldbphp-leveldb: https://github.com/reeze/php-leveldbswoole: https://github.com/swoole/swoole-src安装安装swoole和leveldb扩展,并下载源码pecl install swoole ...
leveldb-darwin 适用于Mac / iOS的入门使用要使用Carthage将leveldb-darwin集成到您的Xcode项目中,请在您的Cartfile指定它: github "cybertk/leveldb-darwin" ~> 1.18使用 要使用CocoaPods将leveldb-darwin集成到...
leveldb服务器 由ZeroMQ支持的LevelDB的异步服务器和客户端。 依存关系 安装LevelDB 参考 安装ZeroMQ 请参考 Instanll pyzmq pip install pyzmq 安装pyleveldb pip install leveldb 入门指南 启动服务器 python ...
有关通用LevelDB API,请参见 。 该项目添加了2个其他端点: GET /最新/:前缀 假定从ASCII密钥开始,获取与此前缀开头的最大密钥关联的值。 $ http get http://pi:5000/latest/temperature HTTP/1.1 200 OK ...
leveldb-tools提供了一种简单的方法来以常规的,易于解析的格式转储LevelDB(尤其是 )数据库。 它还提供了一种从此类格式化输入中加载的方式。 用法 转储LevelDB数据库 leveldb-tools dump my.leveldb >my....
leveldb-handbook Leveldb-handbook是基于...作者仅是在自身阅读源码的过程中不断记录与学习,若有错误之处,欢迎大家以提交PR的方式进行更正与完善! 该项目使用readTheDoc工具进行托管,读者可以到 进行在线的阅读。
LevelDb2Anvil 将Minecraft: Pocket Edition Maps( LevelDB ) 转换为Minecraft Maps( Anvil ) 。 信息: 最新版本(v2.0)适用于 Minecraft: Pocket Edition 1.0 或更高版本生成的地图。 块在PC和PE中具有不同的ID会...
LevelDB Shell描述LevelDB Shell提供了一个简单的命令行外壳来执行基本操作,即在LevelDB数据库上进行放置,获取和删除。建造请使用以下命令从源代码构建外壳工具: gradle clean distTar用法执行./bin/leveldb-...
leveldb 基准测试 一堆使用 node.js 使用 leveldb 测试各种事物的基准测试 批量插入 ... 事实证明,保留二级索引的速度大约是其两倍,但这显然会占用更多的磁盘空间。 索引大小 leveldb 使用 snapp
LevelDB 学习笔记2:合并.doc
级别数据库 在Rust中完全兼容LevelDB的实现。 (任何不兼容都是错误!) 该实现与原始实现非常接近; 通常,您会看到相同的算法按1:1转换,并且类(结构)和方法名称相似或相同。 注意:我不支持将此库用于您关心的...
自己编译的leveldb.so文件。 这是一个适用于arm32架构的php模块, leveldb数据库懂得都懂 下载文件中含一个压缩包(这是源码,同样含有编译样例) 一个 leveldb.so文件 这是我编译的自己用的leveldb模块,试过了...
Windows下用于和Python leveldb包装帮助程序项目,用于在Windows下使用CMake编译Python leveldb包装器。 C ++库(leveldb及其依赖项)应从的缓存中获取用法检查并设置build_leveldb.bat中的配置,例如set CAFFE_PATH...
如果需要重新生成leveldb.dylan则还需要从$PATH的回购构建melange 。 leveldb.dylan由melange自动生成,不应进行编辑。 您必须安装Google的Snappy库。 请参阅TODO.rst以获取要解决的问题的更完整列表。
LevelDB 学习笔记1:布隆过滤器.doc
LevelDB是Google编写的快速键值存储库,提供了从字符串键到字符串值的有序映射。 作者:Sanjay Ghemawat( )和Jeff Dean( ) 特征 键和值是任意字节数组。 数据按键存储。 调用者可以提供自定义比较功能来覆盖...
非常适合新手看的leveldb入门资料,整体架构,各模块功能概述,实现原理等!