hbase region分配,RS下线处理

来源:互联网 发布:网络摄像机拍照 编辑:程序博客网 时间:2024/05/22 02:12

RS下线的regionassign

上面在RS启动部分已经提到过,RSzk中的地址注册为SESSION过期自动清理的路径(ephemeral)

master中通过RegionServerTrackerrs进行监控,

rszksession过期时间内没有向zk发送心跳。表示rs已经下线,会触发RegionServerTracker.nodeDeleted

publicvoidnodeDeleted(Stringpath){

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

StringserverName= ZKUtil.getNodeName(path);

.........此处省去一些注释

ServerNamesn= 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.


0 0
原创粉丝点击