Zookeeper源码剖析-ZAB协议选举流程

news2024/9/9 0:14:57

文章目录

  • ZAB协议介绍
      • ZAB (ZooKeeper Atomic Broadcast) 协议
      • 1. 概述
      • 2. 模式
        • 2.1 崩溃恢复模式 (Recovery Mode)
        • 2.2 广播模式 (Broadcast Mode)
      • 3. 详细流程
        • 3.1 崩溃恢复模式
        • 3.2 广播模式
      • 4. 关键概念
      • 5. 优点
      • 6. 代码示例
        • 6.1 Leader 选举
        • 6.2 状态同步
        • 6.3 事务提案
      • 7. 总结
  • ZooKeeper的Leader选举流程分析
      • 1. 初始状态
      • 2. 初始化投票
      • 3. 广播投票
      • 4. 接收投票
      • 5. 比较投票
      • 6. 确定获胜者
      • 7. 更新状态
      • 8. 领导者通知
      • 9. 处理客户端请求
      • 10. 重新选举
      • 选举规则
      • 选举示例
      • 总结
  • QuorumPeer是如何开启一次Leader选举的?
      • 1. 服务器状态
      • 2. 初始化投票
      • 3. 启动选举
      • 4. 创建选举算法
      • 5. 发送投票
      • 6. 接收投票
      • 7. 统计投票
      • 8. 确定获胜者
      • 9. 更新状态
      • 10. 领导者通知
      • 11. 处理客户端请求
      • 代码示例
      • 总结
  • QuorumPeer的线程主逻辑中是如何根据节点状态启动Leader选举的
      • QuorumPeer 线程主逻辑
      • 启动 Leader 选举
      • 创建选举算法
      • 选举算法的启动
      • 选举算法的具体实现
      • 总结
  • 初步开始查看Leader选举的源码细节
      • 步骤 1: QuorumPeer 类
      • 步骤 2: 创建选举算法
      • 步骤 3: FastLeaderElection 类
        • 3.1 构造函数
        • 3.2 startElection 方法
      • 步骤 4: 投票和选举过程
        • 4.1 初始化投票
        • 4.2 发送投票信息
        • 4.3 接收投票信息
      • 步骤 5: 确定获胜者
      • 步骤 6: 更新状态
      • 步骤 7: 领导者通知
      • 总结
  • QuorumPeer是如何尝试去跟其他机器建立连接的?
      • 1. QuorumPeer 启动
      • 2. 创建 SocketServer
      • 3. 初始化选举算法
      • 4. 启动选举
      • 5. 建立连接
        • 5.1 创建 PeerManager
        • 5.2 PeerManager 初始化
        • 5.3 PeerManager 连接建立
      • 6. PeerManager 连接逻辑
        • 6.1 PeerManager.start()
        • 6.2 PeerCnxn 连接
        • 6.3 连接建立过程
      • 总结
  • QuorumCnxManager是如何基于TCP监听其他机器的连接的?
      • 1. QuorumPeer 初始化
      • 2. QuorumCnxManager 创建
      • 3. 处理连接
      • 4. QuorumPeerCnxn 创建
      • 5. 数据读取
      • 6. 数据处理
      • 总结
  • ZooKeeper是如何避免两台机器重复建立TCP连接的
      • 1. 服务器 ID (myid)
      • 2. 服务器地址
      • 3. PeerManager 和 PeerCnxn
      • 4. 连接建立逻辑
      • 5. 连接状态管理
      • 6. 连接唯一性的检查
      • 7. 连接管理器
      • 8. 连接关闭
      • 示例代码
      • 9. 连接超时和心跳检测
      • 总结
  • 当两台机器建立连接之后是如何开始发起投票的
      • 1. 连接建立
      • 2. 初始化投票
      • 3. 创建选举算法
      • 4. 启动选举
      • 5. 发送投票信息
      • 6. 接收投票信息
      • 7. 更新投票
      • 8. 确定获胜者
      • 9. 领导者通知
      • 总结
  • SenderWorker是如何将投票发送给其他机器的?
      • 1. SenderWorker 创建
      • 2. SenderWorker 启动
      • 3. 发送投票
      • 4. 发送队列
      • 5. 发送投票信息
      • 总结
  • 如何接收其他机器发送过来的投票
      • 1. QuorumPeerCnxn 创建
      • 2. 启动读取线程
      • 3. 读取数据包
      • 4. 处理数据包
      • 5. 处理投票
      • 6. 传递给选举算法
      • 7. 更新投票计数
      • 8. 确定获胜者
      • 总结
  • 如何进行选票PK以及选票归档?
      • 1. 选票 PK (比较)
        • 1.1 投票结构
        • 1.2 投票比较规则
        • 1.3 代码示例
      • 2. 选票归档
        • 2.1 投票记录
        • 2.2 更新投票
      • 3. 确定获胜者
      • 总结
  • 如何通过归档的选票统计出谁当选Leader?
      • 1. 投票归档
      • 2. 更新投票
      • 3. 确定获胜者
      • 4. 代码示例
      • 5. 投票比较规则
      • 6. 总结
  • 如何根据选举结果更新自己的角色状态?
      • 1. 选举过程
      • 2. 状态更新
        • 2.1 成为 Leader
        • 2.2 成为 Follower
      • 3. 代码示例
      • 4. 更新状态
      • 5. 总结
  • Leader选举完毕之后各自确定角色以及创建核心实体
  • Leader是如何启动Follower连接监听器的
      • 1. 启动监听器
        • 1.1 代码示例
      • 2. QuorumCnxManager
        • 2.1 代码示例
      • 3. ListenerThread
        • 3.1 代码示例
      • 4. QuorumPeerCnxn
        • 4.1 代码示例
      • 5. 总结
  • Follower是如何向Leader发起连接请求的?
  • Leader跟Follower建立连接之后会干什么?
      • 1. 初始化握手
      • 2. 心跳机制
      • 3. 状态同步
      • 4. 完成同步
      • 5. 正常服务
      • 6. 事务提交
      • 7. Follower 应用事务
      • 代码示例
      • 总结
  • Jute是什么序列化协议?ZooKeeper内部通信是如何实现的
      • Jute 序列化协议
        • 特点
        • 使用场景
      • ZooKeeper 内部通信
        • 数据包结构
        • 通信流程
      • 示例代码
        • 序列化
        • 反序列化
        • 使用示例
      • 总结
  • Follower在完成连接建立之后是如何向Leader进行注册的
      • 1. 握手
      • 2. 注册
      • 3. 状态同步
      • 4. 正常服务
      • 代码示例
        • 4.1 Follower 向 Leader 发送 Sync 请求
        • 4.2 Leader 接收 Sync 请求
        • 4.3 Follower 应用事务
      • 5. 总结
  • Leader是如何处理Follower的注册请求的?
      • 1. 接收 Sync 请求
      • 2. 确定缺失的事务
      • 3. 发送缺失的事务
      • 4. 状态同步
      • 代码示例
        • 4.1 解序列化 Sync 请求
        • 4.2 处理 Sync 请求
      • 5. 总结
  • Follower注册完毕之后的数据同步通信架构
      • 1. 状态同步
      • 2. 通信架构
      • 3. 数据包结构
      • 4. 通信流程
        • 4.1 Follower 发送 Sync 请求
        • 4.2 Leader 确定缺失的事务
        • 4.3 Leader 发送缺失的事务
        • 4.4 Follower 应用事务
        • 4.5 完成同步
      • 5. 代码示例
        • 5.1 Follower 发送 Sync 请求
        • 5.2 Leader 确定缺失的事务
        • 5.3 Follower 应用事务
      • 6. 总结

