【博客374】zookeeper集群节点数为什么是奇数

内容:记录对zookeeper节点数为奇数的思考

分布式系统中节点数为奇数的场景:

zookeeper集群的节点数设置为了奇数,而同样的做法也出现在了kafka集群和etcd集群。
同样的其它的分布式组件很多都有类似的做法。

为什么节点数设置为奇数:

一、防止脑裂:

zookeeper选举的规则:在集群中选举leader时,要求当前集群的可用节点数量 > 总节点数量/2  


为什么要求:可用节点数量 > 集群总结点数量/2 

防止出现网络分区故障时导致脑裂:
如果不这样限制,在集群出现脑裂的时候,可能会出现多个子集群同时服务的情况
(即子集群各组选举出自己的leader),此时一个集群分裂后出现了不止一个leader。
整体的对外服务将会非常混乱。


如果遵守上述规则,当出现网络分区的时候,集群最多也只能回出现一个子集群可以提供服务
的情况,也即:能满足节点数量> 总结点数量/2 的子集群最多只会有一个

什么是脑裂?
集群的脑裂通常是发生在节点之间通信不可达的情况下,集群会分裂成不同的小集群,小集群各自
选出自己的master节点,导致原有的集群出现多个master节点的情况,这就是脑裂。

为什么采用奇数台节点,就可以防止由于脑裂造成的服务不可用:

(1) 假如zookeeper集群有 5 个节点,发生了脑裂,脑裂成了A、B两个小集群: 

     (a) A : 1个节点 ,B :4个节点 

     (b) A : 2个节点, B :3个节点  

 A、B中总会有一个小集群满足 可用节点数量 > 总节点数量/2 。所以zookeeper集群仍然能够
 选举出leader,仍然能对外提供服务,只不过是有一部分节点失效了而已。

(2) 假如zookeeper集群有4个节点,同样发生脑裂,脑裂成了A、B两个小集群:

    (a) A:1个节点 ,  B:3个节点 

    (b) A:2个节点 , B:2个节点

    可以看出,情况(a) 是满足选举条件的,与(1)中的例子相同。 但是情况(b) 就不同了
    因为A和B都是2个节点,都不满足可用节点数量 > 总节点数量/2 的选举条件, 
    所以此时zookeeper就彻底不能提供服务了。

所有在节点数量是奇数个的情况下,zookeeper集群总能对外提供服务(即使损失了一部分节点)
如果节点数量是偶数个,会存在zookeeper集群不能用的可能性(脑裂成两个均等的子集群的时候)

二、提供更强的容错能力:

在容错能力相同的情况下,奇数台更节省资源。

leader选举要求:  可用节点数量 > 总节点数量/2 


(1) 假如zookeeper集群1 ,有3个节点,3/2=1.5 ,  即zookeeper想要正常对外提供服务
(即leader选举成功),至少需要2个节点是正常的。换句话说,3个节点的zookeeper集群,
允许有一个节点宕机。

(2) 假如zookeeper集群2,有4个节点,4/2=2 , 即zookeeper想要正常对外提供服务
(即leader选举成功),至少需要3个节点是正常的。换句话说,4个节点的zookeeper集群,
也允许有一个节点宕机。

因此,zookeeper并不希望你设置出四个节点的集群,而是要么3,要么就5了,要保持奇数。
因为5就能允许有2个节点宕机,所有5相比3容错性更高了,而4相比3容错性没有提高,意义不大。

从公式上就是:2n 和 2n-1 的最大容错是一样的,都是 n-1,
所以在容错能力不变的情况下,从节省资源的角度看,2n-1(奇数)比 2n(偶数)更划算些。

那么问题就来了, 集群1与集群2都有允许1个节点宕机 的容错能力,但是集群2比集群1多了
1个节点。在相同容错能力的情况下,本着节约资源的原则,zookeeper集群的节点数维持奇
数个更好一些。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值