ZooKeeper - 在一个或多个客户端失去与ZooKeeper

时间:2015-07-23 06:54:59

标签: java apache-zookeeper distributed-system orchestration

我在各自的JVM中运行了两个进程(比如节点A和B)。它们连接到单个ZooKeeper服务器以协调任务执行。其中一个节点(A或B)应该一次执行scheduled task (freq 1 minute),而不是两者。此外,如果A失败,那么B应该接管在下一个预定时间执行任务。

以下是问题

节点A赢得比赛并在ZooKeeper上创建一些短暂节点,表明它已经开始执行任务。一旦A开始执行任务,它就失去了与ZooKeeper的连接,因此ZooKeeper会在一段时间后删除短暂节点。由于数据意外的更大,执行超过1分钟的边界。现在,当B醒来时,它不会看到A先前创建的任何短暂节点。在没有该节点的情况下,B认为没有其他节点正在执行该任务,并且它也开始与disconnected A并行地执行任务,这是错误的。 A或B应该运行任务。

我更喜欢A来完成已启动的任务,即使它没有连接到ZooKeeper而B也没有并行运行直到A完成任务。

我正在使用org.I0Itec.zkclient.ZkClient客户端库。除了自定义heartbeat机制之外,还有其他解决方案吗?

2 个答案:

答案 0 :(得分:1)

另一个解决方案是拥有一个目录,其中包含正在执行的所有当前任务。当节点A完成任务T的执行时,节点B已经开始执行任务T.现在,您可以做的是尝试终止节点B并提交节点A产生的所有更改。这是推测执行原理的变体。如果节点A成功执行任务,您可以终止节点B或丢弃此节点所做的所有更改。

答案 1 :(得分:0)

如果设置较高的会话超时,则不会删除B创建的临时节点,B将不执行任务。

具体而言,

  • 如果您知道线程执行任务所需的最长时间,请将该最大时间设置为会话超时
  • 否则根据平均执行时间,p-90或其他一些启发式方法决定超时