zookeeper的选举机制:
当leader崩溃或者leader失去太多的followler,这时zk进入恢复模式,恢复模式需要重新选举出一个新的leader,让所有的server都回复到一个正确的状态,zk有两种选举算法:一种基于basic paxos实现的,另外一种是基于fase paxos算法实现的,默认的选举算法为fast paxos
fast paxos:
1、服务器启动时的leader选举
若进行leader选举,则至少需要两台机器,这里选取三台服务器组成的集群为例。在集群初始化阶段,当有一台服务器server1启动时,其单独无法进行和完成leader选举。当第二台服务器server2启动时,此时两台机器可以互相通信,每台机器都试图找到leader,于是进入leader选举过程,过程如下:
<1> 每个server发出一个投票,由于是初始情况,server1和server2都会将自己作为leader服务器来进行投票,每次投票会包含所推举的的服务器的myid和ZXID,使用(myid,ZXID)表示,此时server1的投票为(1,0),server2的投票为(2,0),然后各自将这个投票发给集群中的其他机器。
<2>接受来自各个服务器的投票。集群中的每个服务器收到投票后,首先判断该投票的有效性,如检查是否本地投票、是否来自looking状态的服务器。
<3>处理投票。针对每一个投票,服务器都需要将别人的投票和自己的投票进行PK,PK规则如下:
···优先检查ZXID。ZXID比较大的服务器有限作为leader。
···如果ZXID相同,那么比较myid,myid比较大的服务器作为leader服务器。
对于server1来说,它的投票是(1,0),接收server2的投票为(2,0),首先会比较两者的ZXID,均为0,再比较myid,此时sercer2的myid最大,于是更新自己的投票为(2,0),然后重新投票,对于server2而言,其无需更新自己的投票,只是再次想集群中所有的机器发出上一次投票信息即可。
<4>统计投票。每次投票后,服务器都会统计投票信息,判断是否已经哟过半机器接收到相同的投票信息,对于server1、server2而言,都统计处集群中已经有两台机器接收了(2,0)的 投票信息,此时便认为已经选出了leader
<5>改变服务器状态,一旦确定了leader,每个服务器就会更新自己的状态,如果是follower,那么久变更为following,如果是leader,就变更为leading
当zoo.cfg文件中配置了两台服务器时,启动两台服务器的zk就可以选举出leader,第二个启动的server为leader
当zoo.cfg文件中配置了三台服务器时,启动两台服务器的zk就可以选举出leader,第二个启动的server为leader
当zoo.cfg文件中配置了四台服务器时,必须启动三台服务器的zk才可以选举出leader,第二个启动的server为leader
以下为本人对zk的选举机制做的一些小实验:
步骤:先启动hadoop04--->hadoop03--->hadoop02--->hadoop01
leader:hadoop03
follower:hadoop04,hadoop02,hadoop01
kill hadoop04
hadoop01,hadoop02,hadoop03状态不变
kill hadoop01
hadoop02异常(集群崩溃)
hadoop03异常(集群崩溃)
重新启动hadoopo04
leader:hadoop03
follower:hadoop04,hadoop02
启动hadoop01
状态不变
kill hadoop03
leader:hadoop01
follower:hadoop02,hadoop04
启动hadoop03
kill hadoop01
leader:hadoop03
启动hadoop01
kill hadoop03
leader hadoop01
其余为follower
从上述实验可以得出结论,当zookeeper配置超过三台机器时,
第一次启动集群时,leader为第二个启动的机器,其他为follower,符合上述理论
当第二台机器挂掉后,最后一台机器成为leader。
此时若第二台机器恢复,则会成为follower,若此时leader挂掉,则第二台机器成为leader。
当最后一台机器挂掉后,倒数第二台机器成为leader。