Basic Compaction

为了保持LSM的读操作相对较快,维护并减少sstable文件的个数是很重要的,所以让我们更深入的看一下合并操作。这个过程有一点儿像一般垃圾回收算法。

当一定数量的sstable文件被创建,例如有5个sstable,每一个有10行,他们被合并为一个50行的文件(或者更少的行数)。这个过程一 直持续着,当更多的有10行的sstable文件被创建,当产生5个文件时,它们就被合并到50行的文件。最终会有5个50行的文件,这时会将这5个50 行的文件合并成一个250行的文件。这个过程不停的创建更大的文件。像下图:

上述的方案有一个问题,就是大量的文件被创建,在最坏的情况下,所有的文件都要搜索。

Levelled Compaction

更新的实现,像 LevelDB 和 Cassandra解决这个问题的方法是:实现了一个分层的,而不是根据文件大小来执行合并操作。这个方法可以减少在最坏情况下需要检索的文件个数,同时也减少了一次合并操作的影响。

按层合并的策略相对于上述的按文件大小合并的策略有二个关键的不同:

  1. 每一层可以维护指定的文件个数,同时保证不让key重叠。也就是说把key分区到不同的文件。因此在一层查找一个key,只用查找一个文件。第一层是特殊情况,不满足上述条件,key可以分布在多个文件中。
  2. 每次,文件只会被合并到上一层的一个文件。当一层的文件数满足特定个数时,一个文件会被选出并合并到上一层。这明显不同与另一种合并方式:一些相近大小的文件被合并为一个大文件。

这些改变表明按层合并的策略减小了合并操作的影响,同时减少了空间需求。除此之外,它也有更好的读性能。但是对于大多数场景,总体的IO次数变的更多,一些更简单的写场景不适用。

总结

所以, LSM 是日志和传统的单文件索引(B+ tree,Hash Index)的中立,他提供一个机制来管理更小的独立的索引文件(sstable)。

通过管理一组索引文件而不是单一的索引文件,LSM 将B+树等结构昂贵的随机IO变的更快,而代价就是读操作要处理大量的索引文件(sstable)而不是一个,另外还是一些IO被合并操作消耗。

如果还有不明白的,这还有一些其它的好的介绍。

http://leveldb.googlecode.com/svn/trunk/doc/impl.html

and here

关于 LSM 的一些思考

为什么 LSM 会比传统单个树结构有更好的性能?

我们看到LSM有更好的写性能,同时LSM还有其它一些好处。 sstable文件是不可修改的,这让对他们的锁操作非常简单。一般来说,唯一的竞争资源就是 memtable,相对来说需要相对复杂的锁机制来管理在不同的级别。

所以最后的问题很可能是以写为导向的压力预期如何。如果你对LSM带来的写性能的提高很敏感,这将会很重要。大型互联网企业似乎很看中这个问题。 Yahoo 提出因为事件日志的增加和手机数据的增加,工作场景为从 read-heavy 到 read-write。。许多传统数据库产品似乎更青睐读优化文件结构。

因为可用的内存的增加,通过操作系统提供的大文件缓存,读操作自然会被优化。写性能(内存不可提高)因此变成了主要的关注点,所以采取其它的方法,硬件提升为读性能做的更多,相对于写来说。因此选择一个写优化的文件结构很有意义。

理所当然的,LSM的实现,像LevelDB和Cassandra提供了更好的写性能,相对于单树结构的策略。

Beyond Levelled LSM

这有更多的工作在LSM上, Yahoo开发了一个系统叫作 Pnuts, 组合了LSM与B树,提供了更好的性能。我没有看到这个算法的开放的实现。 IBM和Google也实现了这个算法。也有相关的策略通过相似的属性,但是是通过维护一个拱形的结构。如 Fractal Trees, Stratified Trees.

这当然是一个选择,数据库利用大量的配置,越来越多的数据库为不同的工作场景提供插件式引擎。 Parquet 是一个流行的HDFS的替代,在很多相对的文面做的好很(通过一个列格式提高性能)。MySQL有一个存储抽象,支持大量的存储引擎的插件,例如 Toku (使用 fractal tree based index)。

