废话就不多说了,开始。。。
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,多棵小树成变一颗大树。
文章结束给大家分享下程序员的一些笑话语录:
有一天,一个男人穿越森林的时候,听到一个细微的声音叫住他。他低头一看,是一只青蛙。
“如果你亲我一下,我会变成一个美丽的公主哦。”男人一言不发,把青蛙捡起来,放入口袋。
“如果你亲我一下,我会变成一个美丽的公主哦。而且,我会告诉我遇到的每一个人,你是多么聪明和勇敢,你是我的英雄。”男人把青蛙拿出来,对着它微微一笑,又把它放回口袋。
“如果你亲我一下,我会变成一个美丽的公主,然后我愿意成为你的爱人一星期。”男人又把青蛙拿出来,对着它微微一笑,把它放回口袋。
“如果你亲我一下,我会变成一个美丽的公主,然后我愿意成为你的爱人一年,而且你可以对我做任何事。”再一次,男人把青蛙拿出来,对着它微微一笑,又把它放回口袋。
最后,青蛙无力地问:“我开出了这么好的条件,为什么你还不肯吻我?”男人说:“我是一个程序员,我可没时间和什么公主鬼混。不过,拥有一个会说话的青蛙,倒是蛮酷的。”