主体内容转载自https://cloud.tencent.com/developer/article/1495499,并修改了部分个人觉得有问题的部分

首先简单介绍一下 etcd 的选举方法:

请注意:这里说的超过半数节点接受投票,是包括 candidate 自身在内的!而且这里的半数是以原集群大小作为总数来计算的!举个例子:假设某个 etcd 集群有 N 个节点,挂了一个节点之后,如果重新发起选举,一定要有超过 N/2 个节点接受投票(包括 candidate 在内),即最少需要 (N+1)/2 个节点接受投票,参加选举的节点才能成为 leader。

2. 集群大小与容错


假设有两个 etcd 集群,分别是 2 个节点和 1 个节点,2 节点集群需要所有节点接受投票才能选举成功(N=2),只要有一个节点发生故障,etcd 集群就会变成不可用状态,因为这时不可能选举成功,2 节点集群的容错能力为 0%

我们把“超过半数节点接受投票的节点数量”称为 majority。

同样的方式,比较 3 节点集群和 4 节点集群。对于 3 节点集群来说,如果其中一个节点发生故障,majority 仍然是 2,集群依然可用。而对于 4 节点集群而言,majority 是 3,只允许一个节点发生故障,如果有两个节点发生故障,majority 就会变成 2,而 2 不满足 > N/2 的要求(N=4)。现在你应该理解为什么奇数个节点与和其配对的偶数个节点相比(比如 3 节点和 4 节点对比),容错能力相同了。

这里能选择偶数个节点吗? 最好不要这样。原因有二:

当网络分割后,etcd 集群如何处理的呢?

当网络分割恢复后,少数派的节点会接受集群 Leader 的日志,直到和其他节点状态一致。