LevelDb日知录之二整体架构

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

本节所讲的整体架构主要从静态角度来描述,之后接下来的几节内容会详述静态结构涉及到的文件或者内存数据结构,LevelDb日知录后半部分主要介绍动态视角下的LevelDb,就是说整个系统是怎么运转起来的。

LevelDb作为存储系统,数据记录的存储介质包括内存以及磁盘文件,如果像上面说的,当LevelDb运行了一段时间,此时我们给LevelDb进行透视拍照,那么您会看到如下一番景象:

从图中可以看出,构成LevelDb静态结构的包括六个主要部分:内存中的MemTable和Immutable MemTable以及磁盘上的几种主要文件:Current文件,Manifest文件,log文件以及SSTable文件。当然,LevelDb除了这六个主要部分还有一些辅助的文件,但是以上六个文件和数据结构是LevelDb的主体构成元素。

LevelDb的Log文件和Memtable与Bigtable论文中介绍的是一致的,当应用写入一条Key:Value记录的时候,LevelDb会先往log文件里写入,成功后将记录插进Memtable中,这样基本就算完成了写入操作,因为一次写入操作只涉及一次磁盘顺序写和一次内存写入,所以这是为何说LevelDb写入速度极快的主要原因。

Log文件在系统中的作用主要是用于系统崩溃恢复而不丢失数据,假如没有Log文件,因为写入的记录刚开始是保存在内存中的,此时如果系统崩溃,内存中的数据还没有来得及Dump到磁盘,所以会丢失数据(Redis就存在这个问题)。为了避免这种情况,LevelDb在写入内存前先将操作记录到Log文件中,然后再记入内存中,这样即使系统崩溃,也可以从Log文件中恢复内存中的Memtable,不会造成数据的丢失。

当Memtable插入的数据占用内存到了一个界限后,需要将内存的记录导出到外存文件中,LevleDb会生成新的Log文件和Memtable,原先的Memtable就成为Immutable Memtable,顾名思义,就是说这个Memtable的内容是不可更改的,只能读不能写入或者删除。新到来的数据被记入新的Log文件和Memtable,LevelDb后台调度会将Immutable Memtable的数据导出到磁盘,形成一个新的SSTable文件。SSTable就是由内存中的数据不断导出并进行Compaction操作后形成的,而且SSTable的所有文件是一种层级结构,第一层为Level 0,第二层为Level 1,依次类推,层级逐渐增高,这也是为何称之为LevelDb的原因。

SSTable中的文件是Key有序的,就是说在文件中小key记录排在大Key记录之前,各个Level的SSTable都是如此,但是这里需要注意的一点是:Level 0的SSTable文件(后缀为.sst)和其它Level的文件相比有特殊性:这个层级内的.sst文件,两个文件可能存在key重叠,比如有两个level 0的sst文件,文件A和文件B,文件A的key范围是:{bar, car},文件B的Key范围是{blue,samecity},那么很可能两个文件都存在key=”blood”的记录。对于其它Level的SSTable文件来说,则不会出现同一层级内.sst文件的key重叠现象,就是说Level L中任意两个.sst文件,那么可以保证它们的key值是不会重叠的。这点需要特别注意,后面您会看到很多操作的差异都是由于这个原因造成的。

SSTable中的某个文件属于特定层级,而且其存储的记录是key有序的,那么必然有文件中的最小key和最大key,这是非常重要的信息,LevelDb应该记下这些信息。Manifest就是干这个的,它记载了SSTable各个文件的管理信息,比如属于哪个Level,文件名称叫啥,最小key和最大key各自是多少。下图是Manifest所存储内容的示意:

图中只显示了两个文件(manifest会记载所有SSTable文件的这些信息),即Level 0的test.sst1和test.sst2文件,同时记载了这些文件各自对应的key范围,比如test.sstt1的key范围是“an”到“banana”,而文件test.sst2的key范围是“baby”到“samecity”,可以看出两者的key范围是有重叠的。

Current文件是干什么的呢?这个文件的内容只有一个信息,就是记载当前的manifest文件名。因为在LevleDb的运行过程中,随着Compaction的进行,SSTable文件会发生变化,会有新的文件产生,老的文件被废弃,Manifest也会跟着反映这种变化,此时往往会新生成Manifest文件来记载这种变化,而Current则用来指出哪个Manifest文件才是我们关心的那个Manifest文件。

以上介绍的内容就构成了LevelDb的整体静态结构,在LevelDb日知录接下来的内容中,朗格科技会首先介绍重要文件或者内存数据的具体数据布局与结构。

接下来是广告时间,后面还有更精彩的内容等着您,请您马上离开,不要回来,敬请期待下节内容:LevelDb日知录之三(log文件)。

