Zookeeper脑裂以及解决办法

脑裂

一般脑裂都是出现在集群环境中的。指的是一个集群环境中出现了多个master节点(类似zookeeper的master、elasticsearch的master节点),导致严重数据问题,数据不一致等等。

出现的原因:可能就是网络环境有问题如断开,假死等等,导致一部分slave节点会重新进入崩坏恢复模式,重新选举新的master节点,然后对外提供事务服务。

Zookeeper脑裂以及解决办法
例如机房A和机房B通信,一个6个节点,选举机房A的一个节点为master节点。

当机房A和机房B出现通信网络故障,如下图会导致机房B重新选举master。在网络恢复后就会出现两个master。
Zookeeper脑裂以及解决办法

解决办法
  1. 采用冗余心跳通信
  2. 采用过半原则

冗余心跳说白了就是节点之间采用多路心跳来保证单心跳链路的不稳定性。这里着重介绍一下过半原则:在领导者选举的过程中,如果某台zkServer获得了超过半数的选票,则此zkServer就可以成为Leader了。
这里贴一下底层源码:return (set.size() > n/2),其中n为集群中有效节点的个数,set.size 表示某台zkServer获得的票数

拿上面的图来说,n = 6,那么set.size要为4(4>3)就是在机房A和机房B中有4个节点才能选举新的master节点。如图二,机房A和B断了,机房B只有3个节点,是无法选举新的master节点的,所以就保证了即使机房A和B之间的网络断了,机房B也不会选举新的master节点。这就是过半机制

以上描述如有问题请大佬指正^^。