iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >zookeeper选举的源码过程是什么样的
  • 714
分享到

zookeeper选举的源码过程是什么样的

2023-06-15 14:06:57 714人浏览 薄情痞子
摘要

ZooKeeper选举的源码过程是什么样的,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。集群概述zookeper 在生产环境中通常都是通过集群方式来部署的,以保

ZooKeeper选举的源码过程是什么样的,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

集群概述

zookeper 在生产环境中通常都是通过集群方式来部署的,以保证高可用, 下面是 zookeeper 官网给出的一个集群部署结构图:

zookeeper选举的源码过程是什么样的

从上图可以得出, zookeeper  server 的每个节点都和主节点保持通讯的,每个节点上面都存储有数据和日志的备份,只有当大多数节点可用集群才是可用的。本文主要是基于 zookeeper  3.8.0 讲解, 主要是通过源码的维度来分析 zookeeper 选举过程 对于 zookeeper 的源码编译大家可以参考:编译运行Zookeeper源码

集群节点状态

集群节点状态定义在 QuorumPeer#ServerState 枚举,主要是包含 LOOKING、FOLLOWING、LEADING、OBSERVING  四个状态, 下面是定义的代码和说明

public enum ServerState {     // 寻找leader状态。当服务器处于该状态时,它会认为当- 前集群中没有leader,因此需要进入leader选举状态。     LOOKING,     // 跟随者状态。表明当前服务器角色是 follower。     FOLLOWING,       // 领导者状态。表明当前服务器角色是 leader。     LEADING,     // 观察者状态。表明当前服务器角色是 observer。     OBSERVING }

Leader 选举过程

启动和初始化

QuorumPeerMain 是 zookeeper 的启动类, 通过 main 方法启动

// 不展示非核心代码 public static void main(String[] args) {     QuorumPeerMain main = new QuorumPeerMain();     main.initializeAndRun(args); } protected void initializeAndRun(String[] args) throws ConfigException, IOException, AdminServerException {     // 集群模式启动     if (args.length == 1 && config.isDistributed()) {         runFromConfig(config);     } else {     } } public void runFromConfig(QuorumPeerConfig config) throws IOException, AdminServerException {     // quorumPeer 启动  quorumPeer.start(); }

QuorumPeer 是一个线程实例类,当调用 start 方法过后会致性 QuorumPeer#run() 方法,  进行集群状态的判断最终进入是否执行选举或者同步集群节点数据信息等一系列的操作,下面是核心代码:

@Override public void run() {     try {         while (running) {             switch (getPeerState()) {                 case LOOKING:                     // 投票给自己                     setCurrentVote(makeLEStrategy().lookForLeader());                     break;                 case OBSERVING:                     setObserver(makeObserver(logFactory));                     observer.observeLeader();                     break;                 case FOLLOWING:                     setFollower(makeFollower(logFactory));                     follower.followLeader();                     break;                 case LEADING:                     setLeader(makeLeader(logFactory));                     leader.lead();                     setLeader(null);                     break;             }         }     } finally {     } }

进行选举

FastLeaderElection 是选举的核心类 ,在这个类里面有对投票和选票的处理过程

public Vote lookForLeader() throws InterruptedException {     // 创建一个当前选举周期的投票箱     Map<Long, Vote> recvset = new HashMap<Long, Vote>();     // 创建一个投票箱。这个投票箱和recvset 不一样。     // 存储当前集群中如果已经存在Leader了的投票     Map<Long, Vote> outofelection = new HashMap<Long, Vote>();     int notTimeout = minNotificationInterval;     synchronized (this) {         // 递增本地选举周期         logicalclock.incrementAndGet();         // 为自己投票         updateProposal(getInitId(), getInitLastLoggedZxid(), getPeerEpoch());     }     // 广播投票     sendNotifications();     SyncedLearnerTracker voteSet = null;     // 如果当前服务器的状态为Looking,和stop参数为false,那么进行选举     while ((self.getPeerState() == ServerState.LOOKING) && (!stop)) {         if (n.electionEpoch > logicalclock.get()) {             logicalclock.set(n.electionEpoch);             recvset.clear();             // totalOrderPredicate 投票 PK             if (totalOrderPredicate(n.leader, n.zxid, n.peerEpoch, getInitId(), getInitLastLoggedZxid(), getPeerEpoch())) {                 updateProposal(n.leader, n.zxid, n.peerEpoch);             } else {                 updateProposal(getInitId(), getInitLastLoggedZxid(), getPeerEpoch());             }             sendNotifications();         } else if (totalOrderPredicate(n.leader, n.zxid, n.peerEpoch, proposedLeader, proposedZxid, proposedEpoch)) {             updateProposal(n.leader, n.zxid, n.peerEpoch);             sendNotifications();         }         // 监听通信层接收的投票         Notification n = recvqueue.poll(notTimeout, TimeUnit.MILLISECONDS);         // 放入投票箱         recvset.put(n.sid, new Vote(n.leader, n.zxid, n.electionEpoch, n.peerEpoch));         // 过半逻辑         voteSet = getVoteTracker(recvset, new Vote(proposedLeader, proposedZxid, logicalclock.get(), proposedEpoch));     } }

totalOrderPredicate 主要是选票 PK 的逻辑,我们再来看看代码:

protected boolean totalOrderPredicate(long newId, long newZxid, long newEpoch, long curId, long curZxid, long curEpoch) {     if (self.getQuorumVerifier().getWeight(newId) == 0) {         return false;     }     return ((newEpoch > curEpoch)             || ((newEpoch == curEpoch)                 && ((newZxid > curZxid)                     || ((newZxid == curZxid)                         && (newId > curId))))); }

选举过程是这个样子的 ,其实官方也给出了注释:

  1. 鸿蒙官方战略合作共建——HarmonyOS技术社区

  2. 先比较选举的届数,届数高的说明是最新一届,胜出

  3. 再比较zxid,也就是看谁的数据最新,最新的胜出

  4. 最后比较serverid,这是配置文件指定的,节点id大者胜出 选举完成后通过 sendNotifications(); 通知其他的节点。

过程总结

前面我粗略的讲解 zookeeper 从启动过程在到选举,选举结果同步的,以及如何进行投票的选举结果确认过程,但是 zookeeper  作为一个高性能、高可靠的分布式协调中间件,在很多设计的细节也是非常的优秀的。

投票过程

通常情况下,在投票的过程中 zxid 越大越有可能成为 leader 主要是由于 zxid  越大该节点的数据越多,这样的话就可以减少数据的同步过程中节点事务的撤销和日志文件同步的比较过程,以提升性能。下面是 5 个 zookeeper 节点选举的过程。

zookeeper选举的源码过程是什么样的

注: (sid, zxid), 当前场景为  server1 ,server2 出现故障 , server3 的 zxid = 9 , server4 和 server5 的 zxid 为 8.  进行两轮选举,最终选出 sever3 为 leader 节点

多层网络架构

在前面的分析过程中我省略了 Zookeeper 节点之间通讯的 NIO 操作, 这部分简单来讲 zookeeper 将他们划分为传输层和业务层。通过  SendWorker、RecvWorker 处理网络层数据包, WorkerSender 和 WorkerReceiver 处理业务层的数据。

zookeeper选举的源码过程是什么样的

这里会涉及到多线程操作,zookeeper  在源码中也给出了大量的日志信息,对于初学者有一定的难度,对此大家可以参考下面的 Zookeeper 选举源码流程 这部分的流程图来辅助分析。

Leader 选举源码流程

结合上面的梳理,我对 zookeeper 启动和选举的流程做了一个比较详细的梳理。

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注编程网精选频道,感谢您对编程网的支持。

--结束END--

本文标题: zookeeper选举的源码过程是什么样的

本文链接: https://www.lsjlt.com/news/280471.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • zookeeper选举的源码过程是什么样的
    zookeeper选举的源码过程是什么样的,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。集群概述zookeper 在生产环境中通常都是通过集群方式来部署的,以保...
    99+
    2023-06-15
  • ZooKeeper的选举算法是什么
    ZooKeeper使用的选举算法是基于Paxos协议的Zab(ZooKeeper Atomic Broadcast)协议。在Zab协...
    99+
    2024-04-09
    ZooKeeper
  • ZooKeeper的选举机制是什么
    ZooKeeper的选举机制是基于ZAB(ZooKeeper Atomic Broadcast)协议的。在ZooKeeper集群中,...
    99+
    2024-04-02
  • zookeeper的Leader选举机制源码解析
    目录zookeeper01Leader选举机制02Leader选举集群配置03Leader选举流程3.1 Leader选举采用多层队列架构04解析代码入口类05选举流程代码解析06选...
    99+
    2023-05-14
    zookeeper Leader选举 zookeeper 选举机制
  • zookeeper的Leader选举机制是什么
    本篇内容主要讲解“zookeeper的Leader选举机制是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“zookeeper的Leader选举机制是什么”吧!zookeeper一个分布式服务...
    99+
    2023-07-05
  • MongoDB的选举过程是怎样的
    本篇文章给大家分享的是有关MongoDB的选举过程是怎样的,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。MongoDB的复制集具有自动容忍部分...
    99+
    2024-04-02
  • Zookeeper集群管理与选举方法是什么
    这篇文章主要讲解了“Zookeeper集群管理与选举方法是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Zookeeper集群管理与选举方法是什么”吧!  1.集群机器监控  这通常用于...
    99+
    2023-06-02
  • ZooKeeper中的Leader是如何选举出来的
    ZooKeeper中的Leader是通过选举算法来确定的。当一个ZooKeeper服务器(节点)启动时,它会尝试与其他ZooKeep...
    99+
    2024-03-07
    ZooKeeper
  • android源代码的编译过程是什么
    Android源代码的编译过程主要包括以下几个步骤:1. 下载源代码:从Android官方网站下载源代码,并解压到本地目录。2. 配...
    99+
    2023-09-21
    android
  • 剖析Python源代码编制过程是怎么样的
    剖析Python源代码编制过程是怎么样的,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。Python语言中提供的re模块能支持正则表达式,还提供SGML,XML分析模块,大多数的...
    99+
    2023-06-17
  • shell脚本源码安装nginx的过程是什么
    本篇内容主要讲解“shell脚本源码安装nginx的过程是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“shell脚本源码安装nginx的过程是什么”吧!SHELL概念SHELL是什么?SH...
    99+
    2023-06-25
  • Node.js源码中cjs模块的加载过程是什么
    这篇文章主要介绍了Node.js源码中cjs模块的加载过程是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Node.js源码中cjs模块的加载过程是什么文章都会有所收获,下...
    99+
    2024-04-02
  • elasticsearch的master选举机制是什么
    Elasticsearch的主节点选举机制是通过Zen Discovery和Unicast Discovery两个插件来实现的。 Z...
    99+
    2023-10-23
    elasticsearch master
  • springboot应用访问zookeeper的流程是怎样的
    这期内容当中小编将会给大家带来有关springboot应用访问zookeeper的流程是怎样的,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。下面讲解了如果通过springboot快速开发web服务,并读取...
    99+
    2023-06-26
  • java编码转换过程是怎样的
    本文小编为大家详细介绍“java编码转换过程是怎样的”,内容详细,步骤清晰,细节处理妥当,希望这篇“java编码转换过程是怎样的”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。java中的编码转换(以utf8和gb...
    99+
    2023-07-06
  • MongoDB中复制选举的原理是什么
    这期内容当中小编将会给大家带来有关MongoDB中复制选举的原理是什么,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。MongoDB复制集的选举原理MongoDB复制的原理...
    99+
    2024-04-02
  • ZooKeeper的特点是什么
    分布式协调服务:ZooKeeper是一个分布式的协调服务,用于管理和维护分布式系统中的元数据信息,如配置信息、状态信息等。 ...
    99+
    2024-03-06
    ZooKeeper
  • Ubuntu通过源码安装Odoo14的方法是什么
    这篇文章主要讲解了“Ubuntu通过源码安装Odoo14的方法是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Ubuntu通过源码安装Odoo14的方法是什么”吧!postgresql数...
    99+
    2023-07-04
  • mysql的源码安装过程
    本篇内容主要讲解“mysql的源码安装过程”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“mysql的源码安装过程”吧! mysql   ...
    99+
    2024-04-02
  • SpringBoot多数据源配置的过程是什么
    本篇内容主要讲解“SpringBoot多数据源配置的过程是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“SpringBoot多数据源配置的过程是什么”吧!前言多数据源的核心就是向 IOC 容...
    99+
    2023-06-25
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作