HBase LSM樹存儲結構

一、LSM樹的由來

在瞭解LSM樹之前,大家需要對hash表和B+樹有所瞭解。

Hash存儲方式支持增、刪、改以及隨機讀取操作,但不支持順序掃描,對應的存儲系統爲key-value存儲系統。對於key-value的插入以及查詢,哈希表的複雜度都是O(1),明顯比樹的操作O(n)快,如果不需要有序的遍歷數據,哈希表就是最佳選擇。

B+樹不僅支持單條記錄的增、刪、讀、改操作,還支持順序掃描(B+樹的葉子節點之間的指針),對應的存儲系統就是關係數據庫(Mysql等)。但是刪除和更新操作比較麻煩,正是基於以上結構的分析,LSM樹應運而生。

LSM樹(Log-Structured Merge Tree)存儲引擎和B樹存儲引擎一樣,同樣支持增、刪、讀、改、順序掃描操作。而且通過批量存儲技術規避磁盤隨機寫入問題。當然凡事有利有弊,LSM樹和B+樹相比,LSM樹犧牲了部分讀性能,用來大幅提高寫性能。

二、LSM的設計思想和原理

LSM樹的設計思想非常簡單:將對數據的修改增量保持在內存中,達到指定的大小限制後將這些修改操作批量寫入磁盤,不過讀取的時候稍微麻煩,需要合併磁盤中歷史數據和內存中最近修改操作,所以寫入性能大大提升,讀取時可能需要先看是否命中內存,否則需要訪問較多的磁盤文件。極端的說,基於LSM樹實現的HBase的寫性能比Mysql高了一個數量級,讀性能低了一個數量級。

LSM樹原理把一棵大樹拆分成N棵小樹,它首先寫入內存中,隨着小樹越來越大,內存中的小樹會flush到磁盤中,磁盤中的樹定期可以做merge操作,合併成一棵大樹,以優化讀性能。

在Hbase中LSM的應用流程:

1、因爲小樹先寫到內存中,爲了防止內存數據丟失,寫內存的同時需要暫時持久化到磁盤,對應了HBase的MemStore和HLog。

2、MemStore上的樹達到一定大小之後,需要flush到HRegion磁盤中(一般是Hadoop DataNode),這樣MemStore就變成了DataNode上的磁盤文件StoreFile,定期HRegionServer對DataNode的數據做merge操作,徹底刪除無效空間,多棵小樹在這個時機合併成大樹,來增強讀性能。

3、LSM的原理

關於LSM Tree,對於最簡單的二層LSM Tree而言,內存中的數據和磁盤你中的數據merge操作,如下圖

LSM樹合併
2.3-LSM樹合併

LSM tree,理論上,可以是內存中樹的一部分和磁盤中第一層樹做merge,對於磁盤中的樹直接做update操作有可能會破壞物理block的連續性,但是實際應用中,一般lsm有多層,當磁盤中的小樹合併成一個大樹的時候,可以重新排好順序,使得block連續,優化讀性能。

Hbase在實現中,是把整個內存在一定閾值後,flush到disk中,形成一個file,這個file的存儲也就是一個小的B+樹,因爲hbase一般是部署在hdfs上,hdfs不支持對文件的update操作,所以hbase這麼整體內存flush,而不是和磁盤中的小樹merge update,這個設計也就能講通了。內存flush到磁盤上的小樹,定期也會合併成一個大樹。整體上hbase就是用了lsm tree的思路。

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