ZAB协议介绍

ZAB (ZooKeeper Atomic Broadcast) 协议

ZAB (ZooKeeper Atomic Broadcast) 协议是 ZooKeeper 中用来保证集群中所有节点数据一致性的核心协议。它确保了所有更新能够在集群中以原子的方式传播,即要么所有节点都应用了更新,要么都不应用。ZAB 协议有两种模式:崩溃恢复模式 (Recovery Mode) 和普通模式 (Broadcast Mode)。

1. 概述

ZAB 协议解决了以下问题:

  • 一致性:所有服务器对同一操作具有相同的结果。
  • 原子性:要么所有服务器都应用了某个操作,要么都不应用。
  • 顺序性:操作按照提案的顺序被应用。
  • 持久性:已经提交的操作不会因为故障而丢失。

2. 模式

2.1 崩溃恢复模式 (Recovery Mode)

当集群中的服务器重启或加入新服务器时,需要进入崩溃恢复模式。此模式的目的是让所有的服务器达成一致的状态。

  • 选举 Leader:服务器之间进行选举,选出一个 Leader。
  • 状态同步:Follower 通过 Sync 请求与 Leader 同步状态。
  • 完成同步

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

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

相关文章

windows C/C++系列 64位汇编

Visual Studio 包括 32 位和 64 位托管版本的 MASM(Microsoft 宏汇编程序),面向 x64 代码。 它的名称为 ml64.exe,是接受 x64 汇编程序语言的汇编程序。 当你在 Visual Studio 安装期间选择 C 工作负荷时,会安装 MASM …

