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

相關文章
相關標籤/搜索