天天看點

HFile和HLog的回收機制

正常回收流程

HBase資料主要存儲在分布式檔案系統上HFile和HLog檔案中。HBase資料基于LSM模型,寫操作寫到記憶體(MemStore)和Write Ahead Log(HLog, 放在.logs下regionserver目錄下)就傳回。

當記憶體不足或者MemStore超過一定大小的時候,HBase會将MemStore的資料順序寫到分布式檔案系統上,形成一個HFile。

當RegionServer程序down機時候,regionserver的log目錄會被HMaster重命名(添加-splitting字尾),目錄下所有hlog會被logSpliter分割成為各個region的recover.edits. 當log split完成之後,HMaster會将log移動到.oldlog目錄下。

當小的HFile過多的時候,會将多個小的HFile壓縮形成一個大的HFile。壓縮完成之後這些小的HFile就被移動.archive目錄下。

如果HLog裡所有記錄對應的資料都已經重新整理到HFile上,HLog就被RegionServer移動到.oldlog目錄下。

HMaster上的定時線程HFileCleaner/LogCleaner周期性掃描archive目錄和.oldlog目錄, 判斷目錄下的HFile或者HLog是否可以被删除,如果可以, 就直接删除檔案.

recyling

TimeToLive

為了防止系統錯誤删除HFile/HLog, HFile/HLog都有一個全局的過期時間(TTL), 超過這個過期時間的HFile/HLog才被删除. 這個過期時間可以通過hbase.master.logcleaner.ttl和hbase.master.hfilecleaner.ttl配置(機關是ms)

Replication

HBase的Replication是通過将主叢集的HLog推送到備叢集,然後在備叢集上重放Hlog實作的, 是以如果在oldlog目錄下的HLog還在被Replication推送完成,這些檔案不能删除。

HMaster上的ReplicationLogCleaner通過zk負責記錄Replication正在使用那些HLog。

當Regionserver建立一個新的hlog時,Replication會在對應zk replication目錄下建立相應的hlog節點,即将hlog加入replication隊列。

ReplicationLogCleaner會收到zk上replication目錄節點建立的通知,将此hlog标記為使用中。

當Replication推送完成hlog的資料後,replicaton會将zk上replication目錄下hlog節點删除。

ReplicationLogCleaner會收到節點删除通知,将此hlog标記為可删除。

當然需要注意的是一個hlog可能同時被多個不同peer的replication使用,隻有當所有不同peer的replication都推送完成這個hlog的資料之後,這個hlog才能被删除。

SnapShot

标的Snapshot在單獨的snapshot目錄下,建立了表結構和HFile的引用。HMaster上SnapshotFileCache會定期掃描分布式檔案系統上的snapshot目錄,标記那些HFile現在被某個Snapshot引用。HMaster上的HFileCleaner在嘗試删除HFile時候會通過SnapshotHFileCleaner檢查HFile是否被引用,如果被引用就不能删除。

Region Split

當Region大小超過一定門檻值時,Region會自動分裂成兩個子Region. Region Split執行時間是秒級别的.

Split前父Region會預flush一次,然後關閉Region的寫,最後做一次flush, 保證Region所有的資料都寫到HFile中。

Split時兩個Region并不實際分割父Region的HFile,而是在子Region目錄下生成父region所有HFile引用。 這些引用指向實際的HFile檔案,子Region Compaction時候,會删除這些引用,生産真實的HFile。

HMaster上定時線程CatalogJanitor會周期性掃描出Meta表上的分裂後的父Region,通過父Region找到分裂後的兩個子Region。通過掃描兩個子Region的hdfs目錄,确認兩個子Region是否還有到父Region的引用(HFile 引用是有特殊的檔案名)。确認子Region中所有引用HFile都被compaction回收之後,CatalogJanitor線程會将父Region的HFile,被移動到archive目錄下,删除meta表上遺留的父region資料,已經父region的hdfs目錄。

上一篇: (?m)