加入收藏 | 设为首页 | 会员中心 | 我要投稿 源码网 (https://www.900php.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长资讯 > 外闻 > 正文

zk集群运行过程中,服务器选举的源码剖析

发布时间:2018-12-18 07:52:50 所属栏目:外闻 来源:猿人课堂
导读:副标题#e# 在zk服务器集群启动过程中,经QuorumPeerMain中,不光会创建ZooKeeperServer对象,同时会生成QuorumPeer对象,代表了ZooKeeper集群中的一台机器。在整个机器运行期间,负责维护该机器的运行状态,同时会根据情况发起Leader选举。下图是 《从PAXOS

上面说过QuorumPeer检测到当前服务器的状态是LOOKING的时候,就会进行新一轮的选举,通过setCurrentVote(makeLEStrategy().lookForLeader());也就是FastLeaderElection的lookForLeader来进行初始选择,实现的方式也很简单,主要的逻辑在FastLeaderElection.lookForLeader中实现:

zk集群运行过程中,服务器选举的源码剖析

基本流程先说明一下:

  • QuorumPeer会轮询检查当前服务器状态,如果发现State是LOOKING,调用Election的lookForLeader来开始新一轮的选举
  • FastLeaderElection会首先将logicallock++,表示新的一轮选举开始了
  • 构造初始的选票,Vote的内容就是选自己,然后通知zk集群中的其他机器
  • FastLeaderElection会一直轮询查状态,只要是LOOKING态,就会从recvqueue中获取其他服务器同步的选票信息,为了方便说明,记录为n
  • 根据n的票选信息状态,做相关的操作

LOOKING: 都处于无Leader态,比较一下选票的优劣,看是否更新自己的选票,如果更新了就同时通知给其他服务器

FOLLOWING、LEADING:说明集群中已经有Leader存在,更新一下自己的状态,结束本轮投票

OBSERVING:这票没什么卵用,直接舍弃(OBSERVER是不参与投票的)

根据上面的流程,可以大概说明一下FasterLeaderElection确定选票更优的策略:

  • 如果外部投票中被推举的Leader服务器选举轮次大于自身的轮次,那么就更新选票
  • 如果选举轮次一致,就对比两者的ZXID,ZAB协议中ZXID越大的留存的信息也越多,因此如果ZXID大于自己的,那么就更新选票
  • 如果ZXID也一致,对比两者的SID,SID大,则优先级高

总结:

以上就是zk的默认选票流程,按照ZAB协议的两种状态分析:

  • 初始化的时候,处于同一轮次进行投票直到投票选择出一个Leader
  • 崩溃恢复阶段:

Leader服务器挂了,那么经历的和初始化流程类似的过程,选择Leader

Follower服务器挂了,那么自己在执行选举的过程中,会收到其他服务器给的Leader选票信息,也可以确定Leader所属

【编辑推荐】

  1. 深入剖析 Web 服务器与 PHP 应用的通信机制 - 掌握 CGI 和 FastCGI 协议的运行原理
  2. 企业级 Linux 服务器 10 大安全防护要点
  3. 从四种场景出发,详细解读无服务器架构的落地应用
  4. HBase的服务器体系架构
  5. 搭建文件分享服务器,其实也可以很简单-HFS
【责任编辑:武晓燕 TEL:(010)68476606】

点赞 0

(编辑:源码网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读