LSMTree (BigTable 的理论模型)

摘要:
谷歌的BigTable架构以分布式结构化存储著称。MergeDump模型在读取和写入之间找到了良好的平衡,这解决了读取和写入网络规模数据的问题。MergeDump的理论基础是LSM树。原文如下:LSM树首先,我们来谈谈LSM树的基本思想,然后记录一些阅读文章的感受。LSM的概念非常简单。它将对数据的更改保存在内存中,当达到指定的线程保持时将批处理更改成批写入磁盘,并在批处理写入过程中与现有数据进行滚动合并。

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策略的选择是个启发。

免责声明:文章转载自《LSMTree (BigTable 的理论模型)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇getchar()和scanf()混合使用的坑ex06 汉诺塔2 非递归解法下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Git 分支及bug分支合并

branch 分支学习:branch称为分支,默认仅有一个名为master的分支。一般开发新功能流程为:开发新功能时会在分支dev上进行,开发完毕后再合并到master分支。 学习参考上图,也可以按照着这样的流程进行开发,如果遇到上文开发到一般需要临时修复Bug的情况,可以按照下图的流程进行:   注意:git merge 时也可能会出现冲突,解决冲突的...

Git敏捷开发--rebase命令

git rebase是git下比较常用的命令,以下记录自己遇到较多的使用场景。 合并分支 在多人协作的项目中,拉分支是很常见的事情,经常需要同步自己的分支与远端master分支一致,有两种方式: git merge master git rebase master 两者的区别在于:前者会在生成一条 Merge branch master into XX...

Git查看某一天的详细修改日志

$git log –since=2011-3-24 –until=2011-3-25 -p 查看2011-3-25的日志,包括commit和修改涉及的代码; 参考了:http://www.enjoyrails.com/wikis/Git%E4%B8%80%E5%88%86%E9%92%9F%E4%B8%8A%E6%89%8B Git一分钟上手 流程:取...

Oracle中merge into的使用

该命令使用一条语句从一个或者多个数据源中完成对表的更新和插入数据. ORACLE 9i 中,使用此命令必须同时指定UPDATE 和INSERT 关键词,ORACLE 10g 做了如下改动。 1,insert 和update是可选的 2,UPDATE 和INSERT 后面可以跟WHERE 子句 3,在ON条件中可以使用常量来insert 所有的行到目标表中,...

python数据分析——pandas的拼接操作

pandas的拼接操作 pandas的拼接分为两种: 级联:pd.concat, pd.append 合并:pd.merge, pd.join 1. 使用pd.concat()级联 pandas使用pd.concat函数,与np.concatenate函数类似,只是多了一些参数: objs axis=0 keys join='outer' /...

[SVN] 分支同步、合入主干操作分享

冲突的解决原则 不是自己修改的地方就使用主干的。 需要特别注意的是: 分支同步主干时,远端(theirs)是主干,本地(mine/working)的是分支; 分支合入主干时,本地(mine/working)的是主干,远端(theirs)是分支。 二进制文件的冲突解决 对于*.jar*.png等二进制文件的冲突,如果这些文件与你的业务开发是无关的,直接右键"...