Zookeeper集群节点数量为何要是奇数个?

不管是公司的生产环境,仍是本身搭建的测试环境,Zookeeper集群的节点个数都是奇数个。至于为何要是奇数个,之前只是模糊的知道是为了知足选举须要,并不知道详细的缘由。最近重点学习zookeeper,了解到其中的原理,现将其整理记录下来。学习

首先须要明确zookeeper选举的规则:leader选举,要求 可用节点数量 > 总节点数量/2  。注意 是 > , 不是 ≥。测试


注:为何规则要求 可用节点数量 > 集群总结点数量/2 ?  若是不这样限制,在集群出现脑裂的时候,可能会出现多个子集群同时服务的状况(即子集群各组选举出本身的leader), 这样对整个zookeeper集群来讲是紊乱的。
换句话说,若是遵照上述规则进行选举,即便出现脑裂,集群最多也只能回出现一个子集群能够提供服务的状况(能知足节点数量> 总结点数量/2 的子集群最多只会有一个)。因此要限制 可用节点数量 > 集群总结点数量/2 。资源


采用奇数个的节点主要是出于两方面的考虑:ast

一、防止由脑裂形成的集群不可用。集群

首先,什么是脑裂?集群的脑裂一般是发生在节点之间通讯不可达的状况下,集群会分裂成不一样的小集群,小集群各自选出本身的master节点,致使原有的集群出现多个master节点的状况,这就是脑裂。原理

下面举例说一下为何采用奇数台节点,就能够防止因为脑裂形成的服务不可用:zookeeper

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

     (a) A : 1个节点 ,B :4个节点 , 或 A、B互换通信

     (b) A : 2个节点, B :3个节点  , 或 A、B互换

    能够看出,上面这两种状况下,A、B中总会有一个小集群知足 可用节点数量 > 总节点数量/2 。因此zookeeper集群仍然可以选举出leader , 仍然能对外提供服务,只不过是有一部分节点失效了而已。

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

    (a) A:1个节点 ,  B:3个节点,   或 A、B互换 

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

    能够看出,状况(a) 是知足选举条件的,与(1)中的例子相同。 可是状况(b) 就不一样了,由于A和B都是2个节点,都不知足 可用节点数量 > 总节点数量/2 的选举条件, 因此此时zookeeper就完全不能提供服务了。

综合上面两个例子能够看出: 在节点数量是奇数个的状况下, zookeeper集群总能对外提供服务(即便损失了一部分节点);若是节点数量是偶数个,会存在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集群,也容许有一个节点宕机。

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

相关文章
相关标签/搜索