深入leveldb-初步认识leveldb

    文章参考http://blog.chinaunix.net/uid-26575352-id-3245476.html

1. leveldb简介

    leveldb是google两位工程师实现的单机版k-v存储系统,具有以下几个特点

    1. key和value都是任意的字节数组,支持内存和持久化存储

    2. 数据都是按照key排序

    3. 用户可以重写排序函数

    4. 包含基本的数据操作接口,Put(key,value),Get(key),Delete(key)

    5. 多操作可以当成一次原子操作

    6. 用户可以通过生成snapshot,使得读取操作不受写操作影响,读取过程中看到最终数据一致性

    7. 支持迭代器对数据的操作

    8. 数据使用snappy自动压缩

    9. 外部操作(如文件系统操作等)通过一个虚拟接口使用,用户可以对操作系统进行定制相应操作

2. leveldb局限性

    1. leveldb非关系型数据库,不支持SQL查询也不支持索引

    2. 同一时间只支持单进程(支持多线程)访问db

    3. 不支持客户端-服务器模型,用户需要自己封装

3. leveldb基本框架

    LevelDb本质上是一套存储系统以及在这套存储系统上提供的一些操作接口。为了便于理解整个系统及其处理流程,我们可以从两个不同的角度来看待LevleDb:静态角度和动态角度。从静态角度,可以假想整个系统正在运行过程中(不断插入删除读取数据),此时我们给LevelDb照相,从照片可以看到之前系统的数据在内存和磁盘中是如何分布的,处于什么状态等;从动态的角度,主要是了解系统是如何写入一条记录,读出一条记录,删除一条记录的,同时也包括除了这些接口操作外的内部操作比如compaction,系统运行时崩溃后如何恢复系统等等方面

    leveldb做为存储系统,在整个系统运行过程中,基本的框架如下所示

   

    如图所示,leveldb的存储介质分为内存和磁盘两种。内存中有memtable和immutable memtable;磁盘中有log文件,manifest文件,Current文件以及分level的sstable文件;

    1). 当用户往db插入一条key-value数据的时候,会先写log文件,当写log成功之后再把当前记录写到memtable中。为什么写数据的时候要先写log文件呢,主要是因为新插入的数据会保存在内存中,为了防止系统崩溃导致新插入数据丢失,因此要先写log文件保证落地之后,再写内存。这样即使系统崩溃了,也能够从log中恢复出来。

    2). memtable中的数据是可读可写,当memtable的数据量达到一个数据量之后。当前的memtable变成了immutable memtable,只读不可修改。重新生成新的memtable和log文件,新来的数据写到新的log和memtable中。

    3). immutable memtable中的数据会被dump到磁盘中的sstable文件,磁盘中的sstable文件是有层级的,第一层level0到第n层leveln...,每个level都有很多sstable文件,每个文件都是按照key排好序。注意了level0和其它level不一样,level0中的sstable文件的key有可能重复,其它level的sstable文件的key保证不会有重复。

    4). 由于每个level中有许多sstable文件,每个sstable文件都有key range。所以需要一个文件来保存当前所有level中sstabel的key range。manifest文件主要就是用来存储每个level中的sstable的信息

        

     5). 随着系统不断的运行,每个level中的sstable文件可能会越来越多,这个时候db会自动把同一个level或者不同level中的sstable文件会进行merge。这个时候manifest就会发生变化,因此我们需要一个Current文件来记录当前最新的manifest文件。

     未完待续...

时间: 2024-08-07 03:24:29

深入leveldb-初步认识leveldb的相关文章

leveldb 测试结果-leveldb的测试结果怎么理解的问题。

问题描述 leveldb的测试结果怎么理解的问题. 最近对leveldb进行了一些测试,因为只是想与leveldb进行对比,不需要对其进行详细的了解,所以想请教测试结果问题. LevelDB: version 1.15 Date: Tue Nov 17 16:16:36 2015 CPU: 24 * Intel(R) Xeon(R) CPU E5-2620 0 @ 2.00GHz CPUCache: 15360 KB Keys: 16 bytes each Values: 200 bytes e

[leveldb] 学习leveldb第一个类Status

