使用 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 个领导者。如果领导者崩溃,当其客户端会话到期时,将选举另一个领导者。
- 示例代码的结构方式,领导力几乎肯定永远不会实现。使用
await(..., ...)
或 LeaderSelector
将解决这个问题。
重要的是要了解所有争夺领导地位的客户最终都会获得领导地位。因此,您需要一些其他类型的信号来表明任务已经 运行。也许在完成后写一个 ZNode,这样其他客户端就不会重复这个任务。
如果你有兴趣,我写了一个完整的Curator和ZooKeeper任务调度框架,你可以使用。看这里:http://nirmata.github.io/workflow/
我正在尝试使用 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 个领导者。如果领导者崩溃,当其客户端会话到期时,将选举另一个领导者。
- 示例代码的结构方式,领导力几乎肯定永远不会实现。使用
await(..., ...)
或LeaderSelector
将解决这个问题。
重要的是要了解所有争夺领导地位的客户最终都会获得领导地位。因此,您需要一些其他类型的信号来表明任务已经 运行。也许在完成后写一个 ZNode,这样其他客户端就不会重复这个任务。
如果你有兴趣,我写了一个完整的Curator和ZooKeeper任务调度框架,你可以使用。看这里:http://nirmata.github.io/workflow/