4

我创建了一个 Curator 客户端,如下所示:

    RetryPolicy retryPolicy = new RetryNTimes(3, 1000);
    CuratorFramework client = CuratorFrameworkFactory.newClient(zkConnectString, 
            15000, // sessionTimeoutMs
            15000, // connectionTimeoutMs
            retryPolicy);

在运行我的客户端程序时,我通过关闭 Curator 用来与 Zookeeper 通信的 NIC 来模拟网络分区。根据我看到的行为,我有几个问题:

  1. ConnectionStateManager - State change: SUSPENDED我在 10 秒后看到一条消息。直到 Curator 进入 SUSPENDED 状态的时间量是可配置的,基于其他超时值的百分比,还是总是 10 秒?
  2. 自上次成功的检测信号后,配置的 15 秒会话超时后,我没有收到任何通知。确实在日志中看到了一条ZooKeeper - Session: 0x14adf3f01ef0001 closed消息,但这似乎并没有作为我可以捕获或侦听的事件来传播。我在这里错过了什么吗?
  3. ConnectionStateManager - State change: LOST我最终在连接丢失近两分钟后收到一条消息。为什么这么长?
  4. 如果我的目标是在 HA 场景中使用 InterProcessMutex 作为防止脑裂的手段,似乎最安全的方法是让锁持有者在SUSPENDED收到消息时假设它已经丢失了锁,因为它完全是Zookeeper 可能在网络分区的另一端释放了它不知道的锁。这是一种典型/理智的方法吗?
4

3 回答 3

2

这取决于您使用的策展人版本(注意:我是策展人的主要作者)...

在 Curator 2.x 中,LOST 状态意味着重试策略已用尽。这并不意味着会话已经丢失。在 ZooKeeper 中,只有在修复与 ensemble 的连接后才会确定会话丢失。因此,当 Curator 看到第一条“断开连接”消息时,您会被暂停。然后,当由于重试策略放弃而导致操作失败时,您会丢失。

在 Curator 3.x 中,LOST 的含义发生了变化。在 3.x 中,当收到“断开连接”时,Curator 会启动一个内部计时器。当计时器经过协商的会话超时时,Curator 调用 getTestable().injectSessionExpiration() 并发布 LOST 状态更改。

于 2017-01-03T14:00:20.627 回答
0

正确的。假设在 SUSPEND 和 LOST 中失去了领导权。这就是 Apache Curator 配方的工作方式。您可能想要使用 Apache Curator 而不是实现自己的算法。 https://curator.apache.org/curator-recipes/index.html

于 2016-12-30T22:26:12.753 回答
0

第一个问题,Zookeeper 有一个名为 MAX_SEND_PING_INTERVAL 的变量,它是 10 秒,所以根据您的情况,它总是 10 秒。代码在 ClientCnxn 类中。

//1000(1 second) is to prevent race condition missing to send the second ping
//also make sure not to send too many pings when readTimeout is small 
int timeToNextPing = readTimeout / 2 - clientCnxnSocket.getIdleSend() - 
        ((clientCnxnSocket.getIdleSend() > 1000) ? 1000 : 0);
//send a ping request either time is due or no packet sent out within MAX_SEND_PING_INTERVAL
if (timeToNextPing <= 0 || clientCnxnSocket.getIdleSend() > MAX_SEND_PING_INTERVAL) {
    sendPing();
    clientCnxnSocket.updateLastSend();
} else {
    if (timeToNextPing < to) {
        to = timeToNextPing;
    }
}
于 2020-03-19T04:47:41.313 回答