[TOC] 回顾上一篇文章<[leveldb] 初步探索 leveldb>的样例代码,是不是发现有个类比例简单:leveldb::Status,你发现它有status.ok()和status.ToString()方法.那怎么找到Status类的定义和成员方法的实现呢? 1. 第一步:把相关代码找出来 1-1 用grep 大法过滤内容 我们知道C++的类一般是这样定义的:class Status {...},我们grep在当前目前递归-r .全词匹配-w和半词匹配都搜不到,最后grep &quo

[leveldb] 初探 leveldb

[TOC] 1. leveldb 简介 leveldb 是 Google 用 C++ 开发的一个快速的 键值对存储数据库(持久化KV单机数据库),提供从字符串键到字符串值的有序映射,具有很高的随机写,顺序读/写性能,但是随机读的性能很一般,也就是说,LevelDB很适合应用在查询较少,而写很多的场景. LevelDB应用了 LSM (Log Structured Merge) 策略,lsm_tree对索引变更进行延迟及批量处理,并通过一种类似于归并排序的方式高效地将更新迁移到磁盘,降低索引插入开

Caffe代码导读(3):LevelDB例程

Caffe自带例子Cifar10中使用leveldb存储输入数据,为此我们研究一下怎样使用它.安装步骤可以参考http://blog.csdn.net/kangqing2003/article/details/6658345 Leveldb库提供了一种持续的键值对存储方式.键和值可以为任意字节数组.键存储顺序可由用户定义的比较函数决定. 打开一个数据库 Leveldb数据库有个与文件系统目录相对应的名字.数据库的所有内容都保存在这个目录中.下面例子展示了怎样打开一个数据库,必要时创建它: #in

google数据库Leveldb小试及实现原理详解

leveldb地址,地址:https://code.google.com/p/leveldb/ 暂时不支持windows,虽然有windows分支,但是已经两年每更新了,按照网上的方法,折腾了一下,还是有几个函数无法链接,所以打算延后再折腾. linux下就方便很多了,直接下载源码,make all编译,就会生成a和so文件,我用的是a文件 写了下面的一个例子,还是比较顺利  代码如下 复制代码 #include <iostream> #include "leveldb/db.h&q

C++ stringstream介绍,使用方法与例子

From: http://www.usidcbbs.com/read-htm-tid-1898.html   C++引入了ostringstream.istringstream.stringstream这三个类,要使用他们创建对象就必须包含sstream.h头文件. istringstream类用于执行C++风格的串流的输入操作. ostringstream类用于执行C风格的串流的输出操作. strstream类同时可以支持C风格的串流的输入输出操作. istringstream类是从istre

python实现爬取千万淘宝商品的方法

  本文实例讲述了python实现爬取千万淘宝商品的方法.分享给大家供大家参考.具体实现方法如下: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69

2014 年中国开源优秀项目获奖

开源中国开源世界"高峰论坛(简称"论坛")每年6月由中国开源软件推进联盟(COPU)主办自2006年起,已成功举办八届,是我国开源界一年一度的盛 会,影响 深远,受到国内外开源组织.人士的高度关注,是开源爱好者获取最新开源讯息的有效平台,有力地促进了开源领域国际与国内.企业与 政府.企业与社区组织之间的合作与发展,已为国内开源界对外交流合作的一个重要窗口.今年第九届论坛已于2014年6月27-28日(周五至 周六)在北京隆重召开. 会上论坛发布了中国开源优秀项目和中国开源杰出

做一个类似网络爬虫的下载软件,关于消重哪种方法最好

问题描述 各位前辈好,感谢进到帖子里看我的问题,我的需求是这样的,目前正在做一个类似网络爬虫的下载软件,需要对url进行消重,目前我知道的有两种方案,请问哪种好一些.第一种直接hashset,在开始运行执行把历史url载入到hsahset中,然后进行比对消重第二种leveldb,听说leveldb的存储是十亿级别的,这个肯定够用的,但是完全没用过,不知道有没有哪位前辈用过 解决方案 解决方案二:反正当初我用的是mysqlurl进行md5编码然后存入表中使用的unique修饰程序自身缓存4KW条最