hbasehlog_HBase原理--RegionServer核心组件之HLog
RegionServer是HBase系統中最核心的組件,主要負責用戶數據寫入、讀取等基礎操作。RegionServer組件實際上是一個綜合體系,包含多個各司其職的核心模塊:HLog、MemStore、HFile以及BlockCache。
RegionServer內部結構
RegionServer是HBase系統響應用戶讀寫請求的工作節點組件,由多個核心模塊組成,其內部結構如圖所示。
一個RegionServer由一個(或多個)HLog、一個BlockCache以及多個Region組成。其中,HLog用來保證數據寫入的可靠性;BlockCache可以將數據塊緩存在內存中以提升數據讀取性能;Region是HBase中數據表的一個數據分片,一個RegionServer上通常會負責多個Region的數據讀寫。一個Region由多個Store組成,每個Store存放對應列簇的數據,比如一個表中有兩個列簇,這個表的所有Region就都會包含兩個Store。每個Store包含一個MemStore和多個HFile,用戶數據寫入時會將對應列簇數據寫入相應的MemStore,一旦寫入數據的內存大小超過設定閾值,系統就會將MemStore中的數據落盤形成HFile文件。HFile存放在HDFS上,是一種定制化格式的數據存儲文件,方便用戶進行數據讀取。
HLog
HBase中系統故障恢復以及主從復制都基于HLog實現。默認情況下,所有寫入操作(寫入、更新以及刪除)的數據都先以追加形式寫入HLog,再寫入MemStore。大多數情況下,HLog并不會被讀取,但如果RegionServer在某些異常情況下發生宕機,此時已經寫入MemStore中但尚未f lush到磁盤的數據就會丟失,需要回放HLog補救丟失的數據。此外,HBase主從復制需要主集群將HLog日志發送給從集群,從集群在本地執行回放操作,完成集群之間的數據復制。
HLog文件結構
HLog文件的基本結構如圖所示。
說明如下:
?每個RegionServer擁有一個或多個HLog(默認只有1個,1.1版本可以開啟MultiWAL功能,允許多個HLog)。每個HLog是多個Region共享的,圖中Region A、Region B和Region C共享一個HLog文件。
?HLog中,日志單元WALEntry(圖中小方框)表示一次行級更新的最小追加單元,它由HLogKey和WALEdit兩部分組成,其中HLogKey由table name、region name以及sequenceid等字段構成。
WALEdit用來表示一個事務中的更新集合,在0.94之前的版本中,如果一個事務對一行row R三列c1、c2、c3分別做了修改,那么HLog中會有3個對應的日志片段,如下所示:
然而,這種日志結構無法保證行級事務的原子性,假如RegionServer更新c2列之后發生宕機,那么一行記錄中只有部分數據寫入成功。為了解決這樣的問題,HBase將一個行級事務的寫入操作表示為一條記錄,如下所示:
其中,WALEdit會被序列化為格式,比如,-1為標識符,表示這種新的日志結構。
HLog文件存儲
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整個生命周期如圖所示。
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原理與實踐》一書
總結
以上是生活随笔為你收集整理的hbasehlog_HBase原理--RegionServer核心组件之HLog的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: jmeter如何通过后置处理器提取(正则
- 下一篇: 【Jmeter篇】如何利用Jmeter配