1.奇数节点:集群应该具有奇数个节点,例如3、5、7等。这是为了确保在集群中发生故障的情况下仍然能够保持多数节点的一致性。
2.多数派原则:集群的大部分节点需要处于可用状态,以形成多数派。在一个三节点的集群中,允许一个节点故障;在一个五节点的集群中,允许两个节点故障,依此类推。这样可以保证集群的一致性和可用性。
- 偶数节点的问题:如果是偶数节点,如2,则需要某个节点得到2票才行,大多数时候又是自己先投自己一票,然后票数相等,然后又重新选举。很费时间
因此,为了确保高可用性和容错性,推荐至少使用三台节点来搭建集群。这样即使其中一台节点发生故障,集群仍然能够正常工作。如果只有两台节点,一旦其中一台节点发生故障,集群将无法达到多数派的要求,导致集群不可用。
对比表
集群需要一半以上的节点可用,否则集群不可用
选举leader最小选票数=(服务器数量/2)+1
结果有小数点,则去掉小数点
服务器数量 | 允许故障数量 | 选举leader最小选票数 |
---|---|---|
1 | 0 | 1 |
2 | 0 | 2 |
3 | 1 | 2 |
4 | 1 | 3 |
5 | 2 | 3 |
6 | 2 | 4 |
7 | 3 | 4 |
8 | 3 | 5 |
9 | 4 | 5 |
相关链接
二、从高可用角度说最少3个节点
我们先借用2个redis sentinel中的概念:
Quorum数:
如果Quorum数量的哨兵都觉得一个redis节点宕机了(注意这个节点是集群的数据节点而不是哨兵),那么就是客观宕机,需要准备做下线处理。
Majority数:
如果Majority及以上数量的哨兵将选票投給了某个哨兵,那该哨兵才能成为这次故障转移的操作者,去进行主从切换。当然,有特殊情况可参见文献[1]。
1) 故障转移:
比如现在有2个哨兵节点:如果设置Majority=1,那谁都随便就当了老大了,因为投票的流程是先给自己一票,所以必然会出现网络分区,使得两个主节点同时存在(脑裂)。
如果设置Majority=2, 因为现在唯一存活的哨兵把票投给了自己,但需要再等一张选票才能确认自己成为操作者,但第二张票是等不到的(和单点故障没区别)[2]。一个哨兵挂掉后这个故障转移服务也就不可用了。
所以最后还是部署了3个哨兵,Majority=2。
2) 故障后系统压力:
如果你有两个节点:一个节点挂掉后,剩下的一个节点会承担2倍的压力,可能坚持不了多久就挂了,如果你强行使用两个节点,你必须保证每台服务的配置都有独当一面的能力。
如果有三个节点:宕机一个还剩下两个节点,每个节点承担的压力只是多了1/2,肯定还能坚持一阵子。
发表评论