Log Structured Merge Trees (LSM)

1      概念

LSM = Log Structured Merge Treeshtml

来源于google的bigtable论文。算法

 

2      解决问题

传统的数据库如MySql采用B+树存放数据,B+树是一个随机读写的数据结构。 咱们知道,顺序读写要比随机读写快无数倍,因此须要把数据结构改为顺序读写。数据库

 

3      应用场景

LSM是当前被用在许多产品的文件结构策略:HBase, Cassandra, LevelDB, SQLite,甚至在mangodb3.0中也带了一个可选的LSM引擎(Wired Tiger 实现的)。缓存

 

LSM-Tree比较适合的应用场景是:insert数据量大,读数据量和update数据量不高且读通常针对最新数据。数据结构

 

4      实现原理

4.1      基本原理

一、  数据按时间和大小分文件存放(sstable文件)。性能

二、  新的修改用Copy-On-Write Tree方式按key缓存在内存(memtable)中,内存中保序。google

三、  内存达到时间或大小条件后,保存在一个新的文件里(顺序写,速度很快)。日志

四、  对已经保存的文件,再也不修改。htm

五、  查询的时候,先查内存,而后依次查各个保存的文件。blog

六、  由于每一个文件里的数据都是顺序存放的,因此查询速度较快(二分查找)。

4.2      提高读性能的方案

一、  定时触发文件合并操做,删除冗余记录,并减小文件个数,提高查询效率(因为sstable里的记录是顺序存放的,因此合并不是常高效(归并算法、顺序读写))。

二、  采用页缓存,减小二分查找的消耗。LevelDB 和 BigTable 是将 block-index 保存在文件尾部,这样查找就只要一次IO操做,若是block-index在内存中。

三、  采用布隆过滤器,减小不存在数据的断定逻辑。

四、  并行合并。

打个比方,合并操做就是JVM里的GC,在合并的时候,势必会影响其余操做。因此咱们用G1的思想,把文件分区域,各个区域分别合并,这样,就能够减小停顿(加锁)的时间,同时也减小了合并文件额外须要的空间。

想一想这个结构,相似于一颗新的树,这个树的每一个节点是一个文件,每一个文件的内容是sstable。

 

 

5      优势

一、写性能高。

二、只须要对内存部分加锁,文件不会修改,无需加锁

6      缺点

一、对于频繁大规模改动的场景很差。

 

7      最佳实践

一、  memtable丢失的问题:须要记录redo日志和恢复时间点,用于重建memtable。

二、   

8      参考

LSM存储模型

http://www.javashuo.com/article/p-njpybsxd-ez.html

LSM 算法的原理是什么?

https://www.zhihu.com/question/19887265

相关文章
相关标签/搜索