该文档主要说明leveldb使用到文件,以及分级和文件合并的逻辑

leveldb的实现原理和Bigtable类似,不过在文件结构组织上存在着差异。

每个数据库的文件都存储在单独的目录结构下面。

文件

日志文件

日志文件 (*.log) 按序保存着最近的操作。每一个更新都会被追加到日志末端。当日志文件大小达到预先定义的大小,就会被转化成一个 sort table,并且会创建一个新的日志文件用于新的操作。

当前日志文件在内存会有一份拷贝 memtable。每次查询操作都会读取该拷贝,所以读取操作每次获取到最新的被记录的操作。

Sorted Table

一个 Sorted Table (*.sst) 按照 key 的字母序保存着记录序列。每条记录中保存的是 key 对应的 value,或者是一个删除标记。

Sorted Table 安装层级组织,每个层级都会有一系列这样的文件。由日志文件生成的 Sorted Table 会被放在年轻的级别上,也就是 level-0。当年轻级别上的文件数超过限制后,所有年轻的文件会被和 level-1 有重复的文件合并,生成一系列新的的 level-1 文件。

在年轻级别的不同文件中可以存在相同的key。然而在其他层级的文件中不能包含重复的key。设字母 L 表示层级的层数 (L>=1)。当合并生成 level-L 的文件大小超过 (10L)MB 的时候,所有 level-(L+!)有重叠key 的文件都会被合并以生成一系列新的 level-(L+1)的文件。为最小化昂贵的seek开销,这些merge操作通过批量的读写操作,逐步的将新的更新从young level迁移到最大的level下。

Manifest 清单文件

清单文件记录每一级的 Sorted Tables,及对应的 key 的范围和其他重要的元信息。每次重新打开数据库都会创建一个新的清单文件。清单文件的格式和日志差不多,服务状态的改变都会被追加到这个日志文件中。

Current

指明当前使用的清单文件名称

Info logs

Informational messages are printed to files named LOG and LOG.old.

Others

Other files used for miscellaneous purposes may also be present (LOCK, *.dbtmp).

Level 0

当日志文件超过一定大小后:

  • 创建一个新的 memtable 和日志文件用于记录新的操作
  • 后台操作:
    • 将旧的 memtable 的内容写到一个 sstable 中
    • 废弃旧的 memtable
    • 删除旧的日志文件和旧的 memtable
    • 把新的 sstable 添加到 level-0 里

Compactions,压缩

当 level-L 的大小超过限制的时候,会在后台线程对其进行压缩。压缩操作会选择 level-L 的一个文件以及 level-(L+1) 有 key 重复的文件。在压缩后,旧的文件会被废弃。注意:由于 level-0不同文件中可能存在重复的key,所以需要特殊处理。压缩 level-0 时,可以选择多个文件。

合并将选中的文件生成一系列新的 level-(L+1)层的文件。如果新生成的文件中,有达到限制,我们会切换到该文件继续新一级的合并。如果正在生成的 level-(L+1)文件包含 key 的范围已经和 10+ 个 level-(L+2)文件有重合,也需要继续往下合并,这样可以保证后面的合并不会涉及太多的文件。

旧的文件会被废弃,新的文件会被添加的清单文件中。

每一个层级的压缩都是在 key 区间内轮转的。比如在 level L ,合并后会将合并文件的最后一个key tmp记录下来。下一次合并的时候,就从tmp往后的第一个文件开始(如果没有这样的文件,那么就重头开始)

压缩时会删除重复的值。并且将废弃那些包含删除标记的key。

Timing

Level-0 压缩最多会读4个 level-0的文件,最差情况加会使用所有 level-1 的文件。那么就是读 14M 写14M。

非level-0的压缩,会从 level-L 选择一个 2M 的文件。最差情况下,会有 12 个拥有重复key的 level L+1的文件——(10 是因为 level-L+1 的文件大小是 level-L 的10倍,另外2 是因为 level-L 的文件一般是没有对齐的)。因此合并操作需要读26M数据写26M数据。假设,磁盘IO操作是 100M/s,最差情况压缩需要0.5s。

如果限制后台写的速度,10%的速度,那么一个压缩操作需要5s。如果用户以10M/s的速度写入数据,那么就会有大量的 level-0 文件产生(会有50个)。这可能会显著增加读操作的开销,因为每次读操作都需要merge更多的文件。

解决方案1:为了降低文件问题的影响,我们可以提升日志文件转换层level-0文件的限制。负面影响是,需要更多的内存保存对应的 memtable.

解决方案2:当level 0下的文件数上升很快时,我们可以人为地降低写操作速率。

解决方案3:尽量降低merge的开销。由于大多数的level 0下的文件的block都已经缓存在cache里了,因此我们只需要关注merge迭代过程中的O(N)的复杂度。

转载于:https://www.cnblogs.com/kkfnui/p/leveldb-wen-dang-implhtml-yue-du-ji-lu.html

