`
hongs_yang
  • 浏览: 59551 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

hbase region分配,RS下线处理

阅读更多

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.

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics