《Zookeeper》源码分析(十五)之 选举算法

FastLeaderElection

FastLeaderElection实现了接口Election,选举方法为lookForLeader(),选举算法的核心逻辑也在该方法中。

数据结构

在这里插入图片描述

构造函数

在这里插入图片描述

start()

启动选举通信网络
在这里插入图片描述

lookForLeader()

选举核心算法

FastLeaderElection.logicalclock属性用于标识当前leader的选举轮次,zookeeper中规定所有有效的投票必须都在同一轮次中,所以,每发起新一轮的投票都会进行自增操作,如代码中的第2步;初始阶段,每个服务器都会推举自己成为leader,如第3步;初始完成后向集群中的所有服务器发送自己的选票,如第4步;服务器不断接收来自其他服务器的投票,此时如果没有收到任何投票,那么会检查是否连接正常,如果不正常则先建立连接,再重新发送自己的投票,如第6步;在处理选票的时候会根据选票发送服务器的状态进行不同的处理,如第7/8/9步。
在这里插入图片描述

接下来具体分析每一步的过程

1. 向集群服务器发送投票sendNotifications()

在这里插入图片描述

2. 如果未收到任何选票则重新发送投票

在这里插入图片描述

3. 对方服务器在选举中LOOKING

前面我们介绍Vote类的时候提到过投票PK,从选举轮次epoch、ZXID和SID三个因素来考虑

  1. 首先比较选举轮次epoch,如果外部投票的选举轮次低于内部投票则丢弃外部投票,如第2步
  2. 如果外部投票的选举轮次高于内部投票,则更新内部选举轮次,然后再继续PK投票决定是否更新内部推举的leader信息,如第1步
  3. 一致的话直接PK投票,如第3步

投票PK结束后进行汇总,如第4步

统计投票,如第5/6步

投票统计结束后,如果此时已经产生leader,则更新当前服务器装填,如第10步。

源码过程如下:
在这里插入图片描述

4. 对方服务器是learner

在这里插入图片描述

5. 对方服务器是Leader

在这里插入图片描述

至此,选举的模块介绍到此结束,当Leader选举结束后各个服务器的角色也确定,接下来就是各种服务器角色的初始化工作,未完待续。

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

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

相关文章

从零开发短视频电商 自动化测试WebUI端到端测试-Playwright

文章目录 Playwright是什么Playwright入门示例添加Maven依赖示例代码启动验证 功能自动等待内置Web断言可视化UI模式减慢操作截图录屏脚本录制 高级识别验证码 Playwright是什么 https://playwright.dev/ https://playwright.dev/java/ Playwright为现代 Web 应用程序提供可…

linux 系统中vi 编辑器和库的制作和使用

目录 1 vim 1.1 vim简单介绍 1.2 vim的三种模式 1.3 vim基本操作 1.3.1命令模式下的操作 1.3.2 切换到文本输入模式 1.3.3 末行模式下的操作 2 gcc编译器 2.1 gcc的工作流程 2.2 gcc常用参数 3 静态库和共享(动态)库 3.1库的介绍 3.2静态…

实现Java异步调用的高效方法

文章目录 为什么需要异步调用?Java中的异步编程方式1. 使用多线程2. 使用Java异步框架 异步调用的关键细节结论 🎉欢迎来到Java学习路线专栏~实现Java异步调用的高效方法 ☆* o(≧▽≦)o *☆嗨~我是IT陈寒🍹✨博客主页:IT陈寒的博…

Python 3 使用HBase 总结

HBase 简介和安装 请参考文章:HBase 一文读懂 Python3 HBase API HBase 前期准备 1 安装happybase库操作hbase 安装该库 pip install happybase2 确保 Hadoop 和 Zookeeper 可用并开启 确保Hadoop 正常运行 确保Zookeeper 正常运行3 开启HBase thrift服务 使用命…

