? ?Hbase 每一次對數(shù)據(jù)的修改都會寫入到memorystore 中勇吊,寫入成功后,Hbase 便會將這條記錄寫入到hlog中去萧福。當memorystore滿足一定的條件后辈赋,hregionserver 便會將memorystore flush到磁盤中,記錄著這些memorystore的hlog便會被刪除掉钥屈。當hbase regionserver正常運行時,hlog并不起到任何作用篷就,但是當regionserver出現(xiàn)故障宕機時,未刷寫到磁盤中的memorystore數(shù)據(jù)便會丟失智润,此時便可以通過hlog對丟失的數(shù)據(jù)進行數(shù)據(jù)恢復未辆。hlog恢復數(shù)據(jù)的過程被稱為log split窟绷。本文闡述了hlog的基本結構咐柜、生成過程以及l(fā)og split 的方式攘残。
一为狸、hlog的基本結構
hlog是regionserver級別的,hlog由regionserver中的region共享辐棒,其分布如下圖所示:
hlog 由一個個entry<HLogKey,WALEdit>構成,HLogKey由sequenId知态、wirte time 立叛、cluster ids负敏、region name秘蛇、table name 構成
二、hlog 生成過程
hlog 滾動:regionserver啟動一個線程定期(由參數(shù)’hbase.regionserver.logroll.period’決定妖泄,默認1小時)對hlog進行滾動艘策,重新創(chuàng)建一個新的hlog.,這樣,regionserver上就會產(chǎn)生很多小的hlog 文件朋蔫,hbase這樣做的原因是當hbase的數(shù)據(jù)越來越多時,hlog的大小就會越來越大驯妄。當memorystore 刷寫到磁盤時,過期的hlog 并沒有作用便可刪除源织,一個個小的hlog文件便于刪除。
hlog失效:當memorystore flush 到磁盤后谈息,將hlog中最大的seqId與memorystore中最大的seqId進行比較凛剥,如果小于memorystore中的seqId,則改hlog失效黎茎,便將該hlog移到由wals文件夾移到oldwals文件中去
hlog刪除:當hlog失效后当悔,不立即刪除是因為region replica可能正在對hlog進行讀寫踢代,所以regionserver啟動一個線程每隔一段時間(由參數(shù)’hbase.master.cleaner.interval’嗅骄,默認1分鐘)對檢查該hlog是否可以被刪除,在oldwals文件夾中的hlog文件都有過期時間溺森,默認(由參數(shù)’hbase.master.logcleaner.ttl’決定)為10分鐘
三、log split過程
HBase的故障恢復我們都以RegionServer宕機恢復為例医窿,引起RegionServer宕機的原因各種各樣,有因為Full GC導致姥卢、網(wǎng)絡異常導致渣聚、官方Bug導致(close wait端口未關閉)以及DataNode異常導致等等。
這些場景下一旦RegionServer發(fā)生宕機奕枝,HBase都會馬上檢測到這種宕機,并且在檢測到宕機之后會將宕機RegionServer上的所有Region重新分配到集群中其他正常RegionServer上去隘道,再根據(jù)HLog進行丟失數(shù)據(jù)恢復,恢復完成之后就可以對外提供服務当船,整個過程都是自動完成的,并不需要人工介入〔韵ⅲ基本原理如下圖所示:
log split有三種方式,分別是 log split 表谊、distributed log split 盖喷、distributed log repay
1.log split
log split過程是由Hmaster控制完成的,流程如下
1.將hdfs 上對應regionserver的hlog目錄重命名(regionserver hlog文件一般存放在/hbase/wals/regionserver/目錄中)為/hbase/wals/regionserver-spliting,為了防止hmaster在進行l(wèi)og split時客戶端還對regionserver進行讀寫請求
2.Hmaster 讀取hlog文件课梳,并按region進行分組余佃,對每個region生成一個buffer跨算,并將hlog文件數(shù)據(jù)讀取到各個region中去。
3. 每個buffer會對應啟動一個寫線程诸蚕,負責將buffer中的數(shù)據(jù)寫入hdfs中(對應的路徑為/hbase/table_name/region/recoverd.edits/.tmp),再等Region重新分配到其他RegionServer之后按順序回放對應Region的日志數(shù)據(jù)坏瘩。
這種日志切分可以完成最基本的任務,但是效率極差倔矾,在某些場景下(集群整體宕機)進行恢復可能需要N個小時蛉幸!也因為恢復效率太差破讨,所以開發(fā)了Distributed Log Splitting架構奕纫。
2.distributed log split
distributed log split 是 log split的分布式實現(xiàn),由hmater和regionserver共同完成匹层,hmaster作為協(xié)調者,regionserver為log split的實際工作者撑柔,如圖所示:
Distributed Log Splitting
Distributed Log Splitting是Log Splitting的分布式實現(xiàn)您访,它借助Master和所有RegionServer的計算能力進行日志切分,其中Master作為協(xié)調者灵汪,RegionServer作為實際的工作者∠硌裕基本工作原理如下圖所示:
1. Master會將待切分日志路徑發(fā)布到Zookeeper節(jié)點上(/hbase/splitWAL)览露,每個日志作為一個任務荧琼,每個任務都會有對應狀態(tài),起始狀態(tài)為TASK_UNASSIGNED
2. 所有RegionServer啟動之后都注冊在這個節(jié)點上等待新任務堰乔,一旦Master發(fā)布任務之后,RegionServer就會搶占該任務
3. 搶占任務實際上首先去查看任務狀態(tài)浩考,如果是TASK_UNASSIGNED狀態(tài)被盈,說明當前沒有人占有析孽,此時就去修改該節(jié)點狀態(tài)為TASK_OWNED只怎。如果修改失敗,說明其他RegionServer也在搶占邓尤,修改成功表明任務搶占成功。
4. RegionServer搶占任務成功之后會分發(fā)給相應線程處理汞扎,如果處理成功擅这,會將該任務對應zk節(jié)點狀態(tài)修改為TASK_DONE澈魄,一旦失敗會修改為TASK_ERR
5. Master會一直監(jiān)聽在該ZK節(jié)點上仲翎,一旦發(fā)生狀態(tài)修改就會得到通知。任務狀態(tài)變更為TASK_ERR的話溯香,Master會重新發(fā)布該任務,而變更為TASK_DONE的話结笨,Master會將對應的節(jié)點刪除
下圖是RegionServer搶占任務以及搶占任務之后的工作流程:
1. 假設Master當前發(fā)布了4個任務湿镀,即當前需要回放4個日志文件,分別為hlog1肠骆、hlog2塞耕、hlog3和hlog4
2. RegionServer1搶占到了hlog1和hlog2日志,RegionServer2搶占到了hlog3日志,RegionServer3搶占到了hlog4日志
3. 以RegionServer1為例廓脆,其搶占到hlog1和hlog2日志之后會分別分發(fā)給兩個HLogSplitter線程進行處理,HLogSplitter負責對日志文件執(zhí)行具體的切分停忿,切分思路還是首先讀出日志中每一個數(shù)據(jù)對蚊伞,根據(jù)HLogKey所屬Region寫入不同的Region Buffer
4. 每個Region Buffer都會有一個對應的寫線程席赂,將buffer中的日志數(shù)據(jù)寫入hdfs中时迫,寫入路徑為/hbase/table/region2/seqenceid.temp,其中seqenceid是一個日志中某個region對應的最大sequenceid
5. 針對某一region回放日志只需要將該region對應的所有文件按照sequenceid由小到大依次進行回放即可
這種Distributed Log Splitting方式可以很大程度上加快整個故障恢復的進程癞揉,正常故障恢復時間可以降低到分鐘級別。然而喊熟,這種方式會產(chǎn)生很多日志小文件姐刁,產(chǎn)生的文件數(shù)將會是M * N芥牌,其中M是待切分的總hlog數(shù)量龙填,N是一個宕機RegionServer上的Region個數(shù)。假如一個RegionServer上有200個Region岩遗,并且有90個hlog日志,一旦該RegionServer宕機案铺,那這種方式的恢復過程將會創(chuàng)建 90 * 200 = 18000個小文件。這還只是一個RegionServer宕機的情況控汉,如果是整個集群宕機小文件將會更多7滴恰!测僵!
轉載自:https://blog.csdn.net/lw_ghy/article/details/60779289