转载: http://www.samecity.com/blog/Article.asp?ItemID=86 /* 版权声明:可以任意转载,转载时敬请标明:文章来自朗格科技*/

LevelDb日知录之二整体架构相关推荐

  1. LevelDb日知录

    目录 LevelDb日知录之一:LevelDb 简介 LevelDb日知录之二:整体架构 LevelDb日知录之三:log文件 LevelDb日知录之四:SSTable文件 LevelDb日知录之五: ...

  2. LevelDb日知录(Leveldb 实现原理)

    转自:http://www.cnblogs.com/haippy/archive/2011/12/04/2276064.html 郑重声明:本篇博客是自己学习 Leveldb 实现原理时参考了郎格科技 ...

  3. LevelDb日知录之三 log文件

    /* 版权声明:可以任意转载,转载时敬请标明:文章来自朗格科技*/ LevelDb日知录之三 log文件 上节内容讲到log文件在LevelDb中的主要作用是系统故障恢复时,能够保证不会丢失数据.因为 ...

  4. 博主新书:《大数据日知录:架构与算法》目录

    <大数据日知录:架构与算法>目录 4目录编辑 第0 章 当谈论大数据时我们在谈什么................ 1 0.1 大数据是什么........................ ...

  5. 大数据日知录:架构与算法

    大数据丛书 大数据日知录:架构与算法(大数据领域专家力作,专注大数据架构和算法,全面梳理大数据相关技术) 张俊林 著   ISBN 978-7-121-24153-6 2014年9月出版 定价:69. ...

  6. 大数据丛书 大数据日知录:架构与算法

    大数据丛书 大数据日知录:架构与算法(大数据领域专家力作,专注大数据架构和算法,全面梳理大数据相关技术) 张俊林 著   ISBN 978-7-121-24153-6 2014年9月出版 定价:69. ...

  7. 《BIG DATA大数据日知录 架构和算法》读书笔记

    2019独角兽企业重金招聘Python工程师标准>>> <BIG DATA大数据日知录 架构和算法>读书笔记 博客分类: 架构 分布式计算 1.数据分片和路由 Hash ...

  8. 《大数据日知录:架构与算法》前言

       <大数据日知录:架构与算法>前言 像移动互联网.O2O.可穿戴设备等概念一样,"大数据"从甫一提出到飓风般席卷并风靡全球,从最初的技术名词到形成渗透各行各业的社会 ...

  9. 大数据日知录要点整理

    大数据日知录要点整理 第0 章 当谈论大数据时我们在谈什么 1  NOSQL选型:kv-cassandra.dynamo,列式存储-HBase,图存储-Neo4j 社交网络数据存储适合用图数据库,而实 ...

最新文章

  1. hibernate mysql annotation_hibernate学习笔记03-- hibernate + mysql + Annotation
  2. Vue中使用Axios传递数组参数给SpringBoot后台时的实现方式
  3. 中文分词工具jieba中的词性类型(转载)
  4. ORACLE导出导入意外终止导致 ORACLE initialization or shutdown in progress 问题解决
  5. VMware虚拟机中CentOS网络设置
  6. java初学者指南_Java代理初学者指南
  7. jquery函数加载及生成随机数
  8. 一定质量的封闭气体被压缩后_螺杆压缩机转子型线设计原则及发展过程
  9. oracle汉字转首字母大写,oracle job定时更新表中文姓名对应拼音字段
  10. php过滤空格和回车,php如何去掉空格换行
  11. 外圣内王适用于互联网行业吗?
  12. 用电器开关应该接在火线上还是零线上
  13. winuser.h(10105,3): error C2059: 语法错误:“(”
  14. 文化财经SAR指标计算(一)
  15. 开通微信小店显示:系统繁忙,请稍后再试怎么回事?如何解决?
  16. 苹果开发者账号购买流程
  17. manjaro gnome配置白天夜晚自动切换对应主题
  18. 建立自己的图像数据集
  19. 第一天作业二 三级菜单的实现
  20. opencv(c++)几何变换------图像平移、旋转、缩放、翻转、剪贴

热门文章

  1. 编写C++语言程序,在歌手大奖赛中,输入10名评委为某选手的打分成绩,去掉一个最高分,去掉一个最低分,求该选手最后得分。
  2. python自动化下载_selenium+python自动化--文件下载弹窗处理(PyKeyboard)
  3. 一文读懂5G射频终端行业
  4. 调试程序DEBUG命令说明
  5. win10 镜像文件资源
  6. 公交查询php源码,公交查询源码android
  7. 【leetcode 66题 之 13 机器人的运动范围】
  8. Mac无法挂载exfat磁盘怎么办?
  9. html5游戏开发-零基础开发RPG游戏-开源讲座(四)-游戏脚本化地图跳转
  10. python char数组_Python char数组声明