一、先明确几个关键字的含义:
1、myid:给每台服务器定义的标识
2、zxid:节点在运行过程中产生的数据id,id越大表示数据越清晰
3、Epoch:选举的轮数,即逻辑时钟。随着选举的轮数++
4、Server状态:LOOKING--寻找Leader状态。当服务器处于该状态时,它会认为当前集群中没有Leader,因此需要进入Leader选举状态
FOLLOWING--跟随者状态。表明当前服务器角色是Follower
OBSERVING--领导者状态。表明当前服务器角色是Leader
LEADING--观察者状态。表明当前服务器角色是Observer
二、选举步骤
假设有A、B、C、D、E的zookeeper集群,处在刚启动时刻
1、服务器A启动,推荐自己作为LEADER,并将(myid 、 zixd 、 epoch)作为广播信息,广播到集群中所有的服务器(Server)。然后等待集群中的服务器返回信息 ,此时其他服务器还未启动,第一轮选举结束,A处于LOOKING状态。
2、服务器B启动,推荐自己作为LEADER,并将(myid 、 zixd 、 epoch)作为广播信息,此时服务器A接收到B的广播信息,看到B的myid大于自己,所以服务器A变更自己的投票信息,推举B为LEADER。ps:此时B的投票数还未达到半数以上,所以B也是处于LOOKING状态,第二轮选举结束。
3、服务器C启动,推荐自己作为LEADER,并将(myid 、 zixd 、 epoch)作为广播信息,此时服务器A、B接收到C的投票信息,发现C的myid比自己的投票信息大,所以变更投票信息 投C为leader,服务器C得到的投票数为3,大于服务器的半数,所以服务器C成为LEADER,状态变更为LEADING,服务器A、B状态变更为FOLLOWING,第三轮投票结束。
4、服务器D启动,推荐自己作为LEADER,虽然D的myid大于A、B、C,但是服务器C已经成为leader,所以D只能成为following
5、服务器E启动,原理同4。
为什么zookeeper集群是单数?
1、容错
由于在增删改操作中需要半数以上服务器通过,来分析以下情况。
2台服务器,至少2台正常运行才行(2的半数为1,半数以上最少为2),正常运行1台服务器都不允许挂掉
3台服务器,至少2台正常运行才行(3的半数为1.5,半数以上最少为2),正常运行可以允许1台服务器挂掉
4台服务器,至少3台正常运行才行(4的半数为2,半数以上最少为3),正常运行可以允许1台服务器挂掉
5台服务器,至少3台正常运行才行(5的半数为2.5,半数以上最少为3),正常运行可以允许2台服务器挂掉
6台服务器,至少3台正常运行才行(6的半数为3,半数以上最少为4),正常运行可以允许2台服务器挂掉
通过以上可以发现,3台服务器和4台服务器都最多允许1台服务器挂掉,5台服务器和6台服务器都最多允许2台服务器挂掉
但是明显4台服务器成本高于3台服务器成本,6台服务器成本高于5服务器成本。这是由于半数以上投票通过决定的。
2、防脑裂
一个zookeeper集群中,可以有多个follower、observer服务器,但是必需只能有一个leader服务器。
如果leader服务器挂掉了,剩下的服务器集群会通过半数以上投票选出一个新的leader服务器。
集群互不通讯情况:
一个集群3台服务器,全部运行正常,但是其中1台裂开了,和另外2台无法通讯。3台机器里面2台正常运行过半票可以选出一个leader。
一个集群4台服务器,全部运行正常,但是其中2台裂开了,和另外2台无法通讯。4台机器里面2台正常工作没有过半票以上达到3,无法选出leader正常运行。
一个集群5台服务器,全部运行正常,但是其中2台裂开了,和另外3台无法通讯。5台机器里面3台正常运行过半票可以选出一个leader。
一个集群6台服务器,全部运行正常,但是其中3台裂开了,和另外3台无法通讯。6台机器里面3台正常工作没有过半票以上达到4,无法选出leader正常运行。
通可以上分析可以看出,为什么zookeeper集群数量总是单出现,主要原因还是在于第2点,防脑裂,对于第1点,无非是正本控制,但是不影响集群正常运行。但是出现第2种裂的情况,zookeeper集群就无法正常运行了。