【EI复现】一种建筑集成光储系统规划运行综合优化方法(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

目标检测(Object Detection)

文章目录 1. 目标检测1.1 目标检测简要概述及名词解释1.2 IOU1.3 TP TN FP FN1.4 precision(精确度)和recall(召回率) 2. 边框回归Bounding-Box regression3. Faster R-CNN3.1 Faster-RCNN:conv layer3.2 Faster-RCNN&…

跨境电商平台(例如阿里巴巴、虾皮)的商品数据如何收集?

跨境电商是指通过互联网,以跨越国家或地区边界的方式进行电子商务交易的商业行为。传统的电子商务通常是在同一国家或地区内进行,而跨境电商则侧重于跨国贸易。跨境电商通过在线平台(如阿里巴巴、亚马逊等)或第三方服务商&#xf…

【数据结构】堆的实现,堆排序以及TOP-K问题

目录 1.堆的概念及结构 2.堆的实现 2.1初始化堆 2.2销毁堆 2.3取堆顶元素 2.4返回堆的大小 2.5判断是否为空 2.6打印堆 2.7插入元素 2.8堆的向上调整 2.9弹出元素 2.10堆的向下调整 3. 建堆时间复杂度 4. 堆的应用 4.1 堆排序 4.2 TOP-K问题 1.堆的概念及结构 …

FFmpeg5.0源码阅读——VideoToobox硬件解码

摘要:本文描述了FFmpeg中videotoobox解码器如何进行解码工作,如何将一个编码的码流解码为最终的裸流。   关键字:videotoobox,decoder,ffmpeg   VideoToolbox 是一个低级框架,提供对硬件编码器和解码器的直接访问。 它提供视频…

WebRTC音视频通话-RTC直播本地视频及相册视频文件

WebRTC音视频通话-RTC直播本地视频及相册视频文件 WebRTC音视频通话-RTC直播本地视频文件效果图如下 WebRTC音视频通话-RTC直播本地视频文件时候,用到了AVPlayer、CADisplayLink。 一、通过AVPlayer播放本地视频 AVPlayer是什么? AVPlayer是基于AV…

35_windows环境debug Nginx 源码-CLion配置CMake和启动

文章目录 生成 CMakeLists.txt 组态档35_windows环境debug Nginx 源码-CLion配置CMake和启动生成 CMakeLists.txt 组态档 修改auto目录configure文件,在 . auto/make 上边增加 . auto/cmake, 大概在 106 行。在 auto 目录下创建cmake 文件其内容如下: #!/usr/bin/env bash NG…

从外部访问K8s中Pod的五种方式

hostNetwork、 hostPort、 NodePort、 LoadBalancer、 Ingress 暴露Pod与Service一样,因为Pod就是Service的backend 1、hostNetwork:true 这是一种直接定义 Pod 网络的方式。 如果在 Pod 中使用 hostNetwork:true 配置, pod 中运行的应用程序…

C++头文件

C头文件 一般头文件特殊头文件windows.hbits/stdc.h 一般头文件 C头文件是一种包含预定义函数、类和变量声明的文件。它们通常用于在源代码文件中引入外部库或模块的功能。 头文件的作用是提供程序所需的声明信息,以便在源代码文件中使用这些声明。当你在源代码文…

前端面试题-CSS

1. 盒模型 ⻚⾯渲染时, dom 元素所采⽤的 布局模型。可通过 box-sizing 进⾏设置。根据计算宽⾼的区域可分为 content-box ( W3C 标准盒模型)border-box ( IE 盒模型)padding-boxmargin-box (浏览器未实现) 2. BFC 块级格式化上下⽂,是⼀个独⽴的渲染…

题解:ABC277E - Crystal Switches

题解:ABC277E - Crystal Switches 题目 链接:Atcoder。 链接:洛谷。 难度 算法难度:B。 思维难度:A。 调码难度:C。 综合评价:普及/提高。 算法 宽度优先搜索拆点思路 思路 把每个点…

Android WakefulBroadcastReceiver的使用

WakefulBroadcastReceiver 是一种特殊类型的广播接收器,为应用创建和管理 PARTIAL_WAKE_LOCK 。 简单来说, WakefulBroadcastReceiver 是持有系统唤醒锁的 BroadcastReceiver ,用于执行需要保持CPU运转的场景。 注册 注册 Receiver &#…

将vue项目通过electron打包成windows可执行程序

将vue项目打包成windows可执行程序 1、准备好dist将整个项目打包 npm run build2、安装electron依赖 npm install electron --save-dev npm install electron-packager --save-dev"electron": "^13.1.4", "electron-packager": "^15.2.0…

九耶丨阁瑞钛伦特-在项目中找到的经典BUG是什么?

在项目中找到的经典BUG有很多种,以下是其中一些常见的例子: 空指针异常(NullPointerException):当程序试图访问一个空对象或未初始化的变量时,会抛出空指针异常。这通常是由于缺少对变量的正确初始化或检查…

Neo4j之FOREACH基础

在 Neo4j 中,FOREACH 语句用于在查询中对一组元素执行某些操作,通常是在创建或更新节点关系时。它常常与 CREATE 或 SET 等操作结合使用。 创建多个关系: MATCH (p:Person), (m:Movie) WHERE p.name Alice AND m.title The Matrix FOREAC…

MySQL常用练手题目

数据库表名和字段设计 1.学生表 Student(s_id,s_name,s_birth,s_sex) 学生编号,学生姓名, 出生年月,学生性别 2.课程表 Course(c_id,c_name,t_id) 课程编号, 课程名称, 教师编号 3.教师表 Teacher(t_id,t_name) 教师编号,教师姓名 4.成绩表 Score (s_id,c_id,s_score) 学生编号…