背景
部署系统使用最少 2 个实例来部署作业。但只需要 1 个。因此计划使用 Apache Curator 进行领导人选举。所以只有 1 个实例将启动作业,其他实例将被阻止
问题
- 默认行为是当原始领导者重新启动时,追随者成为领导者。
- 现在,之前被阻塞的追随者被解除阻塞并再次重新启动/重新部署作业
- 这不是预期的,只有 1 个实例应该控制该作业。
- 有什么方法可以在 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 中。