在 Curator 的重试尝试中处理来自 ZooKeeper 的 EndOfStreamException?

Deal with EndOfStreamException from ZooKeeper while Curator's retry attempt?

我正在使用 Apache Curator 框架创建一个由 ZK 管理的集群。

当集群中的某个节点突然失去与 ZK 的连接时,它会尝试每 5 秒重新连接一次。为此,我在指定时间使用 RetryForever 政策。

虽然 sessionTimeout/connectionTimeouts 尚未完全过去,但我们仍在尝试重新连接。

但即使我们在这段时间内提升了 ZK 并获得了与它的连接,我们仍然会在日志中收到奇怪的消息:

Thu Nov 30 20:47:51.574 GMT 2017|  INFO  | org.apache.zookeeper.ClientCnxn$SendThread | Socket connection established to zk_1.default/138.122.177.23:2181, initiating session |Client Details{sessionTag:{}}| localhost-startStop-1-SendThread(zk_1.default:2181)

Thu Nov 30 20:47:51.592 GMT 2017|  INFO  |
org.apache.zookeeper.ClientCnxn$SendThread | Unable to read additional
data from server sessionid 0x1600ea13dcd0000, likely server has closed
socket, closing socket connection and attempting reconnect |Client
Details{sessionTag:{}}|
localhost-startStop-1-SendThread(zk_1.default:2181)

为什么我们仍然收到这些消息,并且无法完全连接到新创建的 ZK 节点?

  1. 稍后我发现this error意味着ZK已经用完了它的maxClientCnxns(到ZK的最大连接数)参数,但我还没有找到如何使用 Curator 配置它...仅在测试中...

  2. 在 ZK 服务器端,我看到以下错误:

    2017-12-04 15:48:29,972 [myid:] - INFO  [NIOServerCxn.Factory:0.0.0.0/0.0.0.0:2181:NIOServerCnxnFactory@192] - Accepted socket connection from /192.168.107.4:37130
    2017-12-04 15:48:29,974 [myid:] - INFO  [NIOServerCxn.Factory:0.0.0.0/0.0.0.0:2181:ZooKeeperServer@915] - Refusing session request for client /138.122.177.23:37130 as it has seen zxid 0xd our last zxid is 0x0 client must try another server
    

答案就在这里:http://grokbase.com/t/cloudera/cdh-user/134hrpr3nc/zookeeperserver-refusing-session-request-for-client-any-ideas

这意味着客户端正在与 ZK 服务器对话并且最后看到交易 ID 0x11be4(或十进制的 72676)。它尝试访问的当前服务器 连接当前具有事务 ID 0x3f82(或十进制的 16258) 是(很多)低。假设客户端看到的数据比 服务器可以提供什么,可能会导致冲突 信息。它没有给客户坏的(过时的)信息,而是拒绝 假设客户端将重新连接到的连接 仲裁中具有更多最新数据的另一台服务器,或者当前 过时的服务器最终会收到来自另一个法定人数的快照 会员赶上。