Zookeeper集群的数目通常选择奇数个的主要原因是:
防止一个节点过载:由于Zookeeper是一个分布式协调服务,需要处理大量的并发请求,如果集群中的节点数量为偶数,那么其中一个节点可能会因为负载过重而出现问题,导致整个集群的服务质量下降。而奇数集群则可以更好地平衡负载,提高整体性能。更好的容错性:在分布式系统中,数据同步和节点故障是常见的挑战。如果Zookeeper集群中的某个节点出现故障,一个奇数个集群中的其他节点可以接管其职责,保证系统的可用性。而如果是偶数个集群,当一个集群发生故障时,可能会因为没有足够的节点来接管而造成服务中断。防止单点故障:奇数个集群可以确保即使在某些节点故障的情况下,仍然有足够的节点能够正常工作,从而避免单点故障的问题。
因此,选择奇数个Zookeeper集群是为了提高系统的可用性、可靠性和性能。当然,在设置奇数个集群时,也需要考虑到资源平衡和负载分布的问题,以确保整个集群能够高效地运行。
首先需要明确zookeeper选举的规则:leader选举,要求 。
比如:标记一个写是否成功是要在超过一半节点发送写请求成功时才认为有效。同样,Zookeeper选择领导者节点也是在超过一半节点同意时才有效。最后,Zookeeper是否正常是要根据是否超过一半的节点正常才算正常。这是基于CAP的一致性原理。
zookeeper有这样一个特性:集群中只要有过半的机器是正常工作的,那么整个集群对外就是可用的。
也就是说如果有2个zookeeper,那么只要有1个死了zookeeper就不能用了,因为1没有过半,所以
2个zookeeper的死亡容忍度为0;
同理,要是有3个zookeeper,一个死了,还剩下2个正常的,过半了,所以3个zookeeper的容忍度为1;
同理:
2->0;两个zookeeper,最多0个zookeeper可以不可用。 3->1;三个zookeeper,最多1个zookeeper可以不可用。 4->1;四个zookeeper,最多1个zookeeper可以不可用。 5->2;五个zookeeper,最多2个zookeeper可以不可用。 6->2;两个zookeeper,最多0个zookeeper可以不可用。
…
会发现一个规律,2n和2n-1的容忍度是一样的,都是n-1,所以为了更加高效,何必增加那一个不必要的zookeeper呢。
zookeeper的选举策略也是需要半数以上的节点同意才能当选leader,如果是偶数节点可能导致票数相同的情况。