LSM树(Log-Structured Merge Tree)存储引擎

代表数据库:nessDB、leveldb、hbase等

核心思想的核心就是放弃部分读能力,换取写入的最大化能力。LSM Tree ,这个概念就是结构化合并树的意思,它的核心思路其实非常简单,就是假定内存足够大,因此不需要每次有数据更新就必须将数据写入到磁盘中,而可以先将最新的数据驻留在磁盘中,等到积累到最后多之后,再使用归并排序的方式将内存内的数据合并追加到磁盘队尾(因为所有待排序的树都是有序的,可以通过合并排序的方式快速合并到一起)。

日志结构的合并树(LSM-tree)是一种基于硬盘的数据结构,与B-tree相比,能显著地减少硬盘磁盘臂的开销,并能在较长的时间提供对文件的高速插入(删除)。然而LSM-tree在某些情况下,特别是在查询需要快速响应时性能不佳。通常LSM-tree适用于索引插入比检索更频繁的应用系统。Bigtable在提供Tablet服务时,使用GFS来存储日志和SSTable,而GFS的设计初衷就是希望通过添加新数据的方式而不是通过重写旧数据的方式来修改文件。而LSM-tree通过滚动合并和多页块的方法推迟和批量进行索引更新,充分利用内存来存储近期或常用数据以降低查找代价,利用硬盘来存储不常用数据以减少存储代价。

磁盘的技术特性:对磁盘来说,能够最大化的发挥磁盘技术特性的使用方式是:一次性的读取或写入固定大小的一块数据,并尽可能的减少随机寻道这个操作的次数。

转自:http://blog.csdn.net/dbanote/article/details/8897599

LSM树是Hbase里非常有创意的一种数据结构,它和传统的B+树不太一样,下面先说说B+树。

1 B+树

相信大家对B+树已经非常的熟悉,比如Oracle的普通索引就是采用B+树的方式,下面是一个B+树的例子:

根节点和枝节点很简单,分别记录每个叶子节点的最小值,并用一个指针指向叶子节点。

叶子节点里每个键值都指向真正的数据块(如Oracle里的RowID),每个叶子节点都有前指针和后指针,这是为了做范围查询时,叶子节点间可以直接跳转,从而避免再去回溯至枝和跟节点。

B+树最大的性能问题是会产生大量的随机IO,随着新数据的插入,叶子节点会慢慢分裂,逻辑上连续的叶子节点在物理上往往不连续,甚至分离的很远,但做范围查询时,会产生大量读随机IO。

对于大量的随机写也一样,举一个插入key跨度很大的例子,如7->1000->3->2000 ... 新插入的数据存储在磁盘上相隔很远,会产生大量的随机写IO.

从上面可以看出,低下的磁盘寻道速度严重影响性能(近些年来,磁盘寻道速度的发展几乎处于停滞的状态)。

2 LSM树

为了克服B+树的弱点,HBase引入了LSM树的概念,即Log-Structured Merge-Trees。

为了更好的说明LSM树的原理,下面举个比较极端的例子:

现在假设有1000个节点的随机key,对于磁盘来说,肯定是把这1000个节点顺序写入磁盘最快,但是这样一来,读就悲剧了,因为key在磁盘中完全无序,每次读取都要全扫描;

那么,为了让读性能尽量高,数据在磁盘中必须得有序,这就是B+树的原理,但是写就悲剧了,因为会产生大量的随机IO,磁盘寻道速度跟不上。

LSM树本质上就是在读写之间取得平衡,和B+树相比,它牺牲了部分读性能,用来大幅提高写性能

它的原理是把一颗大树拆分成N棵小树, 它首先写入到内存中(内存没有寻道速度的问题,随机写的性能得到大幅提升),在内存中构建一颗有序小树,随着小树越来越大,内存的小树会flush到磁盘上。当读时,由于不知道数据在哪棵小树上,因此必须遍历所有的小树,但在每颗小树内部数据是有序的。

以上就是LSM树最本质的原理,有了原理,再看具体的技术就很简单了。

1)首先说说为什么要有WAL(Write Ahead Log),很简单,因为数据是先写到内存中,如果断电,内存中的数据会丢失,因此为了保护内存中的数据,需要在磁盘上先记录logfile,当内存中的数据flush到磁盘上时,就可以抛弃相应的Logfile。

2)什么是memstore, storefile?很简单,上面说过,LSM树就是一堆小树,在内存中的小树即memstore,每次flush,内存中的memstore变成磁盘上一个新的storefile。

3)为什么会有compact?很简单,随着小树越来越多,读的性能会越来越差,因此需要在适当的时候,对磁盘中的小树进行merge,多棵小树变成一颗大树。

关于LSM Tree,对于最简单的二层LSM Tree而言,内存中的数据和磁盘中的数据merge操作,如下图

下面说说详细例子:

LSM Tree弄了很多个小的有序结构,比如每m个数据,在内存里排序一次,下面100个数据,再排序一次……这样依次做下去,就可以获得N/m个有序的小的有序结构。

在查询的时候,因为不知道这个数据到底是在哪里,所以就从最新的一个小的有序结构里做二分查找,找得到就返回,找不到就继续找下一个小有序结构,一直到找到为止。

很容易可以看出,这样的模式,读取的时间复杂度是(N/m)*log2N 。读取效率是会下降的。

这就是最本来意义上的LSM tree的思路。那么这样做,性能还是比较慢的,于是需要再做些事情来提升,怎么做才好呢?

LSM Tree优化方式:

a、Bloom filter: 就是个带随即概率的bitmap,可以快速的告诉你,某一个小的有序结构里有没有指定的那个数据的。于是就可以不用二分查找,而只需简单的计算几次就能知道数据是否在某个小集合里啦。效率得到了提升,但付出的是空间代价。