leveldb 文档 impl.html 阅读记录相关推荐

  1. leveldb 文档

    1. leveldb 文档 1.1. index.md 1.1.1. 常规操作 1.1.2. 进阶操作 1.2. impl.md 1.3. File 1.4. Log files 1.5. Sort ...

  2. 计算机二级考试试题在线看,【TOP182015年全国计算机二级考试试题题库.doc文档免费在线阅读材料】...

    TOP182015年全国计算机二级考试试题题库.doc文档免费在线阅读 <2015年全国计算机二级考试试题题库.doc>由会员分享,可免费在线阅读全文,更多与<TOP182015年全 ...

  3. 计算机基础在线阅读,TOP16[定稿]计算机基础教案(上下册).doc文档免费在线阅读...

    <[定稿]计算机基础教案(上下册).doc>由会员分享,可免费在线阅读全文,更多与<TOP16[定稿]计算机基础教案(上下册).doc文档免费在线阅读>相关文档资源请在帮帮文库 ...

  4. 解决Adobe Arcobat Reader DC打开PDF提示:正在准备文档以供阅读,请稍后

    解决Adobe Arcobat Reader DC打开PDF提示:正在准备文档以供阅读,请稍后 解决Adobe Arcobat Reader DC打开PDF提示:正在准备文档以供阅读,请稍后 问题描述 ...

  5. 自从学会Python后,无视百度文库VIP,所有文档免费下载阅读

    最近要用到百度文库查资料,但是很多都需要付费VIP或者下载券,还不能复制,就有点苦逼! 还好小编会Python,在Python面前真的所有VIP都是小意思,啥视频网站,资料网站等等,统统无视收费机制! ...

  6. 计算机文化在线阅读,TOP18[定稿]计算机文化基础教案34171.doc文档免费在线阅读...

    <[定稿]计算机文化基础教案34171.doc>由会员分享,可免费在线阅读全文,更多与<TOP18[定稿]计算机文化基础教案34171.doc文档免费在线阅读>相关文档资源请在 ...

  7. 计算机中考在线评分模拟卡,TOP30广西南宁市2016届中考权威预测模拟数学试卷一解析版.doc文档免费在线阅读(模版2)...

    <广西南宁市2016届中考权威预测模拟数学试卷(一)(解析版).doc>由会员分享,可免费在线阅读全文,更多与<TOP30广西南宁市2016届中考权威预测模拟数学试卷(一)(解析版) ...

  8. html文档 手机分页阅读,HTML书本分页(HTML book-like pagination)

    HTML书本分页(HTML book-like pagination) 如何在一个WebKit浏览器中将一个HTML文件的内容分割成一个屏幕尺寸的块来"分页"呢? 每个" ...

  9. im4java 文档_im4java学习---阅读documentation文档

    Utilities----im提供的一些工具类 ①.读取图片文件信息---Info类 我们之前的做法: op.format("width:%w,height:%h,path:%d%f,siz ...

最新文章

  1. ROS上同时预览depth,IR,RGB 调试记录
  2. Cell子刊:中科院遗传发育所周俭民组发现特异靶向病原菌致病力的植物天然产物并阐明作用机制
  3. 信息管理代码分析二读取二进制文件数据
  4. android 获取activity当前view
  5. 4.01~~Median
  6. 项目第二周冲刺第六天
  7. 中国证券期货业南方信息技术中心二期约1.5万个机柜建设项目EPC总包定了!
  8. UVa 11027 - Palindromic Permutation 回文串,组合加搜索
  9. oracle简体版,oracle|Navicat中文网站
  10. yuki翻译器钩子_git hooks钩子
  11. 交流电的有效值rms值_交流电路的功率三角因数原来是这样理解的
  12. android mtk 按键,Android 4.0 虚拟按键、手机模式、平板模式(转)
  13. Java复习-对象的回收与垃圾的回收
  14. SearchView去除下划线
  15. 查找存储过程中的错误位置
  16. 最新带后台收录的娱乐导航网网站源码
  17. openGL 中 glColor3f()函数 颜色设定
  18. 场效应管和三极管的区别
  19. 干货面试教程!java识别图片验证码
  20. anaconda一次性更新所有安装库

热门文章

  1. 仿minecraft游戏 linux,【图片】【Codea制作仿MineCraft3D游戏】Craft Ver. 0.1发布(开源)【codea吧】_百度贴吧...
  2. python需要的基础_推荐收藏!小白不要怕!一周学全Python面试基础(2)
  3. 浏览器怎么清理缓存_Mac系统浏览器缓存清理工具
  4. Leaflet文档阅读笔记-Quick Start Guide笔记
  5. Qt实践| HTTP知识点-Qt填充referer请求头盗取图片
  6. java题-如何递归遍历一个文件夹下的所有文件
  7. C/C++中如何使用typedef给函数指针取别名使其更具可读性
  8. hive 如何将数组转成字符串_hive详细笔记(八)-Hive之列转行和行转列(附带讲解视频 )...
  9. c#endread怎么打印出来_C#教程之打印和打印预览
  10. java 标记_Java中的标记语句块?