HBase檢測宕機是通過Zookeeper實現(xiàn)的, 正常情況下RegionServer會周期性向Zookeeper發(fā)送心跳,一旦發(fā)生宕機,心跳就會停止,超過一定時間(SessionTimeout,我們集群配置的是30s)Zookeeper就會認為RegionServer宕機離線,并將該消息通知給Master。
Master檢測到宕機之后會將宕機RegionServer上的所有Region重新分配到集群中其他正常RegionServer上去,再根據(jù)HLog進行丟失數(shù)據(jù)恢復,恢復完成之后就可以對外提供服務,整個過程都是自動完成的。
HBase切分HLog當前主要有兩種模式Distributed Log Splitting和Distributed Log Replay。
由于我們的集群沒有配置hbase.master.distributed.log.replay=true,所以這里主要研究Distributed Log Splitting流程。
Distributed Log Splitting
整體流程:
Master作為HLog切分任務的協(xié)調(diào)者,主要工作流程如下:
Master會將待切分日志路徑發(fā)布到Zookeeper節(jié)點上(/hbase/splitWAL),每個日志作為一個任務,每個任務都會有對應狀態(tài),起始狀態(tài)為TASK_UNASSIGNED
所有RegionServer啟動之后都注冊在這個節(jié)點上等待新任務,一旦Master發(fā)布任務之后,RegionServer就會搶占該任務
搶占任務實際上首先去查看任務狀態(tài),如果是TASK_UNASSIGNED狀態(tài),說明當前沒有人占有,此時就去修改該節(jié)點狀態(tài)為TASK_OWNED。如果修改失敗,說明其他RegionServer也在搶占,修改成功表明任務搶占成功。
RegionServer搶占任務成功之后會分發(fā)給相應線程處理,如果處理成功,會將該任務對應zk節(jié)點狀態(tài)修改為TASK_DONE,一旦失敗會修改為TASK_ERR
Master會一直監(jiān)聽在該ZK節(jié)點上,一旦發(fā)生狀態(tài)修改就會得到通知。任務狀態(tài)變更為TASK_ERR的話,Master會重新發(fā)布該任務,而變更為TASK_DONE的話,Master會將對應的節(jié)點刪除
Regionserver作為實際工作的執(zhí)行者,搶占任務以及搶占任務之后的工作流程:
假設Master當前發(fā)布了3個任務,即當前需要回放3個日志文件,分別為hlog1、hlog2和hlog3
RegionServer1搶占到了hlog1和hlog2日志,RegionServer2搶占到了hlog3日志,
以RegionServer1為例,其搶占到hlog1和hlog2日志之后會分別分發(fā)給兩個HLogSplitter線程進行處理,HLogSplitter負責對日志文件執(zhí)行具體的切分,切分思路還是首先讀出日志中每一個<HLogKey, WALEdit>數(shù)據(jù)對,根據(jù)HLogKey所屬Region寫入不同的Region Buffer,寫入Region Buffer之前會對Entrys進行過濾,通過比較sequenceId,如果發(fā)現(xiàn)該Entry已經(jīng)flush了,就跳過這個Entry。
每個Region Buffer都會有一個對應的寫線程,將buffer中的日志數(shù)據(jù)寫入hdfs中,寫入路徑為hdfs:/hbase/data/ns/table/region1/seqenceidN.temp,其中seqenceid是一個日志中某個region對應的最大sequenceid
針對某一region回放日志只需要將該region對應的所有文件按照sequenceid由小到大依次進行回放即可
源碼:
-
檢測宕機 發(fā)布任務:
-
RS搶占、處理任務
-
Region replay、上線
整個切分過程中可能出現(xiàn)的問題、解決方法:(持續(xù)更新)
1.RS節(jié)點假死后,DataNode進程處于存在但不可服務的狀態(tài),會導致hbase split wal超時到幾乎無法進行,10分鐘后DataNode徹底下線才能恢復性能
處理:聯(lián)系SA關機、重啟機器,可以加速集群恢復
- RS 切分任務失敗時,Master會重新發(fā)布任務,如果某個切分任務卡死,無法順利完成時,可以手動刪除zookeeper上/hbase/splitWAL 下的任務節(jié)點,master會重新發(fā)布 (待驗證)
參考:http://hbasefly.com/2016/10/29/hbase-regionserver-recovering/