zookeeper集群的节点有四种状态:
LEADING:说明此节点已经是leader节点,在zookeeper中,只有leader才有写权限。
LOOKING:选举中,正在寻找leader,即将进入leader选举流程中。
FOLLOWING:跟随者,表示当前集群中的leader已经选举出来了,主要具备以下几个功能点 向leader发送请求(PING消息、REQUEST消息、ACK消息、RevalIDATE消息),接收leader消息并进行处理;接收client发送过来的请求,如果为写请求,会发送给Leader进行投票处理,然后返回client结果。
OBSERVING:OBSERVING和FOLLOWING差不多,但不参加投票和选举,接受leader选举后的结果。
SID:server ID,集群中节点的唯一标识,来源于myid文件中定义的数值。
ZXID:zookeeper TRX ID zookeeper的事务ID,高32位为epoch编号,低32位为客户端全局请求次数。
epoch:集群选举编号,每进行一次选举,epoch递增1。
假设集群节点部署情况如下:
Server1启动:发起一次选举,投自己一票,此时Server1票数不够半数2.5以上,无法完成选举,Server1状态保持LOOKING状态。
Server2启动:发起一次选举,Server2投自己一票,并和Server1交换投票信息,Server1发现Server2的myid大于自己,投Server2一票,此时Server2得2票,Server1得0票,由于没有大于半数2.5以上的选票,无法完成选举,Server1和Server2都保持LOOKING状态。
Server3启动:发起一次选举,Server3给自己投一票,同时和Server1、Server2交换投票信息,由于Server3的myid最大,所以Server1和Server2将票都投给Server3,此时Server3获得3票,Server1、Server2都是0票,由于3票大于半数2.5票,Server3当选leader,Server1和Server2成为follower。
Server4启动:发起一次选举,Server4给自己投一票,和Server1、Server2、Server3交换投票信息,发现Server3已经是leader,直接结束选举,修改自身状态为follower。
Server5启动:发起一次选举,Server5给自己投一票,和Server1、Server2、Server3、Server4交换投票信息,发现Server3已经是leader,直接结束选举,修改自身状态为follower。
zookeeper在运行时,leader和follower各司其职,如果运行时有机器加入,不会出发选举,如果运行时follower故障,也不会触发选举,只有当leader故障时,才会触发选举。运行时选举要同时比较epoch,ZXID,SID,且权重值依次递减,也就是说epoch大的直接胜出,epoch相同的,ZXID大的胜出,ZXID相同的,SID大的胜出。



