LSM = Log Structured Merge Treeshtml
來源於google的bigtable論文。算法
傳統的數據庫如MySql採用B+樹存放數據,B+樹是一個隨機讀寫的數據結構。 咱們知道,順序讀寫要比隨機讀寫快無數倍,因此須要把數據結構改爲順序讀寫。數據庫
LSM是當前被用在許多產品的文件結構策略:HBase, Cassandra, LevelDB, SQLite,甚至在mangodb3.0中也帶了一個可選的LSM引擎(Wired Tiger 實現的)。緩存
LSM-Tree比較適合的應用場景是:insert數據量大,讀數據量和update數據量不高且讀通常針對最新數據。數據結構
一、 數據按時間和大小分文件存放(sstable文件)。性能
二、 新的修改用Copy-On-Write Tree方式按key緩存在內存(memtable)中,內存中保序。google
三、 內存達到時間或大小條件後,保存在一個新的文件裏(順序寫,速度很快)。日誌
四、 對已經保存的文件,再也不修改。htm
五、 查詢的時候,先查內存,而後依次查各個保存的文件。blog
六、 由於每一個文件裏的數據都是順序存放的,因此查詢速度較快(二分查找)。
一、 定時觸發文件合併操做,刪除冗餘記錄,並減小文件個數,提高查詢效率(因爲sstable裏的記錄是順序存放的,因此合併不是常高效(歸併算法、順序讀寫))。
二、 採用頁緩存,減小二分查找的消耗。LevelDB 和 BigTable 是將 block-index 保存在文件尾部,這樣查找就只要一次IO操做,若是block-index在內存中。
三、 採用布隆過濾器,減小不存在數據的斷定邏輯。
四、 並行合併。
打個比方,合併操做就是JVM裏的GC,在合併的時候,勢必會影響其餘操做。因此咱們用G1的思想,把文件分區域,各個區域分別合併,這樣,就能夠減小停頓(加鎖)的時間,同時也減小了合併文件額外須要的空間。
想一想這個結構,相似於一顆新的樹,這個樹的每一個節點是一個文件,每一個文件的內容是sstable。
一、寫性能高。
二、只須要對內存部分加鎖,文件不會修改,無需加鎖
一、對於頻繁大規模改動的場景很差。
一、 memtable丟失的問題:須要記錄redo日誌和恢復時間點,用於重建memtable。
二、
LSM存儲模型
http://www.javashuo.com/article/p-njpybsxd-ez.html
LSM 算法的原理是什麼?