0

背景

部署系统使用最少 2 个实例来部署作业。但只需要 1 个。因此计划使用 Apache Curator 进行领导人选举。所以只有 1 个实例将启动作业,其他实例将被阻止

问题

  1. 默认行为是当原始领导者重新启动时,追随者成为领导者。
  2. 现在,之前被阻塞的追随者被解除阻塞并再次重新启动/重新部署作业
  3. 这不是预期的,只有 1 个实例应该控制该作业。
  4. 有什么方法可以在 ZK 本身中存储状态数据并在开始作业之前检索,这样如果之前的状态为空白,则当前主机是真正的领导者,如果它之前具有跟随者状态,则可以跳过执行。
public void deploy() throws Exception {
    if (isLeaderElectionEnabled) {
      // Blocking if not a leader
      while (!leaderElector.isLeader()) { // This will be true when original leader stops and the follower becomes leader. In that case too we don't want to deploy job
// Can some data stored in ZK be checked here
        continue;
      }
    }
    // Started leader election check if this is leader
    LOG.info("DEPLOYING JOB");
    // Job launch code
}

有什么其他的建议来实现这个吗?

编辑 1

能够加入Apache Curator库并进行领导者选举。但这个问题与leader选举并不完全相同。

它应该通过避免多次重新启动来处理重新启动和重新部署方案。

编辑 2

详细说明场景和可能的解决方案

前提

  • 主机 A 和主机 B
  • A : 领导者,启动了工作并拥有领导者闩锁(策展人库)
  • B : 跟随者阻塞

重启/重新部署

  • Case 1 --> A 先重启

    • A 松开前导闩锁
    • B 是领导者并且被解除阻塞<--重新启动/当前。版本
    • A 出现并充当跟随者
    • B现在重新开始失去领导权
    • A 作为领导者被畅通无阻 <--重新启动/新版本 = B 出现并充当跟随者
  • 案例 2 --> B 先重启

    • B 出现并充当追随者 = A 重新开始现在失去领导权
    • B 是领导者并且被解除阻塞<--重启/新版本
    • A 出现并充当跟随者

笔记

这个问题虽然提到了 Java,但这是我想要实现的。该方法是预期的,解决方案不必专门在 Java 中。

4

0 回答 0