zookeeper2==zookeeper源码阅读,集群如何选举出LEADER

news2024/11/18 17:51:20

上一篇已经搭建好了环境,这篇研究下集群是怎么进行选举的。

源码分析:

首先将三台机器的data目录下除了myid之外的都清掉,从零开始启动。

先启动ZK1

然后顺着main阅读源码

org.apache.zookeeper.server.quorum.QuorumPeer#start

org.apache.zookeeper.server.quorum.QuorumPeer#run

开始不停读取收到的选票,并且找出LEADER是谁

org.apache.zookeeper.server.quorum.FastLeaderElection#lookForLeader 

该方法就是根据收到选票的情况,执行不同的方法,本处因为是从零启动,所以第一条消息肯定是都在LOOKING:

如果收到的选票中,他说他也正在LOOKING,那么就比较我们两个的票,根据轮次等决定该信谁的,两人商量好后,我再将这个结果广播出去。

 

选举过程测试和结果:

清空ZK1和ZK2的data目录下的日志,然后先启动ZK1然后启动ZK2,可以从双方的日志中看到双方进行了一些投票交流,最终确定了ZK2是LEADER。我这在日志里加了个可以打印纳秒的时间戳,就可以清晰看到这样的启动顺序投票过程是怎样的,按先后顺序排列如下:

391479069200 ZK1 Adding vote: from=1, proposed leader=1, proposed zxid=0x0, proposed election epoch=0x1
--1号投自己是LEADER并发送给了自己
397054901700 ZK2 Adding vote: from=2, proposed leader=2, proposed zxid=0x0, proposed election epoch=0x1
--2号投自己是LEADER并发送给了自己
397059044000 ZK2 Adding vote: from=1, proposed leader=1, proposed zxid=0x0, proposed election epoch=0x1
--1号投自己是LEADER并发送给了2号
397059869100 ZK1 Adding vote: from=2, proposed leader=2, proposed zxid=0x0, proposed election epoch=0x1
--2号投自己是LEADER并发送给了1号,1号收到消息后发现两个人都在LOOKING,轮次和ZXID都一样,那就信服务器ID大的,所以1号也转投给2号
397060112400 ZK2 Adding vote: from=1, proposed leader=2, proposed zxid=0x0, proposed election epoch=0x1
--1号转投2号是LEADER并发给了2号,2号在这里调用voteSet.hasAllQuorums()会发现已经有节点收到了超过一半也就是3/2的票,所以就会认为选举完成找到了LEADER。
397060227800 ZK1 Adding vote: from=1, proposed leader=2, proposed zxid=0x0, proposed election epoch=0x1
--1号转投2号是LEADER并发给了自己,在这里调用voteSet.hasAllQuorums()会发现已经有节点收到了超过一半也就是3/2的票,所以就会认为选举完成找到了LEADER。

可以发现,上述选举过程中并没有用到ZAB协议。

选举成功后:

找到LEADER后,ZK1修改自己的状态为FOLLOWER(setPeerState(proposedLeader, voteSet);)

ZK1跳出里层循环回到org.apache.zookeeper.server.quorum.QuorumPeer#run

ZK1下一个循环发现自己是FOLLOWER了,

ZK2下一个循环发现自己是LEADER了,

分别执行如下逻辑。下篇文章再来分析了。


 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1302800.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

智能优化算法应用:基于蝗虫算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用:基于蝗虫算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于蝗虫算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.蝗虫算法4.实验参数设定5.算法结果6.参考文献7.MA…

这七款网工在线画拓扑工具,绝了!

你们好,我的网工朋友。 画拓扑图,绝对是网络工程师的基操。 上次给你来了篇手把手教你绘制拓扑图的好文,还没看过的先去看啊:《网络拓扑图怎么画最好?》。 关于画拓扑的工具,那就多了,直接用…

深入理解强化学习——马尔可夫决策过程:预测与控制

分类目录&#xff1a;《深入理解强化学习》总目录 预测&#xff08;Prediction&#xff09;和控制&#xff08;Control&#xff09;是马尔可夫决策过程里面的核心问题。预测&#xff08;评估一个给定的策略&#xff09;的输入是马尔可夫决策过程 < S , A , R , P , γ > …

如何搭建废品上门回收小程序

如今&#xff0c;随着环境保护意识的增强&#xff0c;废品的回收和再利用变得越来越重要。为了方便人们进行废品回收&#xff0c;搭建一个废品上门回收的小程序成为了一个不错的选择。本文将介绍如何从零开始搭建一个废品上门回收小程序。 …

笔记本电脑安装了Ubuntu系统设置关盖/合盖不挂起/不睡眠

文章目录 简介通过gnome-tweaks设置通过更改登录配置文件logind.conf设置参考资料 简介 学习工作中需要用到笔记本安装Ubuntu Linux系统&#xff0c;并且需要关盖电脑不关机、不挂起且不睡眠。为此&#xff0c;本篇博客整理了两种常规操作方式&#xff0c;并给了详细的步骤&am…

2023.12.11 homework Rectangle, Square

Rectangle, Square 长方形&#xff0c;正方形问题

孩子还是有一颗网安梦——Bandit通关教程:Level 0 → Level 1

