首页 > 其他分享 >LSM-Tree (BigTable 的理论模型)[转]

LSM-Tree (BigTable 的理论模型)[转]

时间:2023-06-06 13:35:37浏览次数:39  
标签:写入 LSM Tree 内存 数据 page BigTable


Google的BigTable架构在分布式结构化存储方面大名鼎鼎,其中的MergeDump模型在读写之间找到了一个较好的平衡点,很好的解决了web scale数据的读写问题。

MergeDump的理论基础是LSM-Tree (Log-Structured Merge-Tree), 原文见:LSM Tree

下面先说一下LSM-Tree的基本思想,再记录下读文章的几点感受。

LSM思想非常朴素,就是将对数据的更改hold在内存中,达到指定的threadhold后将该批更改批量写入到磁盘,在批量写入的过程中跟已经存在的数据做rolling merge。

拿update举个例子:

比如有1000万行数据,现在希望update table.a set addr='new addr' where pk = '833',

如果使用B-Tree类似的结构操作,就需要:

1. 找到该条记录所在的page,

2. load page到内存(如果恰好该page已经在内存中,则省略该步)

3. 如果该page之前被修改过,则先flush page to disk

4. 修改数据

上面的动作平均来说有两次disk I/O,

如果采用LSM-Tree类似结构,则:

1. 将需要修改的数据直接写入内存

可见这里是没有disk I/O的。

当然,我们要说,这样的话读的时候就费劲了,需要merge disk上的数据和memory中的修改数据,这显然降低了读的性能。

确实如此,所以作者其中有个假设,就是写入远大于读取的时候,LSM是个很好的选择。我觉得更准确的描述应该是”优化了写,没有显著降低读“,因为大部分时候我们都是要求读最新的数据,而最新的数据很可能还在内存里面,即使不在内存里面,只要不是那些更新特别频繁的数据,其I/O次数也是有限的。

所以LSM-Tree比较适合的应用场景是:insert数据量大,读数据量和update数据量不高且读一般针对最新数据。

文章读下来有以下几点感受:

1. 基本思想早就有了,作者给出了较好的表现形式。

2. Merge是page/block级别的,而不是BigTable中的文件级别的。这一点主要原因可能是BigTable在分布式场景下做block级别很困那,而且GFS也不支持修改。

3. 其提出的比较标准比较有趣,将磁盘容量,转速等结合起来给出一个以美元为单位的cost标准,然后跟B-Tree结构的实现做了比较,结果当然是大大胜出。但是这里我觉得作者有些比较是不合理的,比如LSM使用log而B-Tree没有使用,这显然对B-Tree不公,其实B-Tree如果使用log,写入性能应该不比LSM差,顺序读取可能差一些。

4. 在Multi components 中,提出Ci/Ci+1的比例达到20的时候是最优的,这个数字意义不大,但是其中的分析方法对于Merge策略的选择是个启发。

标签:写入,LSM,Tree,内存,数据,page,BigTable
From: https://blog.51cto.com/u_2650279/6424093

相关文章

  • Python tkinter 树形列表控件(Treeview)的使用简单举例,建立一个treeview
     importtkinterastkfromtkinter.ttkimportTreeview#创建tkinter应用程序窗口root=tk.Tk()#设置窗口大小和位置root.geometry('500x300+400+300')#不允许改变窗口大小root.resizable(False,False)#设置窗口标题root.title('通信录管理系统')#使用Tree......
  • 外汇天眼:Invast Global股价格下跌至最低水平,FXStreet分拆公司设新办事处!
    截止到今天,2023年已过去一半。上半年和过去一年总体上对一些公开交易的经纪商来说相对较好,但对其他一些经纪商来说却是另一回事,比如上周INVInc公布了自己股价跌至近2年新低;之后是FXStreet将公司部门拆分,其营销机构在塞浦路斯设立办事处;Dukascopy将印度50指数退市。具体新闻如下:1、......
  • Link-Cut-Tree详解
    引入树的链剖分有三种,重链剖分、实链剖分和长链剖分。实链剖分与其他两种不同的是,实儿子是可以根据需求转换的,而不是像另两种有着固定的定义方式。因此,实链剖分一般用来维护动态的树上问题。例如删边、加边和修改点权,以及树链剖分的常规操作(当然,要始终维持森林的性质)。辅助树......
  • [AGC050F] NAND Tree
    求一个计数方案奇偶性的题考虑套路的交换两个元素。考虑最开始选的两条边,如果它们没有交,那么互换顺序之后结果不变。我们只需要统计相交的情况即可。再考虑边相邻的情况。对于y---x---z,按两种顺序缩边的结果分别为\(\operatorname{NAND}(\operatorname{NAND}(y,x),z)\)和\(\op......
  • DRTREE - Dynamically-Rooted Tree 题解
    DRTREE-Dynamically-RootedTree本题建议评蓝。思路:题目就是要对一颗不定根树求子树权值和。这题不带修,如果带修难度会增加一点,就跟遥远的国度差不多。首先分析一下在以不同根下子树的变化。当一颗树以1号节点为根时,比如说长这样:假设每个点的权值为1,那么这8个点......
  • 【Windows】TreeSoft数据库管理系统 TreeDMS 和 TreeNMS
    官方地址:http://www.treesoft.cn/dms.html#learningTreeSoft数据库管理系统TreeDMS支持MySQL,MariaDB,Oracle,PostgreSQL,SQLServer,DB2,MongoDB,Hive,SAPHANA,Sybase,Caché,Informix,Impala,ElasticSearch,clickHouse,cassandra,AmazonRedshift,达梦DM,金仓Kin......
  • Map系列集合:TreeMap集合的原理、使用
        ......
  • Set系列集合:TreeSet集合
                 ......
  • 如何在tree中添加一个 contextmenu 事件!
    关键点就是TreeList上下文中要有这个被包装了的handleContextMenu定义TreeList时,继承了一些东西,还可以重写一些东西。 本例中,TreeList上下文捕获到右键菜单事件后,将该事件传递给了自定义的函数itemcontextmenu1对应的函数应该returnfalse来阻止默认菜单的行为。在函......
  • 如何在tree中添加一个 contextmenu 事件?
     /***添加绑定事件*<pre><code>*//绑定单个事件*list.on('itemclick',function(ev){*alert('21');*});*//绑定多个事件*list.on('itemrendereditemupdated',function(......