使用Etcd、Zookeeper和Hazelcast进行领导者选举

13

我们正在选择最佳的选项来为我们的服务(用Java编写)实现领导者选举,该服务由多个实例(例如3个)组成,以实现高可用性。我们的目标是在任何给定时间只有一个活动实例。

很高兴听到您对以下选项的意见:

1)Hazelcast。使用“仲裁”和锁定,我们可以实现领导者选举。但是,我们可能会遇到脑裂问题,在一段时间内可能存在两个领导者。此外,似乎Hazelcast不支持SSL。

2)Zookeeper。我们可以在Zookeeper集合(在我们的服务每个实例上运行ZK节点)的顶部实现领导者选举。 Zookeeper是否提供比Hazelcast更好的一致性保证? 它也会遭受分裂大脑问题吗?

3)Etcd。 我们可以使用Jetcd库,它似乎是最现代和强大的技术。从一致性方面看,它真的比Zookeeper更好吗?

谢谢。

1个回答

12

1) Hazelcast在3.12版本中提供了一个CPSubsystem,这是一个基于Raft一致性算法构建的CP系统,符合CAP标准,并且运行在Hazelcast集群内部。 CPSubsystem还有一个分布式锁实现,称为FencedLock,可用于实现领导者选举。

有关CPSubsystemFencedLock的更多信息,请参见:

Hazelcast 3.12之前的版本不适合进行领导者选举。正如您已经提到的,它可以在网络分裂期间选择可用性,这可能会导致选出多个领导者。

2) Zookeeper不会出现提到的split-brain问题,当网络分裂发生时你不会观察到多个leader。Zookeeper是建立在ZAB原子广播协议之上。

3) Etcd正在使用Raft共识协议。Raft和ZAB具有类似的一致性保证,这两者都可用于实现领导者选举过程。

免责声明:我在Hazelcast工作。


谢谢您的回答。我有一个后续问题。Zookeeper是否提供一些时间保证,以便我能够检测到失败节点所需的时间?在文档中提到,获取系统的最新视图可能需要长达几十秒的时间。是否有任何配置可以调整此时间? - Michael
为了上述评论创建了一个单独的问题:https://stackoverflow.com/questions/53620789/zookeeper-timeliness-property-consistency-guarantees - Michael
1
这个问题在Zookeeper中不会发生,因为在脑裂期间只有一侧会拥有初始节点的大多数。另一侧将是少数派,并且不允许写入。这是达成共识(或原子广播)的主要要点。例如,假设您最初有5个节点。 5的大多数是3。每次写入必须由至少3个节点接受。当它们分裂成两个时,一侧将有3个节点,另一侧将有2个节点。因此,只有第一侧将被允许写入。 - mdogan
假设有一个 ZooKeeper 节点,它与“领导者”客户端相连,并断开了与其余 ZooKeeper 节点的连接。此节点将在一段时间 t1 后检测到网络分区。假设其他 ZooKeeper 节点在时间 t2 检测到网络分区。由于 t1 和 t2 取决于网络延迟和 ZK 心跳阈值配置,因此 t1 可能大于 t2。因此,在“领导者”客户端降级之前,连接到另一个 ZK 节点的某些客户端将成为领导者。这里我漏掉了什么吗? - Michael
@mdogan - 你对此有什么建议吗?https://stackoverflow.com/questions/59212967/hazelcast-master-node-election-in-eks-aws-is-possible/59295536#59295536 - smilyface
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接