Mongo3.0 则包含了支持B+和LSM的 Wired Tiger引擎。许多关系数据库可以配置索引结构,使用不同的文件格式。

考虑被使用的硬件,昂贵的SSD,像FusionIO有更好的随机写性能,这适合本地更新的策略方法。更便宜的SSD和机械盘则更适合LSM。

延伸阅读

  • There is a nice introductory post

    https://www.igvita.com/2012/02/06/sstable-and-log-structured-storage-leveldb/.
    

  • The LSM description in this
    http://www.eecs.harvard.edu/~margo/cs165/papers/gp-lsm.pdf
    

    is great and it also discusses interesting extensions.

  • These three posts provide a holistic coverage of the algorithm:
    http://leveldb.googlecode.com/svn/trunk/doc/impl.html, http://www.datastax.com/dev/blog/leveled-compaction-in-apache-cassandra and http://www.quora.com/How-does-the-Log-Structured-Merge-Tree-work.
    

  • The original Log Structured Merge Tree pape
    r http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.44.2782&rep=rep1&type=pdf
    

    . It is a little hard to follow in my opinion.

  • The Big Table paper
    http://static.googleusercontent.com/media/research.google.com/en/archive/bigtable-osdi06.pdf
    

    is excellent.

  • http://highscalability.com/blog/2014/8/6/tokutek-white-paper-a-comparison-of-log-structured-merge-lsm.html
    

    on High Scalability.

  • Recent work on
    http://researcher.ibm.com/researcher/files/us-wtan/DiffIndex-EDBT14-CR.pdf
    

    which builds on the LSM concept.

  • http://blog.empathybox.com/post/24415262152/ssds-and-distributed-data-systems
    

    on SSDs and the benefits of LSM

来自:

http://lcblog.sinaapp.com/?p=223

转载于:https://www.cnblogs.com/bonelee/p/6343523.html

