Zookeeper之脑裂

906 阅读2分钟

脑裂(Split-Brain) 就是比如当你的 cluster 里面有两个节点,它们都知道在这个 cluster 里需要选举出一个 master。那么当它们两个之间的通信完全没有问题的时候,就会达成共识,选出其中一个作为 master。但是如果它们之间的通信出了问题,那么两个结点都会觉得现在没有 master,所以每个都把自己选举成 master,于是 cluster 里面就会有两个 master。

对zookeeper来说,一个集群环境中只有大于一半的机器数没挂,这个集群就是可用的。就是我们对可用性的定义就是不能有一半的节点不可用。
zookeeper容错指的是:当宕掉几个zookeeper节点服务器之后,剩下的个数必须大于宕掉的个数,
也就是剩下的节点服务数必须大于n/2,这样zookeeper集群才可以继续使用,无论奇偶数都可以选举leader。
基于这个特性,针对5台机器的话,若保证可用性,至少是3台(5/2),容错了2台。
			针对6台机器的话,若保证可用性,至少是4台(6/2),容错了2台。
	在同样都是容错2台服务节点的情况下,5台(奇数)更能节省资源。

zk的脑裂问题--- 
	如果zk配置成偶数,只会浪费资源,不会导致zk脑裂,因为zk通过选举过半的机制避免了脑裂。
    比如配置了6台节点,假如有三个节点和另外三个节点失去了通信(假设是双机房,一个机房内三个节点,机房之间通信
    	中断了),那么如果zk没有 过半投票机制,即 >=3就可以选举出leader,那么两组三节点会分别选出一个leader,那么就是两个“大脑”了,
        就出现了脑裂,就会出现混乱。因为zk选举必须过半,所以这种情况就投票不出来,整体服务都不可用,不会出现脑裂。

Zookeeper3.4.6不存在脑裂的问题。为什么呢?
	Zookeeper3.4.6的选举算法是FastLeaderElection,该算法的规则是投票超过半数的服务器
    才能当选为Leader,一旦某个机器投票数超过一半,就会立即停止选举,然后改变自己的状态。这个算法能够保证leader的唯一性。

传送门:Zookeeper CP模型和选举