b、compact:小树合并为大树:因为小树他性能有问题,所以要有个进程不断地将小树合并到大树上,这样大部分的老数据查询也可以直接使用log2N的方式找到,不需要再进行(N/m)*log2n的查询了

更详细的可以参考:http://weakyon.com/2015/04/08/Log-Structured-Merge-Trees.html

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

LSM树——放弃读能力换取写能力,将多次修改放在内存中形成有序树再统一写入磁盘...相关推荐

  1. LSM树——放弃读能力换取写能力,将多次修改放在内存中形成有序树再统一写入磁盘,查找复杂度O(k*log(n)),结合bloom filter提高查找性能...

    来自:http://www.open-open.com/lib/view/open1424916275249.html 十年前,谷歌发表了 "BigTable" 的论文,论文中很多 ...

  2. 【学术相关】直博和读完硕士再读博,在能力上的差距有多大?

    点击上方"AI遇见机器学习",选择"星标"公众号 重磅干货,第一时间送达 来自:机器学习初学者 直博和读完硕士再读博,在能力上的差距有多大? 高赞回答一 作者: ...

  3. 【学术】直博和读完硕士再读博,在能力上的差距有多大?

    直博和读完硕士再读博,在能力上的差距有多大? 高赞回答一 作者:胖博士 链接:https://www.zhihu.com/question/425860957/answer/1549964990 能力 ...

  4. 讨论下直博和读完硕士再读博,在能力上的差距

    直博和读完硕士再读博,在能力上的差距有多大? 高赞回答一 作者:胖博士 链接:https://www.zhihu.com/question/425860957/answer/1549964990 能力 ...

  5. 深度学习研究生如何快速提升代码能力,写出高效的代码?

    深度学习代码与前端代码区别 深度学习的代码能力与开发后台或者前端的工程代码能力不是一个概念. 写前端代码:脑海中是整个工程的架构,写代码则是把这些架构用 code 具体化. 写深度学习代码:脑海中浮现 ...

  6. 分形树Fractal tree介绍——具体如何结合TokuDB还没有太懂,先记住其和LSM都是一样的适合写密集...

    在目前的Mysql数据库中,使用最广泛的是innodb存储引擎.innodb确实是个很不错的存储引擎,就连高性能Mysql里都说了,如果不是有什么很特别的要求,innodb就是最好的选择.当然,这偏文 ...

  7. tokudb 分形树_分形树Fractal tree介绍——具体如何结合TokuDB还没有太懂,先记住其和LSM都是一样的适合写密集...

    在目前的Mysql数据库中,使用最广泛的是innodb存储引擎.innodb确实是个很不错的存储引擎,就连高性能Mysql里都说了,如果不是有什么很特别的要求,innodb就是最好的选择.当然,这偏文 ...

  8. 多麦克风做拾音的波束_搜狗推出 8 麦阵列的 AI 录音笔,拾音和转写能力大幅提升...

    录音.转写.翻译,不错的生产力工具! - shenzhenware - 其实早在上世纪 90 年代,小型迷你录音笔就被发明出来了.在之后的 20 年里,录音笔的产品形态和基本功能基本上没有变化.虽然存 ...

  9. 树状dp(这个人写得好多转来慢慢看)

    树状动态规划定义 之所以这样命名树规,是因为树形DP的这一特殊性:没有环,dfs是不会重复,而且具有明显而又严格的层数关系.利用这一特性,我们可以很清晰地根据题目写出一个在树(型结构)上的记忆化搜索的 ...

最新文章

  1. 应用程序的数据库从Sql Server迁移到Oracle
  2. DataAccessResourceFailureException异常解决方法
  3. c++ 新建一个数组
  4. SQL Server 2008存储过程的加密
  5. linux批量修改压缩图片大小,linux shell批量压缩某个目录下图片大小
  6. 约瑟夫问题pascal程序
  7. 2287. 【POJ Challenge】消失之物(数组递推\分治优化背包)
  8. 【转】JVM性能调优监控工具jps、jstack、jmap、jhat、jstat、hprof使用详解
  9. MongoDB常用使用场景介绍
  10. 通过SCVMM分配SMB 3.0 文件共享
  11. 百面机器学习—2. 特征工程与模型评估要点总结
  12. 2019牛客多校第六场H Pair(数位DP 多个数相关)题解
  13. rhel5中查询设备上采用的未知文件系统
  14. 无法定位程序输入点 except_python自制王者荣耀抽卡程序
  15. qt程序报错“C:\Program Files (x86)\SogouInput\Components\ 15:10:44: 程序异常结束。”
  16. 将中文姓名转为拼音英文名的一种实现
  17. 微信nickname乱码 php,CSV中微信名字乱码 问题
  18. 折线多边形的原位放大
  19. 如何使用git 生成密钥?
  20. ORACLE中的全连接(Full Join)、内连接(JOIN/INNER JOIN)、左连接(Left Join)、右连接(Left Join)、(+)符号以及Theta连接

热门文章

  1. mysql给数据做排名_mysql给数据统计做排名
  2. java免安装工具包_Java1.8安装及环境变量配置
  3. java内置_自包含的应用程序,内置Java
  4. golang mysql 超时_golang中mysql建立连接超时时间timeout 测试
  5. fio模拟mysql写入速度_IO压力测试工具 -- FIO 使用说明
  6. jquery实现点击浏览器后退,上一页面自动刷新
  7. python【蓝桥杯vip练习题库】ADV-77统计平均成绩
  8. 【深度学习笔记】ROC曲线 vs Precision-Recall曲线
  9. 第四次人口普查数据_第七次人口普查预估:单身男性比女性多3000万?你在其中吗?...
  10. 网络推广外包关键词排名首页却无人访问很可能网络推广外包出现问题