不止包括Zookeeper集群,其它大多数集群都推荐节点数最好为奇数个,因此本文将详细说明其中的缘由。首先我们需要明白一个概念“脑裂”:

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

在zookeeper的选举过程中,有个规则是要求可用节点数量>总节点数量/2。之所以会有这样的要求,就是为了防止集群出现脑裂的时候,可能会出现多个子集群同时服务的情况(即子集群各组选举出自己的leader)。如果遵守这个规则,那么只会有一个子集群能进行Leader选举,因为当前集群中只可能有一个子集群的节点数能超过总节点数的一半。

说明了可用节点数量>总节点数量/2这个规则后,我们再进一步探索为什么Zookeeper集群节点数推荐为奇数个。主要有以下两个原因:

1. 防止脑裂造成集群不可用

如果集群的数量为偶数个,那么在发生脑裂的时候,可能两个子集群的数量都无法超过总节点数量的一半,也就无法满足Zookeeper进行选举的规则,这时候整个服务对外是彻底不可用的。但是如果集群的数量为奇数个的话,发生脑裂时必然有一个子集群的节点数目大于总节点数目的一半,这时候可以保证当前服务对外依然是可用的。

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

比如说,如果当前集群有四个节点,要想完成Leader选举,只允许一个节点不可用,这样才能保证可用的节点数大于总节点数的一半。但如果当前集群有三个节点,要想完成Leader选举,同样也只允许一个节点不可用,因为只有当两个节点都存活的时候才能满足可用节点数大于总节点数的一半。可以看出,以上两个集群都只有一个节点的容错能力,但是第二个集群比第一个集群节约了更多的资源,因此,更推荐Zookeeper的节点数为奇数个。