LevelDB Version

LevelDB Version

  Version 保存了当前磁盘以及内存中所有的文件信息,一般只有一个Version叫做"current" version(当前版本)。Leveldb还保存了一系列的历史版本,这些历史版本有什么作用呢?  

  当一个Iterator创建后,Iterator就引用到了current version(当前版本),只要这个Iterator不被delete那么被Iterator引用的版本就会一直存活。这就意味着当你用完一个Iterator后,需要及时删除它。

  当一次Compaction结束后(会生成新的文件,合并前的文件需要删除),Leveldb会创建一个新的版本作为当前版本,原先的当前版本就会变为历史版本。

  VersionSet 是所有Version的集合,管理着所有存活的Version。

  VersionEdit 表示Version之间的变化,相当于delta 增量,表示有增加了多少文件,删除了文件。下图表示他们之间的关系。

    Version0 +VersionEdit-->Version1

  VersionEdit会保存到MANIFEST文件中,当做数据恢复时就会从MANIFEST文件中读出来重建数据。

参考:http://www.cnblogs.com/haippy/archive/2011/12/04/2276064.html

时间: 2024-08-01 05:17:13

LevelDB Version的相关文章

leveldb version机制

该文章主要回答三个问题: leveldb 怎么管理因compact带来的文件变化? 当db关闭后重新打开时,如何恢复状态? 如何解决版本销毁文件变化和已经获取过的迭代器的冲突? 每次leveldb后台进行compact时, 会造成sst文件的变化.levedb利用version来管理了这些变化. compact前为Version1, compact后为Version2.  VersionSet利用链表将前后一系列的version组织起来.核心代码在db/version_set.h  db/ver

[levelDB] Version Manager

一.作用 LevelDB如何能够知道每一层有哪些SST文件:如何快速的定位某条数据所在的SST文件:重启后又是如何恢复到之前的状态的,等等这些关键的问题都需要依赖元信息管理模块.对其维护的信息及所起的作用简要概括如下: 记录Compaction相关信息,使得Compaction过程能在需要的时候被触发: 维护SST文件索引信息及层次信息,为整个LevelDB的读.写.Compaction提供数据结构支持: 负责元信息数据的持久化,使得整个库可以从进程重启或机器宕机中恢复到正确的状态: 记录Log

leveldb学习之version

到此为止,基本上leveldb的主要功能组件都已经分析完了,下面如何把它们组合在一起形成一个高效稳定的数据库,这就是DBimpl类和compact进程的工作. campact进程 为了均衡读写的效率,sstable文件分层次(level)管理,db预定义了最大的level值.compact负责将memtable持久化成sstable,以及均衡整个db中各level的sstable. 版本控制 当执行一次compaction后,Leveldb将在当前版本基础上创建一个新版本,当前版本就变成了历史版

Leveldb之version与version_set详细对比

version类包含的重要变量: VersionSet* vset_; // VersionSet to which this Version belongs Version* next_; // Next version in linked list Version* prev_; // Previous version in linked list double compaction_score_; int compaction_level_; std::vector<FileMetaDat

数据分析与处理之二(Leveldb 实现原理)

郑重声明:本篇博客是自己学习 Leveldb 实现原理时参考了郎格科技系列博客整理的,原文地址:http://www.samecity.com/blog/Index.asp?SortID=12,只是为了加深印象,本文的配图是自己重新绘制的,大部分内容与原文相似,大家可以浏览原始页面 :-),感兴趣的话可以一起讨论 Leveldb 的实现原理! LevelDb日知录之一:LevelDb 101 说起LevelDb也许您不清楚,但是如果作为IT工程师,不知道下面两位大神级别的工程师,那您的领导估计会

leveldb源码笔记

最近读了一下leveldb源码,leveldb最主要的操作就是get/set,因此从get/set的实现入手,了解一下实现机制. 之前也看过leveldb相关介绍以及别人的分析blog,已经有了一定了解.leveldb如其名,按照层级来组织数据,数据从内存到磁盘一层一层迁移.在内存中是通过skiplist来管理数据,而磁盘上则是一种名为SSTable(Sorted Strings Table)的结构来存储数据的. DB::Get实现 这个头文件include/leveldb/db.h定义了DB抽

[转载] leveldb日知录

原文: http://www.cnblogs.com/haippy/archive/2011/12/04/2276064.html 对leveldb非常好的一篇学习总结文章 郑重声明:本篇博客是自己学习 Leveldb 实现原理时参考了郎格科技系列博客整理的,原文地址:http://www.samecity.com/blog/Index.asp?SortID=12,只是为了加深印象,本文的配图是自己重新绘制的,大部分内容与原文相似,大家可以浏览原始页面 :-),感兴趣的话可以一起讨论 Level

tair源码分析——leveldb存储引擎使用

分析完leveldb以后,接下来的时间准备队tair的源码进行阅读和分析.我们刚刚分析完了leveldb而在tair中leveldb是其几大存储引擎之一,所以我们这里首先从tair对leveldb的使用和修改来窥探在这个分布式的存储引擎中是如何将area和bucket持久化到存储,并且方便bucket和area的处理的. 我们首先来看tair中key的结构,我们以大致梳理存储和查询一个KV的流程来确认key的处理.tair_client_api::put直接调用tair_client_impl:

leveldb学习:skiplist

leveldb中的memtable仅仅是一个封装类,它的底层实现是一个跳表. 跳表是一种基于随机数的平衡数据结构.其它的平衡数据结构还有红黑树.AVL树.但跳表的原理比它们简单非常多.跳表有点像链表,仅仅只是每一个节点是多层结构,通过在每一个节点中添加向前的指针提高查找效率.例如以下图: 在/leveldb/db目录下有跳表的实现skiplist.h和跳表的測试程序skiplist_test.cc. template<typename Key, class Comparator> class