当前位置: 主页 > 大数据 >

hbase region分配办法与RS下线处理方式

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

在master中通过RegionServerTracker对rs进行监控,

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

publicvoidnodeDeleted(Stringpath){

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

StringserverName= ZKUtil.getNodeName(path);

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

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

  • 发表于: