
Leveldb
文章平均质量分 88
sparkliang
新版优快云,查看&批准好友申请的地方在哪呢?
展开
-
Leveldb源码分析--1
【前言:看了一点oceanbase,没有意志力继续坚持下去了,暂时就此中断,基本上算把master看完了,比较重要的update server和merge server代码却没有细看。中间又陆续研究了hadoop的源码,主要是name node和写入pipeline。主要的目的是想看看name node对namespace的管理,以及hadoop在写入操作时,client、data nod原创 2013-02-05 22:58:28 · 59133 阅读 · 15 评论 -
Leveldb源码分析--14
9 LevelDB框架之1到此为止,基本上Leveldb的主要功能组件都已经分析完了,下面就是把它们组合在一起,形成一个高性能的k/v存储系统。这就是leveldb::DB类。这里先看一下LevelDB的导出接口和涉及的类,后面将依次以接口分析的方式展开。而实际上leveldb::DB只是一个接口类,真正的实现和框架类是DBImpl这个类,正是它集合了上面的各种组件。此外,还有Leveldb对版本原创 2013-04-10 17:55:44 · 12318 阅读 · 0 评论 -
Leveldb源码分析--4
4 Memtable之24.6 Comparator弄清楚了key,接下来就要看看key的使用了,先从Comparator开始分析。首先Comparator是一个抽象类,导出了几个接口。其中Name()和Compare()接口都很明了,另外的两个Find xxx接口都有什么功能呢,直接看程序注释: // Advanced functions: these are used to reduce t原创 2013-02-23 00:24:12 · 14075 阅读 · 7 评论 -
Leveldb源码分析--15
9 LevelDB框架之29.4 版本控制当执行一次compaction后,Leveldb将在当前版本基础上创建一个新版本,当前版本就变成了历史版本。还有,如果你创建了一个Iterator,那么该Iterator所依附的版本将不会被leveldb删除。在leveldb中,Version就代表了一个版本,它包括当前磁盘及内存中的所有文件信息。在所有的version中,只有一个是CURRENT。Ver原创 2013-04-15 09:29:38 · 14666 阅读 · 0 评论 -
Leveldb源码分析--16
10 Version分析之1先来分析leveldb对单版本的sstable文件管理,主要集中在Version类中。前面的10.4节已经说明了Version类的功能和成员,这里分析其函数接口和代码实现。Version不会修改其管理的sstable文件,只有读取操作。10.1 Version接口先来看看Version类的接口函数,接下来再一一分析。 // 追加一系列iterator到 @*ite原创 2013-04-19 13:46:21 · 10215 阅读 · 0 评论 -
Leveldb源码分析--17
10 Version分析之210.5 Version::UpdateStats()当Get操作直接搜寻memtable没有命中时,就需要调用Version::Get()函数从磁盘load数据文件并查找。如果此次Get不止seek了一个文件,就记录第一个文件到stat并返回。其后leveldb就会调用UpdateStats(stat)。Stat表明在指定key range查找key时,都要先seek原创 2013-05-11 20:27:41 · 10208 阅读 · 8 评论 -
Leveldb源码分析--19
11 VersionSet分析之211.4 LogAndApply()函数声明:Status LogAndApply(VersionEdit*edit, port::Mutex* mu)前面接口小节中讲过其功能:在currentversion上应用指定的VersionEdit,生成新的MANIFEST信息,保存到磁盘上,并用作current version,故为Log And Apply。参数ed原创 2013-06-03 11:11:09 · 9326 阅读 · 0 评论 -
Leveldb源码分析--18
11 VersionSet分析之1Version之后就是VersionSet,它并不是Version的简单集合,还肩负了不少的处理逻辑。这里的分析不涉及到compaction相关的部分,这部分会单独分析。包括log等各种编号计数器,compaction点的管理等等。11.1 VersionSet接口1 首先是构造函数,VersionSet会使用到TableCache,这个是调用者传入的。Table原创 2013-06-03 10:52:20 · 9625 阅读 · 0 评论 -
Leveldb源码分析--21
最近工作上事情太多,更新的也比较慢了。14 DB的查询与遍历分析完如何打开和关闭db,本章就继续分析如何从db中根据key查询value,以及遍历整个db。14.1 Get()函数声明:StatusGet(const ReadOptions& options, const Slice& key, std::string* value)从DB中查询key 对应的value,参数@options指定读原创 2013-09-05 13:22:58 · 11103 阅读 · 7 评论 -
Leveldb源码分析--22
14 DB的查询与遍历之214.4 DBIterLeveldb数据库的MemTable和sstable文件的存储格式都是(user key, seq, type) => uservalue。DBIter把同一个userkey在DB中的多条记录合并为一条,综合考虑了userkey的序号、删除标记、和写覆盖等等因素。从前面函数NewIterator的代码还能看到,DBIter内部使用了MergingI原创 2013-11-26 18:01:53 · 12561 阅读 · 7 评论 -
Leveldb源码分析--10
6 SSTable之46.6 遍历Table6.6.1 遍历接口Table导出了一个返回Iterator的接口,通过Iterator对象,调用者就可以遍历Table的内容,它简单的返回了一个TwoLevelIterator对象。见函数实现:Iterator* NewIterator(const ReadOptions&options) const;{ return NewTwoLevel原创 2013-03-23 09:28:33 · 8594 阅读 · 0 评论 -
Leveldb源码分析--13
8 FilterPolicy&Bloom之28.5 构建FilterBlock8.5.1 FilterBlockBuilder了解了filter机制,现在来看看filter block的构建,这就是类FilterBlockBuilder。它为指定的table构建所有的filter,结果是一个string字符串,并作为一个block存放在table中。它有三个函数接口: // 开始构建新的filt原创 2013-04-05 14:12:18 · 8401 阅读 · 1 评论 -
Leveldb源码分析--2
3 Int Coding轻松一刻,前面约定中讲过Leveldb使用了很多VarInt型编码,典型的如后面将涉及到的各种key。其中的编码、解码函数分为VarInt和FixedInt两种。int32和int64操作都是类似的。3.1 Decode首先是FixedInt编码,直接上代码,很简单明了。void EncodeFixed32(char* buf, uint32_t原创 2013-02-06 11:32:46 · 17633 阅读 · 2 评论 -
Leveldb源码分析--7
6 SSTable之1SSTable是Leveldb的核心之一,是表数据最终在磁盘上的物理存储。也是体量比较大的模块。6.1 SSTable的文件组织作者在文档doc/table_format.txt中描述了表的逻辑结构,如图6.1-1所示。逻辑上可分为两大块,数据存储区Data Block,以及各种Meta信息。1)文件中的k/v对是有序存储的,并且被划分到连续排列的原创 2013-03-06 22:14:52 · 14705 阅读 · 4 评论 -
Leveldb源码分析--3
4 Memtable之1Memtable是leveldb很重要的一块,leveldb的核心之一。我们肯定关注KV数据在Memtable中是如何组织的,秘密在Skip list中。4.1 用途在Leveldb中,所有内存中的KV数据都存储在Memtable中,物理disk则存储在SSTable中。在系统运行过程中,如果Memtable中的数据占用内存到达指定值(Optio原创 2013-02-23 00:06:07 · 20012 阅读 · 10 评论 -
Leveldb源码分析--8
6 SSTable之26.4 创建sstable文件了解了sstable文件的存储格式,以及Data Block的组织,下面就可以分析如何创建sstable文件了。相关代码在table_builder.h/.cc以及block_builder.h/.cc(构建Block)中。6.4.1 TableBuilder类构建sstable文件的类是TableBuil原创 2013-03-09 11:48:36 · 10150 阅读 · 2 评论 -
Leveldb源码分析--5
5 操作Log 1分析完KV在内存中的存储,接下来就是操作日志。所有的写操作都必须先成功的append到操作日志中,然后再更新内存memtable。这样做有两个有点:1可以将随机的写IO变成append,极大的提高写磁盘速度;2防止在节点down机导致内存数据丢失,造成数据丢失,这对系统来说是个灾难。在各种高效的存储系统中,这已经是口水技术了。5.1 格式在源码下的原创 2013-02-28 20:56:04 · 11681 阅读 · 3 评论 -
Leveldb源码分析--6
5 操作Log 2 5.3 读日志日志读取显然比写入要复杂,要检查checksum,检查是否有损坏等等,处理各种错误。5.3.1 类层次先来看看读取涉及到的类图,如图5.3-1。Reader主要用到了两个接口,一个是汇报错误的Reporter,另一个是log文件读取类SequentialFile。> Reporter的接口只有一个:void Co原创 2013-03-01 22:38:22 · 11059 阅读 · 2 评论 -
Leveldb源码分析--9
6 SSTable之36.5 读取sstable文件6.5.1 类层次Sstable文件的读取逻辑在类Table中,其中涉及到的类还是比较多的,如图6.5-1所示。图6.5-1Table类导出的函数只有3个,先从这三个导出函数开始分析。其中涉及到的类(包括上图中为画出的)都会一一遇到,然后再一一拆解。本节分析sstable的打开逻辑,后面原创 2013-03-16 18:21:44 · 9221 阅读 · 0 评论 -
Leveldb源码分析--11
7 TableCache这章的内容比较简单,篇幅也不长。7.1 TableCache简介TableCache缓存的是Table对象,每个DB一个,它内部使用一个LRUCache缓存所有的table对象,实际上其内容是文件编号{file number, TableAndFile*}。TableAndFile是一个拥有2个变量的结构体:RandomAccessFile*和Table*;TableCac原创 2013-03-30 18:50:33 · 8241 阅读 · 0 评论 -
Leveldb源码分析--12
8 FilterPolicy&Bloom之18.1 FilterPolicy因名知意,FilterPolicy是用于key过滤的,可以快速的排除不存在的key。前面介绍Table的时候,在Table::InternalGet函数中有过一面之缘。FilterPolicy有3个接口:virtual const char* Name() const = 0; // 返回filter的名字virtual原创 2013-04-01 12:53:18 · 9705 阅读 · 2 评论 -
Leveldb源码分析--20
12 DB的打开先分析LevelDB是如何打开db的,万物始于创建。在打开流程中有几个辅助函数:DBImpl(),DBImpl::Recover, DBImpl::DeleteObsoleteFiles, DBImpl::RecoverLogFile, DBImpl::MaybeScheduleCompaction。12.1 DB::Open()打开一个db,进行PUT、GET操作,就是前面的静态原创 2013-07-12 15:03:32 · 11611 阅读 · 2 评论