使用 Leader Latch 进行 Leader 选举

Leader Election with Leader Latch

我正在尝试使用 Leader Latch - Curator 框架实现 ZK Leader Election。出于本次讨论的目的,假设我的 PCF 微服务分布在 10 个数据中心、跨时区,并且调度程序以固定的时间间隔启动一些​​任务。在任何时候,只有一个实例需要成为 运行 计划作业的领导者。

我尝试使用临时节点实现自定义调度程序,但 zookeeper 节点每次都会抛出一个新问题。我没有重新发明轮子,而是决定使用策展人框架来解决这个问题。下面的代码从 https://github.com/yiming187/curator-example/blob/master/src/main/java/com/ctrip/zk/curator/example/LeaderLatchExample.java

中逐字复制并进行了一些修改
CuratorFramework client = null;
LeaderLatch example = null;
try {
  client = CuratorFrameworkFactory.newClient(zkConnString, new ExponentialBackoffRetry(1000, 3));
  example = new LeaderLatch(client, PATH, "Client #"+ i);
  client.start();
  example.start();
  if (example.hasLeadership()) {
    //Since I'm the leader finish processing
  }
  else {
     LOGGER.info("Not elected leader, democracy is overrated !!!");
  }

}
catch(Exception e) {
  e.printStackTrace();
}
finally {
  System.out.println("Shutting down...");
  CloseableUtils.closeQuietly(example);
  CloseableUtils.closeQuietly(client);
}

这样做,我想验证一下:
1)10个实例中会选出一个leader吗?
2)我的leader处理是幂等的,当当前leader死亡时,另一个leader接管并不重要。尽管我通过安排代码的方式猜测,当当前领导者在处理过程中被打断时,其他潜在领导者可能已经离开并死亡。我的理解正确吗?
3)其他问题似乎表明领导人选举可能不会立即发生在这种情况下,理论上领导人可能永远不会运行?我在想这个吗? 任何输入将不胜感激

该示例代码并不理想,但出于测试目的可能没问题。特别是,您想要调用 await(timeout, units)。但是请注意,这是一个阻塞调用。如果您不想管理自己的 threads/locking,您可以改用 LeaderSelector(参见此处:https://github.com/apache/curator/tree/master/curator-examples/src/main/java/leader)。关于您的问题:

  1. 是的,将在您的客户中选出一位领导者
  2. 每一个争夺领导地位​​的客户最终都会得到它。但是一次只会有 1 个领导者。如果领导者崩溃,当其客户端会话到期时,将选举另一个领导者。
  3. 示例代码的结构方式,领导力几乎肯定永远不会实现。使用 await(..., ...)LeaderSelector 将解决这个问题。

重要的是要了解所有争夺领导地位​​的客户最终都会获得领导地位。因此,您需要一些其他类型的信号来表明任务已经 运行。也许在完成后写一个 ZNode,这样其他客户端就不会重复这个任务。

如果你有兴趣,我写了一个完整的Curator和ZooKeeper任务调度框架,你可以使用。看这里:http://nirmata.github.io/workflow/