Zookeeper Leader 选举

138 阅读2分钟

触发选举的情况

  • 集群启动时

  • 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

选举时的网络连接

  1. 主要代码实现位于org.apache.zookeeper.server.quorum.QuorumCnxManager

  2. 当前节点会与集群内其他节点发起网络连接

  3. startConnection时先将当前sid发送,然后判断目标sid如果大于当前sid关闭连接

  4. 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

refer

www.jianshu.com/p/bfa3d4074…

zhuanlan.zhihu.com/p/141522620

www.cnblogs.com/ZhuChangwu/…