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

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

运行客户端程序时,我通过关闭Curator用于与Zookeeper通信的NIC来模拟网络分区。根据我看到的行为,我有几个问题:
  • 10秒后,我看到ConnectionStateManager - State change: SUSPENDED消息。是否可以根据其他超时值的百分比(或始终为10秒)来配置Curator进入SUSPENDED状态的时间量?
  • 自从上一次成功的心跳之后,经过配置的15秒 session 超时后,我没有收到通知。我会在日志中看到ZooKeeper - Session: 0x14adf3f01ef0001 closed消息,但是这似乎并没有引起我可以捕获或监听的事件。我在这里想念什么吗?
  • 在连接断开后将近两分钟,我最终收到了ConnectionStateManager - State change: LOST消息。为什么这么久?
  • 如果我的目标是使用InterProcessMutex作为在高可用性方案中防止脑裂的方法,则似乎最安全的方法是让锁持有人假定收到SUSPENDED消息时它已经失去了锁,因为它Zookeeper完全释放了锁
    它在网络分区的另一端是未知的。这是典型/理智的方法吗?
  • 最佳答案

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

    10-07 16:20