触发选举的情况
-
集群启动时
-
Leader因故障挂掉
-
Leader提交表决后大于超时时间ack数量未过半,Leader发起lookForLeader
-
集群正常运行,新增节点,该节点发起lookForLeader
-
Learner与Leader之间连接断开,Learner发起lookForLeader
选举主要参数
-
epoch:可以认为是Leader编号,每一次重新选举出一个新Leader时,都会为该Leader分配一个epoch,该值是递增的,Leader没有进行选举期间,epoch是一致不会变化的
-
zxid:事务请求唯一标记,由leader服务器负责分配对事务请求进行定序,是8字节的long类型,由两部分组成:前4字节代表epoch,后4字节代表counter,即zxid=epoch+counter。ZooKeeper状态的每一次改变, counter就会递增加1
-
sid:集群环境中zookeeper都会编辑自己的sid在dataDir目下的myid文件中
-
timeout:recvqueue接收消息的超时时间,默认200ms,大于超时时间未收到消息时会进行*2操作,默认不大于60000ms
-
serverState:LOOKING, FOLLOWING, LEADING, OBSERVING
选举时的网络连接
-
主要代码实现位于org.apache.zookeeper.server.quorum.QuorumCnxManager
-
当前节点会与集群内其他节点发起网络连接
-
startConnection时先将当前sid发送,然后判断目标sid如果大于当前sid关闭连接
-
handleConnection时如果发送者sid小于当前sid,那么关闭当前连接,并主动发起连接
在zk中,为了保证每一对server只有一个socket,Zookeeper只允许SID大的服务器主动和其他机器建立连接,否则断开连接。
发出连接时,要求自己sid大,完成SendWorker和ReceiveWorker的构造以及线程启动,否则close
接收连接时,要求自己sid小,完成SendWorker和ReceiveWorker的构造以及线程启动,否则close
例如集群sid 分别为1 ,2 ,3 最终的网络连接
1:
2: 2->1
3: 3->2;3->1