进行前提
进行Leader选举的前提是ZooKeeper必须是集群,即至少2台以上ZooKeeper服务器。满足集群的条件后,Leader的选举在以下情况下发生:
- ZooKeeper服务器进程启动
- ZooKeeper服务器进程在运行期间无法连接到Leader服务器
注意:“Leader的选举”这个过程是对于单个ZooKeeper服务器进程而言的,并不是整个ZooKeeper服务器集群。当一个ZooKeeper服务器进入Leader选举流程时,可能集群的状态有:
- 这个集群存在一个Leader服务器并且工作正常
- Leader尚未被选举出来
- 当前服务器由于网络故障与Leader服务器断开连接 ,或者Leader服务器宕机
对于第一种情况,通常是当前服务器启动比较晚,在ZooKeeper启动时都会尝试进行Leader选举,在向其它服务器发送投票时,其它服务器会将正确的Leader服务器信息告知当前服务器,忽略其投票信息。
只有后两种情况,集群才会进行完整的Leader选举流程。第二种情况对应初始化时期的选举,第三种情况对应运行期间的选举。这两种选举大同小异,后一种无非就是当Follower检测到Leader挂了后,就会将FOLLOWING
状态改为LOOKING
,并按照同样的流程发送投票、接收投票、统计投票。
注意Observer身份的ZooKeeper服务器是没有资格参与Leader竞选的。
选举流程
ZooKeeper服务器有4种状态,在源代码中作为枚举定义在org.apache.zookeeper.server.quorum.QuorumPeer.ServerState
中:
LOOKING
:正在寻找Leader服务器FOLLOWING
:当前服务器角色为FollowerLEADING
:当前服务器角色为Leader服务器OBSERVING
:当前服务器角色为Observer
在服务器集群刚启动时,此时是没有Leader服务器的,所有的服务器都处于LOOKING
状态,并准备进行投票操作。
1、发送投票
每个服务器都会将自身作为Leader服务器来投票,并序列化后发送给各个ZooKeeper服务器,也就是说如果有 nn