zookeeper常见问题

连接超时问题

在session timeout时间内重连成功

1.client连上时立刻收到事件type=session_event(-1),state=connected_state(3),不需要重新注册watcher,已创建的节点仍在存在;
2.重连后client把已有的watch信息全部收集起来发给服务端,服务端会把这些信息和自己的信息做比对,如果有不同会发送给客户端事件。以免心跳超时后,会话没有超时时,因为不是同一个TCP连接导致信息丢失。

超过session timeout时间后重连成功

客户端连上立刻收到事件type=session_event(-1),state=session_expired_state(-112),此时需要重新注册watcher,原有创建的节点被删除,需要重新创建一个客户端实例和重新注册监听器。若确认能连上(如稍后成功创建了一个节点),客户端又会收到事件type=session_event(-1),state=connected_state(3)。

一直重连不成功

客户端不会收到任何事件。

相关链接ZK 网络故障应对法

SessionTimeOut设置

SessionTimeOut是client和server协商的结果,并不是单纯地在client端配置。
1.client的recv_timeout随握手协议一起发给server

zookeeper常见问题
2.client的SessionTimeOut时间实际是经过服务端下发之后的,并不一定是最先设置的
zookeeper常见问题

配置文件配置了maxSessionTimeOut和minSessionTimeOut

最终SessionTimeOut,必须在minSessionTimeOut和maxSessionTimeOut区间里,如果跨越上下界,则以跨越的上届或下界为准。

配置文件没有配置maxSessionTimeOut和minSessionTimeOut

maxSessionTimeout没配置则 maxSessionTimeOut设置为 20 * tickTime

minSessionTimeOut没配置则 minSessionTimeOut设置为 2 * tickTime

默认配置中tickTime为2秒,SessionTimeOut的合法范围为 4秒~40秒;如果tickTime也没配置,那么tickTime缺省为3秒。

相关链接笃行杂记之Zookeeper SessionTimeOut分析