【Zookeeper】集群模式启动源码解析

状态ServerState:

  • LOOKING:(启动的时候默认状态)集群里没有选举出Leader的时候,所有节点都是这个状态
  • FOLLOWING:Follower的状态
  • LEADING:被选举成Leader的状态
  • OBSERVING:obeserve的状态

三个端口:
三种端口分别用来进行三种通信:接收客户端的命令(Netty/NIO)、进行选举、节点之间互相传数据
在这里插入图片描述

选举Leader流程

选举Leader流程

启动的时候每台机器的状态都是LOOKING状态,这时就是选举Leader。

  • 当机器是LOOKING状态,会先创建一个选票(myid,zxid,选举周期…)发送给其他机器
  • 自己也会收到其他发来的选票。 将自己和收来的选票进行pk,规则是先比较选举周期、再比较zxid,最后比较myid,谁大就把自己的选票更新成获胜的选票,且会把更新后的选票发给其他所有的。
  • 将所有收来的选票都放到set里,根据过半机制选出Leader,会把选出的Leader的状态改为leading,其他改为following。
  • 已经选出Leader后对于新加入的机器而言的状态为LOOKING状态,它会接收到之前的获胜选票,这时pk由于新加入的机器选举周期(1)会比获胜选票的周期小,所以它就会把自己的状态更新为following。
  • 由于机器之间会建立通信用来同步数据,Leader会向所有的机器(Followers和Observers)发送数据,这些机器会一直处于接收状态,当一段时间接收不到Leader发来的数据,就会将自己的状态改为LOOKING,这时又会开始选举新的Leader。

pk逻辑,即从recvqueue中拿出来选票后做的事

Notification n=recvqueue.poll(notTimeout,TimeUnit.MILLISECONDS)

  • n==null 第一次启动的时候是没有选票的这时去跟需要发送选票的机器建立Socket连接
  • n不为空,即拿到别人发来的选票。判断发来选票的机器的状态n.state
    • 发来选票的机器状态为LOOKING
      • 接收到的选票周期大于自己的周期

      • 接收到的选票周期等于自己的周期

      • 接收到的选票周期小于自己的周期

    • 发来选票的机器状态为LEADING或FOLLOWING
      这种情况就是已经选出Leader
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值