leveldb源码阅读总结
对leveldb的架构分析
奔跑的哇牛
这个作者很懒,什么都没留下…
展开
-
【leveldb】Recover(二 十 四):数据还原恢复流程
leveldb能保证写入的数据持久化磁盘而不丢失吗?答案是不完全。还未写入到logfile中的数据,如果设备掉电或者leveldb退出,这些数据会丢失。已写入到logfile,如果设备掉电或者leveldb异常退出,这些数据在进行recover时可找回。那leveldb启动时进行Recover,Recover的到底是哪些数据呢?在向leveldb写入一条数据时,大致流程如下:1、一个memtable对应一个logfile。2、在compact memtable后,会进行logfile删除原创 2020-09-23 22:34:11 · 1682 阅读 · 2 评论 -
【leveldb】Compact(二 十 三):Major Compaction
上一篇我们介绍了进行Major Compaction所需要的对象数据实体Compaction。对整个Compact流程的介绍可点此Compact触发流程本片我们来着重介绍下Compact的Major Compaction流程。Major的作用原创 2020-09-19 17:32:00 · 818 阅读 · 1 评论 -
【leveldb】Compact(二 十 二):Major Compaction-Compaction的封装
在正式开始讲解Major Compaction之前我们需要知道Compact的Compaction数据怎么来的。leveldb将要进行Compact的数据封装成了一个class Compaction类,Compaction的数据结构以及怎么来的及做了些什么事,这是本篇要着重介绍的。Compaction调用当调用后台压缩函数DBImpl::BackgroundCompaction()时,根据手动Compact还是自动Compact来产生Compaction。void DBImpl::Backgroun原创 2020-09-14 23:15:55 · 614 阅读 · 1 评论 -
【leveldb】Compact(二 十 一):Minor Compaction
本来想写关于Version源码注解的,想想如果只是简单的Stick下源码也没什么意思,看后面放到Github上再来放链接,这样看可能好些。接下来准备分两篇来介绍下Compact流程。本篇主要是介绍Compact流程和Minor Compaction流程详解。Compact触发流程图有点大,看不清的可点击放大查看。接下来着重讲解下minor Compaction。Minor Compaction简介Minjor Compaction就是将内存中的Memtable持久化到磁盘变成SSTab.原创 2020-09-06 18:04:37 · 780 阅读 · 1 评论 -
【leveldb】Version(二十):图解Version相关结构及流程
对Version注解准备分两篇来说明,Version在leveldb中的重要性值得分两篇文章去记录。第一篇主要对Version的流程好结构进行图解说明,第二篇则是源码注释解读。通过两篇文章的学习可以对Version有个清晰的认识。初探磁盘文件结构Version结构流程...原创 2020-08-29 12:35:19 · 1795 阅读 · 1 评论 -
【leveldb】BloomFilter(十九):理论及实现
有关BloomtFilter的理论知识就不详细介绍了,有兴趣的可以点这里BloomFilter理论推导。本篇主要是记录下BloomFilter一些关键知识点并梳理下leveldb中对BloomFilter的应用。理论影响BlootFilter准确率的参数有:哈希函数的个数 k;布隆过滤器位数组容量 m;布隆过滤器插入的数据量 n为保持准确率得出的结论如下:当哈希函数个数 k=ln(2)*(m/n) 时查询出错的概率最小。当不考虑最优哈希函数k时,假设错误率为 ϵ ,在查询错原创 2020-07-05 18:44:37 · 735 阅读 · 1 评论 -
【leveldb】Cache(十八):BlockCache
针对BlockCache的结构说明已在此篇文章中说明leveldb 内部整体Cache结构说明。BlockCache中缓存的就是实际的KV数据,也就是DataBlock数据。这里为便于理解,可看如下BlockCache结构图: 图1BlockCache:key: 当前table对应的缓存id + BlockData在ldb文件中的偏移位。Value: 就是真实的BlockData数据。注:因为打开的ldb(就是sst)文件中的BlockData都是存放于全局一份的BlockCache中的原创 2020-07-04 12:43:29 · 953 阅读 · 1 评论 -
【leveldb】Cache(十七):TableCache
通过上一篇文章leveldb的Cache整体结构说明, 我们基本上知道了tableCache在整个leveldb中的作用以及上下文类关系,它主要缓存leveldb落地的ldb文件结构在内存中的信息。本篇主要是对代码流程的解读。table_cache.hnamespace leveldb {class Env;class TableCache { public: TableCache(const std::string& dbname, const Options& opti原创 2020-07-04 12:36:59 · 621 阅读 · 1 评论 -
【leveldb】Cache(十六):leveldb 内部整体Cache结构说明
本篇主要讲解下leveldb内部所使用的Cache整体结构及初始化好流程。Cache主要分TableCache和BlockCache。Cache结构1.TableCache 图1TableCache:Key: 落地存储文件名称,例如000021.ldb文件,file_number就是000021。Value: 包括两部分,一是ldb文件句柄,二是ldb文件的table信息,详细的内容已在图1中介绍。注:当前版本是1.22版本,落地的文件好像不是sst格式,而是ldb格式。2.Bloc原创 2020-07-04 12:31:51 · 871 阅读 · 1 评论 -
【leveldb】TwoLevelIterator(十五)
在分析SSTable代码过程中涉及到了二级迭代器,此篇借此展开分析下。二级迭代器的存在便于对SSTable的DataBlock数据进行访问,其结构如下: 图1对于SSTable来说:Level_1是Index Block迭代器;Level_2是指向DataBlock迭代器。源码解读namespace leveldb {namespace {//设置二级迭代器时传入的回调函数typedef Iterator* (*BlockFunction)(void*, const ReadOp原创 2020-06-14 17:54:30 · 530 阅读 · 0 评论 -
【leveldb】SSTable(十四):SSTable 读写流程
SSTable就是leveldb最后落地存储的文件,针对SSTable详细格式介绍可点此SSTable存储结构说明。本篇主要是对SSTable的读写流程代码研读。写流程写流程就是按照SSTable的格式去写,阅读起来并不是太复杂。namespace leveldb {struct TableBuilder::Rep { Rep(const Options& opt, WritableFile* f) : options(opt), index_block_o原创 2020-06-14 17:48:57 · 778 阅读 · 0 评论 -
【leveldb】SSTable(十三):Filter Block
上一篇主要介绍了DataBlock,本篇则开始讲解Filter Block,其在SSTable中的结构可点此链接SSTable结构说明。Filter Block中存的都是Data Block中的key(key是经过处理再存入到FilterBlock中),其作用就是提高SSTable的读取效率。当查询一个key时,可以快速定位这个key是否在当前SSTable中,其流程是当进行一个key查询时,先通过index block中的二分法确定key在哪个Data Block中,取出这个Data Block的off原创 2020-06-07 18:08:42 · 944 阅读 · 0 评论 -
【leveldb】SSTable(十二):Data Block
DataBlock属于SSTable中Block的一种,关于DataBlock与SSTable的关系,可点此链接查看SSTable结构说明。本篇主要是对DataBlock的读写流程解读。这里为便于理解,则将DataBlock格式再次放出: 图1写流程写流程很简单,就是按照DataBlock格式去封装。block_builder.hnamespace leveldb {struct Options;class BlockBuilder { public: explicit Bloc原创 2020-06-07 17:04:39 · 684 阅读 · 0 评论 -
【leveldb】SSTable(十一):存储结构说明
针对SSTable的结构说明,这篇博客已有介绍,可点此链接查看,leveldb整体架构。本篇是针对SStable结构的进一步扩展介绍说明。系列文章的分析都是基于leveldb 1.22版本分析的。SSTable文件结构落地的SSTable文件结构如下图1图1其中Data block、Meta block、Metablock index、index block都属于Block,Footer是单独的数据格式。1.Block结构图22.Footer结构Footer结构共占用48Byte,组原创 2020-05-31 18:41:27 · 1131 阅读 · 0 评论 -
【leveldb】Memtable-实现(十)
通过对Memtable所使用到的Key的详细介绍Key介绍,接下来对Memtable的实现讲解则轻松的多。一、结构Memtable以一个个Entry为单元进行存储,Entry结构图如下:图1Klength = UserKey.length + 8 (sequenceNumber + ValueType);Vlength = Value.length。二、关联类Internal...原创 2020-03-28 21:43:50 · 728 阅读 · 0 评论 -
【leveldb】Memtable-基础知识(九)
在阅读Memtable代码的过程中涉及到leveldb的各种key,只有对这些key理解清楚了,读起Memtable才会很轻松,所以这篇着重讲解下这些key。一、Key看图1,先有个初步印象: 图11.SequenceNumber+Typeleveldb每次更新(put/delete)操作都拥有一个版本,由SequenceNumber来标识,整个leveldb有一个全局值保存着当前使用...原创 2020-03-22 23:58:06 · 733 阅读 · 0 评论 -
【leveldb】变长编码Varint(八)
在阅读Memtable处理流程时看到了Varint32、Varint64,一开始不是太理解,导致阅读Memtable出现一定障碍,所以这里就单独列出来讲下,下文用Varint特指Varint32。一、什么是变长编码【定义】Varint是一种通过一个或多个字节来表示整数的方法。即之前用固定字节数来表示一个正数,Varint通过可变的字节数来表示一个整数。【范围】对于32位(Varint32...原创 2020-03-17 23:37:11 · 1571 阅读 · 0 评论 -
【leveldb】SkipList(七)
SkipList(跳表)数据结构是用于Memtable,Immutable Memtable表中,对于此二表的作用点此查看Memtable作用。Memtable是内存中的表,用于存储插入的KV数据。SkipList的作用就是解决KV的快速插入和查询。一、介绍SkipList使用空间换时间的设计思路,通过构建多级索引来提高查询的效率,实现了基于链表的“二分查找”。跳表是一种动态数据结构,支持快...原创 2020-03-07 18:53:28 · 503 阅读 · 0 评论 -
【leveldb】Arena(六)
我们知道频繁的向系统申请内存是很容易造成内存碎片的,如果申请内存很小则更严重。leveldb针对这种小内存的临时频繁申请使用了Arena来解决。Arena只是粗粒度的内存管理,只用在了MemTable和skiplist中,是作为一个局部临时对象来使用并未用在全局,Arena的内部实现是存在内存浪费的。一、结构二、源码arena.hnamespace leveldb {class A...原创 2020-02-16 18:42:12 · 372 阅读 · 0 评论 -
【leveldb】Log(五)
针对Log文件的作用及格式介绍系列文章中有介绍,可点此处查看Log文件介绍说明。整个Log模块涉及到的文件如下:一、文件结构log_format.h:描述Log格式及Record类型。log_reader.h、log_reader.cc:读模块实现。log_writer.h、log_writer.cc:写模块实现。二、格式信息说明很简单,获取信息如下:一共有四种Record类...原创 2020-01-18 12:03:48 · 671 阅读 · 3 评论 -
【leveldb】Slice(四)
leveldb内部没有使用string,而是使用了一个Slice数据结构来指向一块数据,每次给参数都给Slice而不用给数据的拷贝,这样就省去内存的拷贝。leveldb所涉及到KV操作的接口都是用的Slice。注意事项:如果是多线程调用同一个Slice的const方法,则不用关注多线程同步问题,如果是非const方法则由调用则保证多线程之间的同步;使用Slice之前,必须保证Slice指向...原创 2019-12-22 22:31:40 · 461 阅读 · 0 评论 -
【leveldb】Options、ReadOptions、WriteOptions(三)
Options:主要用于控制DB的一些操作。ReadOptions:用于控制读操作属性。WriteOptions:用于控制写操作属性。一、Options// Options to control the behavior of a database (passed to DB::Open) <!用于控制DB的一些特性>struct LEVELDB_EXPORT Opti...原创 2019-12-22 18:40:02 · 1681 阅读 · 0 评论 -
【leveldb】整体架构(二)
注:本文转自http://cighao.com/2016/08/14/leveldb-source-analysis-02-structure/感觉被转作者已经写的很清晰,文中所描述的一些信息当前最新版本可能已经支持,一些关键点也有待后续的阅读确认。一、整体结构LevelDB 作为存储系统,数据记录的存储介质包括内存以及磁盘文件,当 LevelDB 运行了一段时间,此时我们给 LevelDB...转载 2019-12-15 23:27:46 · 1074 阅读 · 1 评论 -
【leveldb】编译与安装(一)
对leveldb的介绍这里就不说了,最近准备对leveldb学习了解下,学习之前先编译安装能运行。【环境】编译开发工具vs2015。一开始用的是VS2013,但是vs2013对C++11支持不是太好,会导致leveldb编译问题,所以直接换成了vs2015。boost版本是boost_1-55-0。网上说leveldb对boost有依赖,所以就安装了,具体哪些部分依赖还有待确认。cmak...原创 2019-11-10 20:36:02 · 1036 阅读 · 0 评论