NOSQL--LSM樹

今天猛龍的球服是真好看,神一樣的男人又回來了!!!!

 

1、磁盤IO

磁盤讀寫時涉及到磁盤上數據查找,地址一般由柱面號盤面號塊號三者構成。也就是說移動臂先根據柱面號移動到指定柱面,然後根據盤面號確定盤面的磁道,最後根據塊號將指定的磁道段移動到磁頭下,便可開始讀寫。

整個過程主要有三部分時間消耗,查找時間(seek time) +等待時間(latency time)+傳輸時間(transmission time) 。分別表示定位柱面的耗時、將塊號指定磁道段移到磁頭的耗時、將數據傳到內存的耗時。整個磁盤IO最耗時的地方在查找時間,所以減少查找時間能大幅提升性能。

2、LSM樹原理

LSM樹由兩個或以上的存儲結構組成,比如在論文中爲了方便說明使用了最簡單的兩個存儲結構。一個存儲結構常駐內存中,稱爲C0 tree,具體可以是任何方便健值查找的數據結構,比如紅黑樹、map之類,甚至可以是跳錶。另外一個存儲結構常駐在硬盤中,稱爲C1 tree,具體結構類似B樹。C1所有節點都是100%滿的,節點的大小爲磁盤塊大小。

1)、插入步驟

 

大體思路是:插入一條新紀錄時,首先在日誌文件中插入操作日誌,以便後面恢復使用,日誌是以append形式插入,所以速度非常快;將新紀錄的索引插入到C0中,這裏在內存中完成,不涉及磁盤IO操作;當C0大小達到某一閾值時或者每隔一段時間,將C0中記錄滾動合併到磁盤C1中;對於多個存儲結構的情況,當C1體量越來越大就向C2合併,以此類推,一直往上合併Ck。

 

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

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章