【运维】远程控制与访问的协议(域,工作组,RDP,ARD,VNC,SSH,SCP)和工具(DDNS,跳板机,堡垒机)

【运维】远程控制与访问的协议(域,工作组,RDP,ARD,VNC,SSH,SCP)和工具(DDNS,跳板机,堡垒机) 文章目录 1、远程访问协议1.1 组织&#…

基于 SASL/SCRAM 让 Kafka 实现动态授权认证

一、说明 在大数据处理和分析中 Apache Kafka 已经成为了一个核心组件。然而在生产环境中部署 Kafka 时,安全性是一个必须要考虑的重要因素。SASL(简单认证与安全层)和 SCRAM(基于密码的认证机制的盐化挑战响应认证机制&#xff…

傻瓜式PHP-Webshell免杀学习手册,零基础小白也能看懂

项目描述 一、PHP相关资料 PHP官方手册: https://www.php.net/manual/zh/ PHP函数参考: https://www.php.net/manual/zh/funcref.php 菜鸟教程: https://www.runoob.com/php/php-tutorial.html w3school: https://www.w3school…

网络流量分析>>pcapng文件快速分析有用价值解析

引言 在网络安全和流量管理中,解析网络协议数据包是了解网络行为和检测潜在威胁的关键步骤。本文介绍了如何使用Python解析和分析TCP、UDP和ICMP协议的数据包,并统计端口的访问次数。本文的示例代码展示了如何处理不同协议的数据包,提取关键…

网安零基础入门神书,全面介绍Web渗透核心攻击与防御方式!

Web安全是指Web服务程序的漏洞,通常涵盖Web漏洞、操作系统洞、数据库漏洞、中间件漏洞等。 “渗透测试”作为主动防御的一种关键手段,对评估网络系统安全防护及措施至关重要,因为只有发现问题才能及时终止并预防潜在的安全风险。 根据网络安…

前端面试宝典【vue篇】【3】

欢迎来到《前端面试宝典》,这里是你通往互联网大厂的专属通道,专为渴望在前端领域大放异彩的你量身定制。通过本专栏的学习,无论是一线大厂还是初创企业的面试,都能自信满满地展现你的实力。 核心特色: 独家实战案例:每一期专栏都将深入剖析真实的前端面试案例,从基础知…

phpenv安装redis扩展

1、下载dll文件 https://pecl.php.net/package/redis 我的是php8.1, 安装最新版的 DLL文件 2、将dll文件放到php安装目录的ext目录下 3、在php.ini中增加配置后重启服务 [Redis] extension php_redis.dll

自研Vue3开源Tree组件:节点拖拽bug修复

当dropType为after,且dropNode为父节点时,bug出现了: bug原因:插入扁平化列表的位置insertIndex计算的不对: 正确的逻辑,同inner要算上子孙节点所占的位置: bug修复!

vue里给img的src绑定数据失效

起因 在v-for遍历数据时想要通过给img的src单向绑定 图片路径时出现问题 解决过程 上网查说是webpack构建时识别不到,直接不单绑数据,写死试试看 解决方案 直接require导入图像文件模块

【C语言】VS的实用调试技巧

0. 前言 VS(Visual Studio)是集成开发环境,其内置了多种调试工具和技巧帮助开发人员在开发过程中解决问题。包含断点、监视窗口、自动窗口、调用堆栈等,通过这些技巧,开发人员可以有效地调试和解决程序中的问题。我们在VS编译器上写代码&…

yolov10在地平线旭日X3派上的部署和测试(Python版本和C++版本)

0、搭建开发环境 当前的测试根据一下的步骤并修改源码是可以实现yolov8的板端运行,如果不想再搭建环境和测试代码bug上浪费更多的时间可以直接获取本人的测试虚拟机,所有的测试代码、虚拟环境和板端测试工程以全部打包到了虚拟机,需要的可以…

微前端概念

微前端作用 大型应用程序的拆分独立的前端子应用降低程序复杂性&#xff0c;提高开发效率 微前端能力 js隔离css隔离元素隔离生命周期预加载数据通信应用跳转多层嵌套… 微前端实现方案 IframeSingle-spaQiankunMicro-app Iframe <iframe src"https://www.examp…

【优秀python web设计】基于Python flask的猫眼电影可视化系统,可视化用echart,前端Layui,数据库用MySQL,包括爬虫

1 绪论 1.1 设计背景及目的 猫眼电影作为国内知名的电影信息网站&#xff0c;拥有海量的电影信息、票房数据和用户评价数据。这些数据对于电影市场的研究和分析具有重要意义。然而&#xff0c;由于数据的复杂性和数据来源的多样性&#xff0c;如何有效地采集、存储和展示这些数…

巴黎OSGB倾斜摄影数据详细介绍

北京时间7月27日&#xff0c;第33届夏季奥林匹克运动会开幕式在法国巴黎举行&#xff0c;巴黎成为继伦敦后&#xff0c;第二个三度举办夏季奥运会的城市&#xff0c;此次为法国相隔100年后再次举办夏季奥运会&#xff0c;前两次分别在1900年及1924年。开幕式上&#xff0c;巴黎…

Shader入门精要总结(二)矩阵

1. 矩阵乘法 一个rn的矩阵A和一个nc的矩阵B相乘&#xff0c;它们的结果AB将会是一个rc大小的矩阵&#xff0c;不满足此规则不能相乘 矩阵乘法满足一些性质 矩阵乘法不满足交换律 即AB≠BA矩阵乘法满足结合律 (AB)CA(BC) 2. 特殊矩阵 方块矩阵 指行和列数目相等的矩阵&#…

【WEB安全】 PHP基础文件知识完整教学中(超详细)

文章目录​​​​​​​ 1.PHP 文件处理 PHP 操作文件 PHP 文件打开/读取/关闭 ​​​​​​​文件的 复制 删除 重名 ​​​​​​​文件的判断 2.PHP获取文件属性 3.PHP目录操作 4.命名空间 PHP 命名空间可以解决以下两类问题&#xff1a; 5.正则表达式 正则表达…

网站后端管理和构建java项目的工具-Maven

maven是用于管理和构建java项目的工具。 管理Jar包 无论是使用eclipse、IDEA创建的maven项目&#xff0c;格式都是统一的。 不同开发工具创建的maven项目兼容。 test是对main测试的代码。main中的resources中放置配置文件。 对于Maven&#xff0c;一个Maven项目就是一个对象…

《基于深度学习的目标检测算法综述论文的解读》

论文阅读&#xff1a;《基于深度学习的目标检测算法综述论文的综述》的总结 作者 &#xff1a; 包晓敏&#xff0c;王思琪 ( 浙江理工大学 信息学院&#xff0c;浙江 杭州 310018) 本文章介绍了两阶段深度学习算法和单阶段深度学习算法。 一、目标检测的定义&#xff1a; 目…

Qt Designer,仿作一个ui界面的练习(二):部件内容的填充

有了完成了布局的基本框架设计之后&#xff0c;对各个部件逐步完成内容的填充。 一、还是从顶边栏开始&#xff1a; 1、在顶边栏的topLogo里面拖入一个QLabel&#xff08;标签&#xff09;&#xff0c;命名为logoImage&#xff0c;删除标签的文字。 2、右键点击topLogo&#x…