LSM树——LSM 将B+树等结构昂贵的随机IO变的更快,而代价就是读操作要处理大量的索引文件(sstable)而不是一个,另外还是一些IO被合并操作消耗。...相关推荐

  1. 【python Excel操作】1-批量读取统一文件夹下Excel中固定行列值,并合并到一张Excel中

    -参考这位博主的代码原文链接 批量读取了统一文件夹下所有Excel的固定行列值,并合并写入一张Excel中 def to_one_excel(dir):dfs = []#for循环,遍历文件夹下所有E ...

  2. 012-数据结构-树形结构-哈希树[hashtree]、字典树[trietree]、后缀树

    一.哈希树概述 1.1..其他树背景 二叉排序树,平衡二叉树,红黑树等二叉排序树.在大数据量时树高很深,我们不断向下找寻值时会比较很多次.二叉排序树自身是有顺序结构的,每个结点除最小结点和最大结点外都 ...

  3. 【数据结构】树与树的表示、二叉树存储结构及其遍历、二叉搜索树、平衡二叉树、堆、哈夫曼树与哈夫曼编码、集合及其运算

    1.树与树的表示 什么是树? 客观世界中许多事物存在层次关系 人类社会家谱 社会组织结构 图书信息管理 分层次组织在管理上具有更高的效率! 数据管理的基本操作之一:查找(根据某个给定关键字K,从集合R ...

  4. mysql的R树_GIS笔记——R树:一种用于空间查找的动态索引结构(算是节译)

    R树简介. R树是一种与B树类似的高度平衡树.这种索引是动态的,不需要定期重建.索引记录(Index Records)保存在叶节点中,索引记录包含指向数据对象的指针.注意原文中将索引的终端称为索引记录 ...

  5. YbtOJ-交换游戏【树链剖分,线段树合并】

    正题 题目大意 给出两棵树,对于第一棵树的每一条边(x,y)(x,y)(x,y)询问有多少条在第二棵树上的边(u,v)(u,v)(u,v)与其交换(连接的序号相同)后两棵树依旧是一棵树. 1≤n≤2× ...

  6. 【数据结构基础/接口函数编写】二叉树第一弹之树和堆的概念和结构、基础堆接口函数的实现(编写思路加逻辑分析加代码实操,一应俱全的汇总)

    文章目录 树的概念及结构 树的概念 树的相关概念 树的表示 二叉树的概念及结构 二叉树的概念 特殊的二叉树: 二叉树的存储结构 二叉树的性质 顺序储存 链式储存 堆 堆的概念及结构 堆的实现 头文件 ...

  7. 假设某专业有若干个班,每个班有若干学生,每个学生包含姓名和分数,这样构成一棵树,如图1所示。假设树中每个结点的name域均不相同,该树采用孩子兄弟链存储结构,其结点类型定义如下:

    假设某专业有若干个班,每个班有若干学生,每个学生包含姓名和分数,这样构成一棵树,如图1所示.假设树中每个结点的name域均不相同,该树采用孩子兄弟链存储结构,其结点类型定义如下: typedef st ...

  8. 数据结构——树及二叉树的概念及结构的了解

    文章目录 一.树概念及结构? 1.树的概念 2.树的相关概念 3.树的表示 4. 树在实际中的运用 二.叉树的概念及结构 1.概念 2.现实中的二叉树 3.特殊的二叉树 4.二叉树的性质 5.二叉树的 ...

  9. 树的3种常用链表结构

    树的3种常用链表结构 双亲表示法 typedef struct{elemType data;int parent; }TNode; typedef struct{TNode T[100];int r, ...

最新文章

  1. DataTable中数据记录的统计
  2. php编译参数注解--不明白许多参数的作用 慎用 –with-curlwrappers参数
  3. 机器人离线编程画圆误差解决方案_工业机器人离线编程-误差分析和解决方案...
  4. ubuntu18.04多版本opencv
  5. 高通又失一员大将,英特尔成功挖角高通CFO
  6. 51单片机课程设计:基于TCS230/3200的颜色复制显示器
  7. r语言 生成等差序列_使用序列模型生成自然语言
  8. item_search - 按关键字搜索EBAY商品
  9. 页眉---header
  10. 全球领导人齐聚一堂,出席10月14日召开的2021年全球包容性增长峰会
  11. kali WEP 破解
  12. JAVAscript中的this指向和this指向的修改
  13. 福昕阅读器和编辑器使用注意事项高级查找功能两个应用软件共用。但是注意不能卸载福昕编辑器,试验过卸载后福昕阅读器就没有查找功能了
  14. 【图像识别】【读论文】纸币图像特征提取和识别问题
  15. android 局部tab页,安卓TabLayout+ViewPager实现切页
  16. Android | 如何计算图片占用内存的大小
  17. 湖南科技大学学生首夺2011德国红点设计大奖
  18. git push 提示当前分支没有对应的远程分支?
  19. 串口转RS485:自动收发串口转RS485设计注意事项
  20. Docker 退出容器不停止容器运行

热门文章

  1. linux设备驱动之USB主机控制器驱动分析
  2. confluence添加用户_Confluence 6 选项 1 – 在 Confluence 中手动重建用户和用户组
  3. 无线对讲调度服务器,无线对讲系统---智能调度系统
  4. php 判断是否是单词,php – 检查字符串是否包含任何单词
  5. 计算机主键盘的布局,计算机键盘的布局,结构和布置
  6. python3 读取txt替换、n_从Python2迁移到Python3实战(一) pyupgrade
  7. 光遇自动弹琴脚本代码_光遇弹琴辅助软件下载-光遇自动弹琴脚本代码下载v1.0_86PS软件园...
  8. 鼠标点上去怎么那向上html,鼠标上去文字上移.html
  9. mysql providername_c#访问各数据库的providerName各驱动-阿里云开发者社区
  10. python【力扣LeetCode算法题库】10-正则表达式匹配