• Zookeeper选举Leader源码剖析(二)


    maven版本尽量3.5版本以上,jdk1.8

     1.选举流程

    如果其他服务器sid小于自己的sid,直接关闭socket连接,这么做的原因是为了减少连接

     如果相同,打印警告信息,如果远端sid大于自己的sid,建立发送线程,接收线程

     

     sendWorker.start,直接看run方法逻辑:
    从阻塞队列中拿到消息

    1.2 recver.run方法

    读取远端服务器socker消息

     

    整体选票逻辑,业务层丢入sendqueue-workerSender-queueSendMap发送队列选票消息,然后将选票信息发送到远端服务器和自己的recvWorker接收->recvQueue队列中,生成选票。 

     

    wokersender构建选票

     

     mysid等于sid加入到传输层队列,如果不相等丢到queuesendMap中

     

     fastleaderElection选举算法:初始化状态looking

     真实的选票逻辑:newEpoch等于curEpoch,先比较zxid并且比较newID,curId,

    updateProposal:更新选票,下次投票投竞争出来的选票

    sendNotifications:将选出的选票发送给其他机器

     

     

     termPredicadate:将选出来的选票放入voteSet并且进行半数比较

     

     

     半数比较逻辑:比较投票机器数量是否大于半数half

    half:投票数/2

     

     

     

      返回为true以后,如果自己PK赢了,将自己设置为leading,否则,将当前状态设置为following

     

     当一次选举以后状态更改,看leading和following,当第三个机器收到选票会比较当前状态是否是looking,

     

     当第三台机器进来以后会走follwoing和leading,首先比较当前周期,进行上面的选票比较逻辑。最后设置当前选举状态

     

     

  • 相关阅读:
    浅谈大数据之Flink-2
    SUBMIT指定用户名错误
    如何实现数据分析和条件格式过滤器?DevExpress组件可以实现
    (三)带权重和ignore_index的交叉熵损失函数
    字符串截取
    uniapp-轮播图点击预览功能
    宝刀未老!阿里P8老兵耗时三年总结出这份Java项目实战文档
    【算法】BF、KMP算法及OJ题
    windows + anaconda 安装PySpark3.0.1
    uniapp 安装 u-view 组件库
  • 原文地址:https://blog.csdn.net/qq_21575929/article/details/126217768