&#x1f575;️‍♂️ 专栏《解密游戏-Bandit》 &#x1f310; 游戏官网&#xff1a; Bandit游戏 &#x1f3ae; 游戏简介&#xff1a; Bandit游戏专为网络安全初学者设计&#xff0c;通过一系列级别挑战玩家&#xff0c;从Level0开始&#xff0c;逐步学习基础命令行和安全概念…

mmyolo的bbox_loss和检测bbox都是空

最近用mmyolo训练自己的数据集的时候发现训练的时候loss_bbox0&#xff0c;测试和eval的时候结果也全是空的&#xff0c;排除了数据集读取的问题&#xff0c;最后发现是config中自定义了自己的类别但是没有传给dataset。。。 简而言之&#xff0c;在自定义了数据集里的metainf…

RocketMQ-源码架构

源码环境搭建 1、主要功能模块 RocketMQ官方Git仓库地址&#xff1a;GitHub - apache/rocketmq: Apache RocketMQ is a cloud native messaging and streaming platform, making it simple to build event-driven applications. RocketMQ的官方网站下载&#xff1a;下载 | R…

对比三种认证方式:传统token认证,jwt认证,oauth认证

1. Token基本原理 1、客户端使用用户名跟密码请求登录&#xff1b; 2、服务端收到请求&#xff0c;去验证用户名与密码&#xff1b; 3、验证成功&#xff0c;服务端会签发一个Token&#xff08;也就是随机生成一个字符串&#xff09;保存到(Session,redis,mysql…)中&#x…

计算机毕业设计 SpringBoot的企业内管信息化系统 Javaweb项目 Java实战项目 前后端分离 文档报告 代码讲解 安装调试

&#x1f34a;作者&#xff1a;计算机编程-吉哥 &#x1f34a;简介&#xff1a;专业从事JavaWeb程序开发&#xff0c;微信小程序开发&#xff0c;定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事&#xff0c;生活就是快乐的。 &#x1f34a;心愿&#xff1a;点…

SSD在AI发展中的关键作用:从高速缓存到数据湖-1

随着人工智能技术的飞速发展&#xff0c;存储在其中发挥着至关重要的作用。特别是在AI训练过程中&#xff0c;存储SSD&#xff08;固态硬盘&#xff09;的高性能和可靠性对于提升训练效率和保证数据安全具有不可替代的作用。 存储SSD在AI发展中的作用和趋势&#xff0c;存储将…

<url-pattern>/</url-pattern>与<url-pattern>/*</url-pattern>的区别

<url-pattern>/</url-pattern> servlet的url-pattern设置为/时&#xff0c; 它仅替换servlet容器的默认内置servlet&#xff0c;用于处理所有与其他注册的servlet不匹配的请求。直白点说就是&#xff0c;所有静态资源&#xff08;js&#xff0c;css&#xff0c;ima…

人工智能数据集可视化统计分析工具:快速了解你的数据集

人工智能数据集可视化统计分析工具&#xff1a;快速了解你的数据集 简介特征示例报告安装用法 简介 Lightly Insights&#xff1a;可以轻松获取关于机器学习数据集基本洞察的工具&#xff0c;可以可视化图像数据集的基本统计信息&#xff0c;仅需提供一个包含图像和对象检测标…

自编码器 AutoEncoder

自编码器&#xff08;AutoEncoder&#xff09;&#xff0c;也称自编码模型&#xff0c;是一种基于无监督学习的数据维度压缩和特征表示方法&#xff0c;目的是对一组数据学习出一种表示。1986年 Rumelhart 提出自编码模型用于高维复杂数据的降维。由于自动编码器通常应用于无监…

建筑学VR虚拟仿真情景实训教学

首先&#xff0c;建筑学VR虚拟仿真情景实训教学为建筑学专业的学生提供了一个身临其境的学习环境。通过使用VR仿真技术&#xff0c;学生可以在虚拟环境中观察和理解建筑结构、材料、设计以及施工等方面的知识。这种教学方法不仅能帮助学生更直观地理解复杂的建筑理论&#xff0…

SpringData JPA 搭建 xml的 配置方式

1.导入版本管理依赖 到父项目里 <dependencyManagement><dependencies><dependency><groupId>org.springframework.data</groupId><artifactId>spring-data-bom</artifactId><version>2021.1.10</version><scope>…

软文开头怎么写才能拿捏用户?媒介盒子为您解答

软文标题是吸引用户点击的关键因素&#xff0c;那软文开头就是决定用户能否读下去的主要因素&#xff0c;很多运营er在写文案时经常会面临的情况之一就是好不容易想到一个标题&#xff0c;点击率不错&#xff0c;但是开头不行用户一看开头&#xff0c;跑了&#xff01;如果不知…

Git篇---第三篇

系列文章目录 文章目录 系列文章目录前言一、git pull 和 git fetch 有什么区别?二、git中的“staging area”或“index”是什么?三、什么是 git stash?前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章…

c#读取XML文件实现晶圆wafermapping显示demo计算电机坐标控制电机移动

c#读取XML文件实现晶圆wafermapping显示 功能&#xff1a; 1.读取XML文件&#xff0c;显示mapping图 2.在mapping视图图标移动&#xff0c;实时查看bincode,x,y索引与计算的电机坐标 3.通过设置wafer放在平台的位置x,y轴电机编码值&#xff0c;相机在wafer的中心位置&#…