RegionServer是HBase系統中最核心的組件,主要負責用戶數據寫入、讀取等基礎操做。RegionServer組件其實是一個綜合體系,包含多個各司其職的核心模塊:HLog、MemStore、HFile以及BlockCache。緩存
RegionServer是HBase系統響應用戶讀寫請求的工做節點組件,由多個核心模塊組成,其內部結構如圖所示。oop
一個RegionServer由一個(或多個)HLog、一個BlockCache以及多個Region組成。其中,HLog用來保證數據寫入的可靠性;BlockCache能夠將數據塊緩存在內存中以提高數據讀取性能;Region是HBase中數據表的一個數據分片,一個RegionServer上一般會負責多個Region的數據讀寫。一個Region由多個Store組成,每一個Store存放對應列簇的數據,好比一個表中有兩個列簇,這個表的全部Region就都會包含兩個Store。每一個Store包含一個MemStore和多個HFile,用戶數據寫入時會將對應列簇數據寫入相應的MemStore,一旦寫入數據的內存大小超過設定閾值,系統就會將MemStore中的數據落盤造成HFile文件。HFile存放在HDFS上,是一種定製化格式的數據存儲文件,方便用戶進行數據讀取。性能
HBase中系統故障恢復以及主從複製都基於HLog實現。默認狀況下,全部寫入操做(寫入、更新以及刪除)的數據都先以追加形式寫入HLog,再寫入MemStore。大多數狀況下,HLog並不會被讀取,但若是RegionServer在某些異常狀況下發生宕機,此時已經寫入MemStore中但還沒有f lush到磁盤的數據就會丟失,須要回放HLog補救丟失的數據。此外,HBase主從複製須要主集羣將HLog日誌發送給從集羣,從集羣在本地執行回放操做,完成集羣之間的數據複製。spa
HLog文件的基本結構如圖所示。
線程
說明以下:日誌
•每一個RegionServer擁有一個或多個HLog(默認只有1個,1.1版本能夠開啓MultiWAL功能,容許多個HLog)。每一個HLog是多個Region共享的,圖中Region A、Region B和Region C共享一個HLog文件。server
•HLog中,日誌單元WALEntry(圖中小方框)表示一次行級更新的最小追加單元,它由HLogKey和WALEdit兩部分組成,其中HLogKey由table name、region name以及sequenceid等字段構成。blog
WALEdit用來表示一個事務中的更新集合,在0.94以前的版本中,若是一個事務對一行row R三列c一、c二、c3分別作了修改,那麼HLog中會有3個對應的日誌片斷,以下所示:
然而,這種日誌結構沒法保證行級事務的原子性,假如RegionServer更新c2列以後發生宕機,那麼一行記錄中只有部分數據寫入成功。爲了解決這樣的問題,HBase將一個行級事務的寫入操做表示爲一條記錄,以下所示:
其中,WALEdit會被序列化爲格式<-1, # of edits, , , >,好比<-1, 3, , , >,-1爲標識符,表示這種新的日誌結構。生命週期
HBase中全部數據(包括HLog以及用戶實際數據)都存儲在HDFS的指定目錄(假設爲hbase-root)下,能夠經過hadoop命令查看hbase-root目錄下與HLog有關的子目錄,以下所示:
其中,/hbase/WALs存儲當前還未過時的日誌;/hbase/oldWALs存儲已通過期的日誌。能夠進一步查看/hbase/WALs目錄下的日誌文件,以下所示:
/hbase/WALs目錄下一般會有多個子目錄,每一個子目錄表明一個對應的RegionServer。以hbase17.xj.bjbj.org,60020,1505980274300爲例,hbase17.xj.bjbj.org表示對應的RegionServer域名,60020爲端口號,1505980274300爲目錄生成時的時間戳。每一個子目錄下存儲該RegionServer內的全部HLog文件,以下所示:事務
HLog文件爲:
HLog文件生成以後並不會永久存儲在系統中,它的使命完成後,文件就會失效最終被刪除。HLog整個生命週期如圖所示。
HLog生命週期包含4個階段:
1)HLog構建:HBase的任何寫入(更新、刪除)操做都會先將記錄追加寫入到HLog文件中。
2)HLog滾動:HBase後臺啓動一個線程,每隔一段時間(由參數'hbase.regionserver. logroll.period'決定,默認1小時)進行日誌滾動。日誌滾動會新建一個新的日誌文件,接收新的日誌數據。日誌滾動機制主要是爲了方便過時日誌數據可以以文件的形式直接刪除。
3)HLog失效:寫入數據一旦從MemStore中落盤,對應的日誌數據就會失效。爲了方便處理,HBase中日誌失效刪除老是以文件爲單位執行。查看某個HLog文件是否失效只需確認該HLog文件中全部日誌記錄對應的數據是否已經完成落盤,若是日誌中全部日誌記錄已經落盤,則能夠認爲該日誌文件失效。一旦日誌文件失效,就會從WALs文件夾移動到oldWALs文件夾。注意此時HLog並無被系統刪除。
4)HLog刪除:Master後臺會啓動一個線程,每隔一段時間(參數'hbase.master.cleaner. interval',默認1分鐘)檢查一次文件夾oldWALs下的全部失效日誌文件,確認是否能夠刪除,確承認以刪除以後執行刪除操做。確認條件主要有兩個:
•該HLog文件是否還在參與主從複製。對於使用HLog進行主從複製的業務,須要繼續確認是否該HLog還在應用於主從複製。
•該HLog文件是否已經在OldWALs目錄中存在10分鐘。爲了更加靈活地管理HLog生命週期,系統提供了參數設置日誌文件的TTL(參數'hbase.master.logcleaner.ttl',默認10分鐘),默認狀況下oldWALs裏面的HLog文件最多能夠再保存10分鐘。
文章基於《HBase原理與實踐》一書