Hbase-WAL機制

一.什麼是Hbase的WAL機制
Hbase的Write Ahead Log(WAL) 提供了一種高併發,持久化的日誌保存和回放機制。數據的寫入操做(PUT/DELETE) 執行前,都會先寫Hlog。
下圖是Hbase寫入數據的流程圖。
Client將操做封裝成KeyValue對象,經過RPC調用發送給HRegionServer,Server會將請求分發給它所管理的HRegion列表,HRegions首先會調用HLog將日誌寫入配置指定的地方,隨後將數據寫入緩存(MemStore),緩存知足條件(數據量達到必定大小/通過一段時間)後,數據會異步寫入文件系統中(StoreFile/HFile),固然WAL是可配置的。
一個RegionServer對應一個HLog
p1.pngsql

二.WAL有何做用
1.WAL最重要的做用是災難恢復,和Mysql的BIN log相似,它記錄着 全部數據的改動。一旦服務器崩潰,經過重放log,能夠恢復崩潰以前的數據。若是寫入WAL失敗,整個操做則失敗。
2.HLog經過"sequence number(序列號)" 追蹤數據改變。Region打開存儲文件。讀取每一個HFile中的最大的序列號,若是該值大於HLog的序列號,就將這個值設置爲Hlog的序列號。HLog將獲得上次存入文件和繼續記log的點。
p2.png
如上圖所示,3個不一樣的region,每一個負責一段rowkey的範圍。這些region共享同一個Hlog實例,不難看出,region間的數據寫入WAL的順序是不肯定的。
3.Hlog利用HMaster恢復和切分一個已經崩潰的HRegionServer 遺留下來的log,隨後從新部署regions緩存

三.WAL工做原理
1.HLogKey/KeyValue
如上圖所示,WAL中保存了HLogKey和KeyValue
以下圖所示HLogKey中包含Region,表名,序列號,寫入時間。
KeyValue中包含rowkey,列簇,限定符,時間戳,value,操做類型(PUT/DELETE)
p3.png
2.LogFlusher
LogFlusher的緩存會按期(hbase.regionserver.optionallogflushinterval)刷寫到文件系統,另外寫入日誌的過程當中也會按期(hbase.regionserver.flushlogentries)刷寫
3.LogRoller
Log的大小經過配置(hbase.regionserver.logroll.period)來限制,默認是一個小時,每隔一小時,會打開一個新的log文件,長此以往會有一大堆的文件須要維護。首先LogRoller定時滾動日誌,隨後清除舊日誌。它會先取得存儲文件中的最大的sequence number,以後檢查是否存一個log全部條目的序列號均低於這個值,若是存在,將刪除這個log
4.Replay
當Region server崩潰後,當HMaster啓動或檢測到region server崩潰,它將日誌文件拆分爲多個文件,將其存儲到region所屬的文件夾,以後region server打開所管轄的region,
它將檢查是否存在剩餘的log文件,若是存在將重放這個日誌,將日誌中的條目加入到Memstore中,最後flush操做刷寫到磁盤上。服務器

相關文章
相關標籤/搜索