本文为作者自己理解的程度,希望看完后会对Zookeeper的选举制有一丢丢的了解。
害~首先你要知道两个东西,serverId(服务器ID,myid)和zxid(最新的事物ID,服务器中存放的最大数据ID, LastLoggedZxid)
myid越大越有可能成为Leader喔
zxid越大说明数据越新越有可能成为Leader喔
然后呢,能Leader选举需同时满足两个条件
1)集群中剩下active(活着的)的机器要大于集群中服务器总数的一半
2)服务器得到的票数要大于半数。
重点来了,然后在比较票的时候,优先看zxid大小,zxid大,则此服务器为Leader。若zxid一样,就看myid比大小,myid大,则此服务器为Leader。
以下两种情况会触发选举
1.服务器初始化时触发Leader选举。
2.服务器运行时期触发Leader选举(当前的Leader挂啦)
废话不多说,直接上例子:
第一种情况:
1)在初始化时,当一个Server1启动时,其无法单独进行和完成Leader选举,当第二台服务器Server2启动后,就可以开始选举了。所以这可以说明至少有两台机器才可以做选举。
2)由于是初始化阶段,两台服务器都会给自己投票。所以Server1的投票为(1, 0),Server2的投票为(2, 0)。然后各自再把投票发给集群中其他的机器,这里没有其他别的机器,就是Server1和Server2
3)现在看Server1,它自己的投票是(1,0),接收到Server2的投票(2,0)。所以先比一下zxid,一看都是0,所以我们需要看myid大小,1<2,所以Server1需要变更自己的投票为(2,0)
4)再来看Server2,它自己的投票是(2,0),接收到Server1的投票(1,0)。所以先比一下zxid,一看都是0,下面再来看myid大小,2>1,所以Server2不需要变更自己的投票,依然是(2,0)
5)综上,Server2得到两张票,(票数过半,活着的机器为2,两者都过半了),所以Server2为Leader。
6)所以Server2的状态为Leader,Server1的状态为follower。
第二种情况:
如果当前集群中的Leader挂了,那么集群中剩下的活着的机器状态变成Looking,开始进入Leader选举。
假设集群中有5台机器Server1,Server2,Server3,Server4,Server5,当前的Leader为Server2(然鹅它挂了)。serverId分別为1、2、3、4和5, zxid分别为9、9、9、8和8。
1)第一次投票,每台机器都是将自己作为被推举的对象来进行投票。所以Server1的票(1,9),Server3的票(3,9),Server4的票(4,8),Server5的票(5,8)。
2)同时各台服务器也会接收到来自集群中其他机器的投票。
对于Server1来说,自己的投票为(1,9),它接收到的票分别为(3,9),(4,8),(5,8),对比后发现,Server1的zxid比Server4和Server5都大,但是相对于Server3,Server1的serverId比Server3小。所以Server1的票要更新成(3,9)。
对于Server3来说,自己的投票为(3,9),它接收到的票分别为(1,9),(4,8),(5,8),对比后发现,Server1的zxid比Server4和Server5都大,但是由于自己的serverId要大于Server1,所以Server3的票不变更为(3,9)。
对于Server4来说,自己的投票为(4,8),它接收到的票分别为(1,9),(3,9),(5,8),对比后发现,Server5的zxid和自己都小,然后Server3的serverId比Server1大,所以Server4的票要更新成(3,9)。
对于Server5来说,自己的投票为(5,8),它接收到的票分别为(1,9),(3,9),(4,8),对比后发现,Server4的zxid和自己都小,然后Server3的serverId比Server1大,所以Server4的票要更新成(3,9)。
3)综上,Server3得到4张票,票过半,活着的机器也过半,所以此时Server3为Leader,其余机器是小弟follower。
好啦,浅显的谈了谈Zookeeper的选举制,大概懂了点了吧~