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列表中移出此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的路径,并通过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.