出于显而易见的原因,构建需要分布式共识的集群的最佳实践是使用 3、5 或其他具有决胜局的节点数。
但是,有时,有人拥有两台物理设备并希望将它们集群化。在这些情况下,获得比没有集群更好的可用性的一种方法是给其中一个系统两票。使用 Zookeeper 实现此目的的一种方法是配置分层仲裁,并给其中一个节点两票:
# 2-node zookeeper configuration that allows node-2 to fail without losing quorum
# ...node-1 cannot go down without losing quorum, *unless* these weights are first
# ...reconfigured; such configuration is allowed at runtime, with no service disruption!
group.1=1
group.2=2
weight.1=2
weight.2=1
在原始情况下,每个节点都有一票,如果任何一个节点发生故障,则无法实现法定人数。在这种情况下,只有一票的节点可以发生故障,而不会导致另一个节点随之故障。因此,我们成功地避免了第二个节点导致我们不太坚固比根本没有集群时要好得多——对于计划维护,当两个节点都存在于集群中时,我们可以使用一组新的权重来更新配置,以允许组 1 但不允许组 2 离线而不会失去法定人数。
...那么,问题是:如何使用 etcd 而不是 zookeeper 来实现这一点?我是否需要在节点 1 上实际运行两个 etcd 副本(并且,如果我们想将这个额外的投票转移到节点 2 以允许将节点 1 从集群中删除,则在那里启动第二个副本并停用节点 1 上的第二个副本)?如果是这样,是否可以在不产生将数据同步到此实例的开销的情况下做到这一点(因为它的唯一目的是充当观察投票者)?