hbase的meta region挂掉之后的问题跟踪
近日对hbase进行稳定性测试,因为主机资源有限,所以使用多个虚拟机搭了一个分布式hbase集群,无意中停了一个虚拟机,然后启动hbase发现整个集群无法启动,hmaster报了一个网络异常之后,就直接退出了。
于是开始跟踪hmaster启动部分的源码。
hmaster的大郅步骤:
1.连接zk,创建masternode的watcher
2.检查rootregion是否存在
3.启动对zkrootnode和metanode的track
4分配root到对应的regionServer
5分配meta到对应的regionServer
现在就卡在了分配meta到对应的regionServer这一步。
查看源码
privateHRegionInterfacegetMetaServerConnection(booleanrefresh)
throwsIOException,InterruptedException{
synchronized(metaAvailable){
if(metaAvailable.get()){
HRegionInterfacecurrent=getCachedConnection(metaLocation);
if(!refresh){
returncurrent;
}
if(verifyRegionLocation(current,this.metaLocation,META_REGION)){
returncurrent;
}
resetMetaLocation();
}
HRegionInterfacerootConnection=getRootServerConnection();
if(rootConnection==null){
returnnull;
}
HServerAddressnewLocation=MetaReader.readMetaLocation(rootConnection);
if(newLocation==null){
returnnull;
}
HRegionInterfacenewConnection=getCachedConnection(newLocation);//此处抛出IOException
if(verifyRegionLocation(newConnection,this.metaLocation,META_REGION)){
setMetaLocation(newLocation);
returnnewConnection;
}
returnnull;
}
}
现在进行故障回放:
在hbase集群停止运行状态下,META对应的regionserver虚拟机被挂了,于是hmaster启动时,根据root表找到对应meta所以在regionserver地址,然后建立到对应regionserver的连接,但此时这台regionserver已经down了,连接失败,抛出网络层的IOException,于是hmaster无法启动。
虽然这种故障出现的概率不高,因为只有在hbase集群停止的情况下,刚好对应的metaserver挂了,所以才会造成meta表无法指定regionserver。但考虑海量数据情况下,meta表也会分裂,从而可能存在多台regionserver上,出现这种故障的概率就高了。
所以考虑对代码进行,catchIOException进行另外指定
HRegionInterfacenewConnection=null;
try{
newConnection=getCachedConnection(newLocation);
}catch(IOExceptione){
//从当前已经启动成功的regionserver中,找一台机器来接管meta表
}