【问题标题】:ZooKeeper - clients co-ordination after one or more client lose connection with ZooKeeperZooKeeper - 一个或多个客户端与 ZooKeeper 失去连接后的客户端协调
【发布时间】:2015-10-13 08:01:51
【问题描述】:

我有两个进程在各自的 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机制,还有什么解决办法吗?

【问题讨论】:

  • 我认为您的解决方案应该取决于您是希望 A 完成已启动的任务还是确保 B 能够在下次启动时运行。
  • @OlegKomarov 你说得对,我忘了说。现在将其添加到问题陈述中。

标签: java apache-zookeeper distributed-system orchestration


【解决方案1】:

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

【讨论】:

  • 问题是如果B跑了,那么它会对系统做一个不可逆的改变。但是,该方法在其他一些情况下可能很有用。为一个好主意点赞。
【解决方案2】:

如果你设置更高的会话超时时间,B创建的临时节点不会被删除,B不会执行任务。

具体来说,

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

【讨论】:

  • 不利的一面是,如果任务执行量很小,那么 B 也不会在接下来的几个(或直到会话超时)计划中运行它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-04
  • 2016-09-27
  • 2017-05-16
  • 2018-01-29
  • 1970-01-01
相关资源
最近更新 更多