`
erwinbarton
  • 浏览: 12608 次
  • 性别: Icon_minigender_1
  • 来自: 佛山
社区版块
存档分类
最新评论

LevelDB的边边角角之一

 
阅读更多

LevelDB的边边角角之一

0, Varint64

变长数字,主要用于压缩数字,来源于protobuf

1, Log Table的文件格式

Google recordio的文件格式

Checksum

Original size

Compressed Size

(un/compressed)

Data

 

Checksum

Original size

Compressed Size

(un/compressed)

Data

 

 

Checksum: 32bits;

Original Size: 64bits,数据的原始大小;

Compressed Size: 64bits压缩后的大小,如果不是压缩,就为0

Data: 实际的数据

 

LevelDB memtable: Arena+SkipList

Arena

所有的block都保存在一个vector<char*>

1,当前blockfreeSpace>size直接返回;

2如果size大于blockSize/4new_block返回,否则只new_block并用block其中的一部分(这样浪费了当前的block剩余空间)

SkipList

 

LevelDB log文件格式

block := record* trailer

record :=

checksum: uint32 //crc32c of type and data[], little-endian

length: uint32 // little-endian?其实是uint16

type: uint8 // enum of { FULL, FIRST, MIDDLE, LAST}

data: uint[length]

 

下图为一个Block(32KB), log file由一连串block组成。

Record 1

Checksum

Length

Type

data

 

Record 2...

Record n

Trailer

 

 

recordio format的对比:

好处:可以直接跳过一个一个block

坏处:暂时对小的record没有packing,并没有压缩数据,但都可以通过添加type进行支持。

 

LevelDB table文件格式

immutable, 不可修改的。

k/v 对都是有序地按序写在data block中,data/index block均可以被压缩(状态位在?)

meta block就是下面的filter/stat meta block,也可以支持更多的。

每个block的大小?

indexfooter放在文件最后是宜于生成文件,并方便open文件后重定位。

 

Data block 1

Data block 2

...

Data block N

Meta block 1

Meta block K

Meta Index block

Index block

Footer (fixed size: starts at file_size - sizeof(footer))

BlockHandle:

offset: varint64

size: varint64

相当于内部indexdata的指针

metaindex

key name of meta block

value BlockHandle 指向meta block

index,每个data block一条记录

key string>=last_key

value BlockHandle指向data block

footer 这是定长的。

metaindex_handle: char[p], block handle for metaindex

index_handle: char[q], block handle for index

padding: char[40-p-q], 填充zeroed bytes

40==2*BlockHandle::kMaxEncodedLength

magic: fixed64

filter meta block

[TBD]

stat meta block

data size/ index size/ key size(uncompressed)/ value size(uncompressed)

number of entries/ number of data blocks

 

2, log file到合并 table file

log file,每个update都添加到log里,当大于(默认4MB)会转为sorted table

内存中的影像是memtable。生成sstyoung level-0)后,这个log就会给删掉,memtable?

sorted tablescompactionsst分为一系列的levelsyoung level,也就是level-0,中的文件可能会有覆盖范围的keyoverlapping key),而level-L(L>0)则每个文件的key范围都是没有互相覆盖的。

level-L的所有文件总大小超过10^L(MB)时,会用其中一个level-L的文件File1+所有key范围与File1有覆盖的level-(L+1)的文件File2..k 合并成一个新的level-L+1文件。

这样做的好处?单条的读?bulk的批量读?



Manifest一个普通的log file保存每个level下的所有sst, 并对应的key ranges,以及其他的meta data

Current普通文本,里面就指向当前在用的Manifest文件

其他的Lock文件和dbtmp等等

A, Reference:

1) leveldb tutorial, http://leveldb.googlecode.com/svn/trunk/doc/index.html

2) leveldb brief of implements, http://leveldb.googlecode.com/svn/trunk/doc/impl.html

3) table file format, http://leveldb.googlecode.com/svn/trunk/doc/table_format.txt

4) log file format, http://leveldb.googlecode.com/svn/trunk/doc/log_format.txt

 

5) blog 很详细的一个分析 http://blog.csdn.net/sparkliang/article/category/1342001

分享到:
评论

相关推荐

    LevelDB手册(LevelDB Handbook).pdf

    LevelDB是一种以写入性能见长的存储引擎,它采用了典型的LSM树(Log Structured-Merge Tree)的数据结构来实现,这是为了优化写入性能而特别设计的数据结构。LSM树放弃了部分读取性能来换取更快的写入能力,尤其适用...

    C#操作LevelDB数据

    LevelDB是一个由Google开发的轻量级、高性能的键值对存储系统,适用于各种场景,如嵌入式应用或作为应用程序的数据缓存。 首先,让我们了解C#与LevelDB的集成。在.NET环境中,我们可以使用第三方库如DotNet.LevelDB...

    leveldb.zip

    LevelDB的核心数据结构之一是Block,它是LSM Tree的基础组件。每个Block是一个固定大小的数据块,包含一系列键值对。LevelDB通过将数据分块存储,实现了高效的空间利用和快速的查找。Block内采用紧凑格式存储,键值...

    leveldb-windows-python3.6编译版

    标题"leveldb-windows-python3.6编译版"指的是这是一个针对Windows操作系统、Python 3.6版本编译的LevelDB数据库的接口库。LevelDB是Google开发的一个轻量级、高性能的键值对存储系统,适用于嵌入式应用或作为其他...

    leveldb-1.18 源码及 leveldb实现解析.PDF

    leveldb作为一个高效、轻量级的数据库引擎,广泛应用于各种场景,如嵌入式系统、日志存储、缓存等。下面我们将深入探讨leveldb的关键特性、设计思想以及1.18版本中的重要改进。 一、 leveldb概述 leveldb是一款...

    leveldb源码工程Windows版

    【leveldb源码工程Windows版】是一个专为在Windows操作系统上编译和运行的开源键值存储系统 leveldb 的源代码包。leveldb由Google开发,它提供了一个高效的、可嵌入式的数据存储解决方案,适用于各种应用场景,如...

    leveldb,leveldb到java的端口.zip

    leveldb是一款高效、轻量级的键值存储库,由Google开发并开源,主要用于实现高性能的数据持久化。它的设计目标是提供一个简单且可扩展的接口,支持快速的读写操作,尤其适用于嵌入式系统和大规模分布式环境。本文将...

    ARM32 架构的 php_leveldb数据库

    自己编译的leveldb.so文件。 这是一个适用于arm32架构的php模块, leveldb数据库懂得都懂 下载文件中含一个压缩包(这是源码,同样含有编译样例) 一个 leveldb.so文件 这是我编译的自己用的leveldb模块,试过了...

    windows上编译leveldb生成的leveldb.lib

    在Windows环境下,使用Visual Studio 2013编译开源的LevelDB库并生成`leveldb.lib`静态库文件,是一项常见的任务。LevelDB是一个轻量级的键值存储库,由Google开发,用于存储小到中等大小的数据集。它的设计目标是...

    Leveldb lmdb性能对比

    Leveldb lmdb性能对比Leveldb lmdb性能对比Leveldb lmdb性能对比Leveldb lmdb性能对比Leveldb lmdb性能对比Leveldb lmdb性能对比Leveldb lmdb性能对比Leveldb lmdb性能对比Leveldb lmdb性能对比Leveldb lmdb性能对比...

    levelDB 日知录 by 格朗科技

    leveldb是一个由Google工程师Jeff Dean和Sanjay Ghemawat发起的开源项目,它是C++实现的,可以处理十亿级别的Key-Value型数据持久性存储。Jeff Dean和Sanjay Ghemawat是Google重量级的工程师,也是Google大规模...

    leveldb测试程序

    linux下c++实现leveldb的添加数据,查询数据,对于学习理解leveldb很有帮助

    leveldb源码

    LevelDB是由Google开发的一个轻量级、高性能、单进程的键值对存储系统,主要用于存储和检索大量的键值数据。它被设计为一个简单的接口,支持快速的读写操作,并且在磁盘上的数据组织上进行了优化,以提供良好的性能...

    mnist-leveldb.7z

    标题中的“mnist-leveldb.7z”是一个压缩包文件,用于深度学习环境,特别是Caffe框架,其中包含了MNIST数据集的LevelDB格式版本。MNIST数据集是机器学习领域非常经典的手写数字识别数据集,常用于训练和验证图像分类...

    leveldb.pyd python3.6

    在Python编程中,有时我们需要使用到高效的数据存储和检索系统,这时LevelDB便是一个不错的选择。LevelDB是Google开发的一个轻量级、高性能的键值对存储系统,主要用于实现简单的数据持久化。而当我们使用Python时,...

    LevelDB.Net.x64

    LevelDB.Net.x64 是一个专为64位操作系统设计的C#封装库,它使得开发者可以方便地在.NET环境中利用Google的LevelDB键值存储系统。LevelDB是一款高效的、轻量级的开源数据库,由Google开发,主要用于本地数据持久化...

    leveldb-master.rar

    LevelDB,由Google开源的一款轻量级、高性能的键值对存储数据库,以其简洁的API、高效的数据结构和出色的性能赢得了广大开发者青睐。在Windows环境下,我们可以进行编译以生成动态库,以供其他应用程序调用。本文将...

    leveldb-1.18

    LevelDB 是 Google 开源的一个轻量级、高性能的键值对存储系统,适用于嵌入式应用和服务器环境。它被设计为一个简单的接口,用于在磁盘上存储键值对数据,并提供高效的读写操作。在 LevelDB 1.18 版本中,我们能够...

    leveldb 源码

    LevelDB是由Google开源的一款轻量级、高性能的键值对存储系统,它被设计用于在本地文件系统上高效地存储和检索大量数据。这个数据库引擎支持简单的键值对操作,适合用作日志、缓存或者作为其他复杂数据库系统的底层...

    Go-levigo是LevelDB的一个Go包装

    4. **数据持久化**:LevelDB的核心特性之一是数据的持久化,即使在系统崩溃或电源断电后,数据也能被正确恢复。Go-levigo继承了这一优点,保证了数据的安全性。 5. **版本控制**:LevelDB支持多版本控制,Go-levigo...

Global site tag (gtag.js) - Google Analytics