1. 程式人生 > >hbase region分配,RS下線處理

hbase region分配,RS下線處理

RS下線的regionassign

上面在RS啟動部分已經提到過,RSzk中的地址註冊為SESSION過期自動清理的路徑(ephemeral)

master中通過RegionServerTrackerrs進行監控,

rszksession過期時間內沒有向zk傳送心跳。表示rs已經下線,會觸發RegionServerTracker.nodeDeleted

publicvoidnodeDeleted(Stringpath){

if(path.startsWith(watcher.rsZNode)){

String serverName= ZKUtil.getNodeName(path

);

.........此處省去一些註釋

ServerName sn= ServerName.parseServerName(serverName);

如果此server本身在ServerManageronlineServers列表中不存在.不做處理

if(!serverManager.isServerOnline(sn)){

.........此處省去一些註釋

return;

}

RegionServerTracker.onlineServers列表中移出此server

remove(sn);

通過Servermanager.expireServerserver執行下線操作。

首先從ServerManager.onlienServers

列表中移出此server,同時把server新增到deadServers列表中。

檢查是否是clustershutdown,如果是,不做rs的下線處理,否則執行下面流程。

檢查server中是否包含metaregion,如果包含metaregion,通過MetaServerShutdownHandler處理下線操作

否則通過ServerShutdownHandler處理下線操作。

this.serverManager.expireServer(sn);

}

}

ServerShutdownHandleruser region的重新分配流程:

1.通過hbase.master.distributed.log.replay

配置是否分散式日誌重播,預設為false

2.通過hbase.master.log.replay.wait.region.timeout配置logreplay的等待超時時間,預設為15000ms

3.檢查是否包含metaregion,此處不分析此部分程式碼。

4.得到metaregion的路徑,並通過MetaReadermeta中得到下線的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.