现象
将主机网线拔掉后,RegionServer过一段时间会shutdown掉,RegionServer的异常超时检测机制是由哪个参数控制的呢?
Regionsever异常shutdown日志:
2017-08-03 21:17:42,762 WARN [main-SendThread(OCSCloud07:9501)]zookeeper.ClientCnxn: Session 0x25ce22897746d12 for serverOCSCloud07/134.32.62.7:9501, unexpected error, closing socket connection and attempting reconnect
java.io.IOException: No route to host
at sun.nio.ch.FileDispatcherImpl.read0(Native Method)
at sun.nio.ch.SocketDispatcher.read(SocketDispatcher.java:39)
at sun.nio.ch.IOUtil.readIntoNativeBuffer(IOUtil.java:223)
at sun.nio.ch.IOUtil.read(IOUtil.java:192)
at sun.nio.ch.SocketChannelImpl.read(SocketChannelImpl.java:384)
atorg.apache.zookeeper.ClientCnxnSocketNIO.doIO(ClientCnxnSocketNIO.java:68)
at org.apache.zookeeper.ClientCnxnSocketNIO.doTransport(ClientCnxnSocketNIO.java:355)
at org.apache.zookeeper.ClientCnxn$SendThread.run(ClientCnxn.java:1081)
2017-08-03 21:17:43,122 INFO [LeaseRenewer:e3base@drmcluster]retry.RetryInvocationHandler: Exception while invoking renewLease of classClientNamenodeProtocolTr anslatorPBover OCSCloud04/134.32.62.4:8020. Trying to fail over immediately.
java.net.NoRouteToHostException: No Route toHost from OCSCloud11/134.32.62.11 toOCSCloud04:8020 failed on socket timeout exception: java.net.NoRouteToHostExcep tion: No route to host; For more detailssee:http://wiki.apache.org/hadoop/NoRouteToHost
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
问题解决
在hbase中设置超时时间是没用的,必须修改zookeeper自身的maxSessionTimeout为1200000,才能真正起到加长zookeeper的session超时时间的作用
在RegionServer启动时,会在Zookeeper集群中创建自己的ZNode临时节点并获得该节点的独占锁,这个节点位于Zookeeper集群中的/hbase/rs目录下。
RegionServer会通过Socket连接向Zookeeper集群发起Session会话,会话建立后在Zookeeper集群中创建属于自己的临时节点ZNode。这个节点的状态是由Zookeeper集群依据Session的状态来维护的。
RegionServer作为客户端,向Zookeeper集群的Server端发起Session会话请求。Session建立后,会以唯一的SessionID作为标示。Client会定期向Server端发送Ping消息来表达该Session的存活状态;而Server端收到Ping消息时会更新当前Session的超时时间。如此,对于Client而言,只要Ping信息可达则表明该Session激活;对于Server而言,只要Session未超时则表明该Session激活。
在Server端,Zookeeper会启动专门的SessionTrackerImpl线程来处理Session的相关状态迁移问题,该线程每隔tickTime(Zookeeper配置文件中指定,默认为2 s)时间遍历一次Session列表,如果超时则立即关闭此Session,同时删除与该Session关联的临时节点,并将该事件通知给注册了该节点事件的组件。在HBase集群中,这就意味着如果RegionServer崩溃,则Zookeeper需要在Session超时后才能通知Master,后者才能启动故障恢复。
而Session的超时时间是这样确定的:HBase默认的Timeout为180 s,在创建Session时会将该参数传递给Server端。最终协商确定的Session的超时时间由Zookeeper的配置参数决定,处于Zookeeper集群minSessionTimeout和maxSessionTimeout之间。默认的minSessionTimeout=2×tickTime(默认2 s)=4 s,maxSessionTimeout=20×tickTime=40 s。不管Client传递的Timeout多大,最终协商确定的Session的Timeout时间都在4~40 s之间,实现代码如下。如果一切按照默认配置,则Session的Timeout为40 s。
int sessionTimeout=connReq.getTimeOut();
int minSessionTimeout=getMinSessionTimeout();
if(sessionTimeout
sessionTimeout=minSessionTimeout;
}
int maxSessionTimeout=getMaxSessionTimeout();
if(sessionTimeout>maxSessionTimeout){
sessionTimeout=maxSessionTimeout;
}
cnxn.setSessionTimeout(sessionTimeout);
经以上分析,可以得出以下结论:Session存活意味着RegionServer存活;Session超时意味着RegionServer启动时创建的ZNode节点被删除,也就表明该RegionServer异常