NOSQL--LSM树

NOSQL--LSM树_第1张图片

今天猛龙的球服是真好看,神一样的男人又回来了!!!!

 

1、磁盘IO

磁盘读写时涉及到磁盘上数据查找,地址一般由柱面号盘面号块号三者构成。也就是说移动臂先根据柱面号移动到指定柱面,然后根据盘面号确定盘面的磁道,最后根据块号将指定的磁道段移动到磁头下,便可开始读写。

整个过程主要有三部分时间消耗,查找时间(seek time) +等待时间(latency time)+传输时间(transmission time) 。分别表示定位柱面的耗时、将块号指定磁道段移到磁头的耗时、将数据传到内存的耗时。整个磁盘IO最耗时的地方在查找时间,所以减少查找时间能大幅提升性能。

2、LSM树原理

LSM树由两个或以上的存储结构组成,比如在论文中为了方便说明使用了最简单的两个存储结构。一个存储结构常驻内存中,称为C0 tree,具体可以是任何方便健值查找的数据结构,比如红黑树、map之类,甚至可以是跳表。另外一个存储结构常驻在硬盘中,称为C1 tree,具体结构类似B树。C1所有节点都是100%满的,节点的大小为磁盘块大小。

NOSQL--LSM树_第2张图片

1)、插入步骤

 

大体思路是:插入一条新纪录时,首先在日志文件中插入操作日志,以便后面恢复使用,日志是以append形式插入,所以速度非常快;将新纪录的索引插入到C0中,这里在内存中完成,不涉及磁盘IO操作;当C0大小达到某一阈值时或者每隔一段时间,将C0中记录滚动合并到磁盘C1中;对于多个存储结构的情况,当C1体量越来越大就向C2合并,以此类推,一直往上合并Ck。

NOSQL--LSM树_第3张图片

 

2)、合并步骤

1、合并过程中会使用两个块:emptying block和filling block。

2、从C1中读取未合并叶子节点,放置内存中的emptying block中。从小到大找C0中的节点,与emptying block进行合并排序,合并结果保存到filling block中,并将C0对应的节点删除。

3、不断执行第2步操作,合并排序结果不断填入filling block中,当其满了则将其追加到磁盘的新位置上,注意是追加而不是改变原来的节点。合并期间如故宫emptying block使用完了则再从C1中读取未合并的叶子节点。

4、C0和C1所有叶子节点都按以上合并完成后即完成一次合并。

 

3)、hbase与LSM树

数据会先写到内存中,为了防止内存数据丢失,写内存的同时需要持久化到磁盘,对应了HBase的MemStoreHLog

MemStore中的数据达到一定的阈值之后,需要将数据刷写到磁盘,即生成HFile(也是一颗小的B+树)文件;

hbase中的minor(少量HFile小文件合并)major(一个region的所有HFile文件合并)执行compact操作,同时删除无效数据(过期及删除的数据),多棵小树在这个时机合并成大树,来增强读性能

更深一层次的东西请参阅以下三篇文章:

https://cloud.tencent.com/developer/article/1411233(强烈推荐该篇文章'英语不好慎入)

https://baijiahao.baidu.com/s?id=1613810327967900833&wfr=spider&for=pc

https://www.jianshu.com/p/06f9f7f41fdb

 

 

你可能感兴趣的:(数据结构)