出于显而易见的原因,构build需要分布式共识的集群的最佳实践是使用3个,5个或另一个具有tiebreaker的节点数量。
然而,有时候有两个物理设备需要集群。 在没有集群的情况下,获得更好的可用性的方法之一是在这些情况下,两个给予这两个系统之一的两个选票。 用Zookeeper来做到这一点的一个方法是configuration一个分层法定人数,并给予其中一个节点两票:
# 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
在最初的情况下,每个节点有一票,如果任一节点失败,则不能达到法定人数。 在这种情况下,只有一票的节点能够失败,而不会使另一个失败。 因此,我们已经成功地避免了使第二个节点比我们根本不聚集的时候更不稳定 – 而对于有计划的维护,当两个节点都存在于集群中时,我们可以用一组新的权重来更新configuration,以允许第1组,但不是第2组脱机而不失去法定人数。
…所以,这个问题:如何使用etcd而不是zookeeper来实现? 我是否需要在节点1上真正运行etcd的两个副本(并且,如果我们想要将此额外投票转移到节点-2以允许将节点1从集群中移除,则需要在其中创build第二个副本,然后停用节点1上的第二个副本)? 如果是这样,这可以做到没有数据同步到这个实例的开销(因为它的唯一目的是充当观察选民)?