hbase region分配,RS下線處理
RS下線的regionassign
上面在RS啟動部分已經提到過,RS在zk中的地址註冊為SESSION過期自動清理的路徑(ephemeral)。
在master中通過RegionServerTracker對rs進行監控,
當rs在zk的session過期時間內沒有向zk傳送心跳。表示rs已經下線,會觸發RegionServerTracker.nodeDeleted
publicvoidnodeDeleted(Stringpath){
if(path.startsWith(watcher.rsZNode)){
String
serverName= ZKUtil.getNodeName(path
.........此處省去一些註釋
ServerName sn= ServerName.parseServerName(serverName);
如果此server本身在ServerManager的onlineServers列表中不存在.不做處理
if(!serverManager.isServerOnline(sn)){
.........此處省去一些註釋
return;
}
從RegionServerTracker.onlineServers列表中移出此server
remove(sn);
通過Servermanager.expireServer對server執行下線操作。
首先從ServerManager.onlienServers
檢查是否是clustershutdown,如果是,不做rs的下線處理,否則執行下面流程。
檢查server中是否包含metaregion,如果包含metaregion,通過MetaServerShutdownHandler處理下線操作
否則通過ServerShutdownHandler處理下線操作。
this.serverManager.expireServer(sn);
}
}
ServerShutdownHandleruser region的重新分配流程:
1.通過hbase.master.distributed.log.replay
2.通過hbase.master.log.replay.wait.region.timeout配置logreplay的等待超時時間,預設為15000ms
3.檢查是否包含metaregion,此處不分析此部分程式碼。
4.得到metaregion的路徑,並通過MetaReader從meta中得到下線的RS的所有regions列表。
5.執行日誌的split處理,不分析。
if(this.shouldSplitHlog){
LOG.info("Splittinglogs for " + serverName+ " before assignment.");
if(this.distributedLogReplay){
LOG.info("Markregions in recovery before assignment.");
Set<ServerName>serverNames= newHashSet<ServerName>();
serverNames.add(serverName);
this.services.getMasterFileSystem().prepareLogReplay(serverNames);
} else{
this.services.getMasterFileSystem().splitLog(serverName);
}
am.getRegionStates().logSplit(serverName);
6.通過AssignmentManager.assign(list)重新分配所有的region.