当前位置: 首页 > news >正文

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

文章目录

  • 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 同步状态。
  • 完成同步

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Oracle核心进程详解并kill验证
  • js中map属性
  • vue2 前端实现pdf在线预览(无插件版)
  • “八股文”在程序员面试中的作用及其对实际工作的影响
  • Java整理14
  • C++ 沙漏图案(Hour-glass Pattern)
  • JavaScript_语法_运算符_一元运算符
  • Python面试题:结合Python技术,如何使用Alembic进行数据库迁移管理
  • Spring框架中依赖注入实现手段的选择(基于XML 或 基于注解)
  • 新装centos7虚拟机如何配置网络,NAT配置固定IP
  • Android Studio运行报错:module java.base dose not “opens java.io“ to unnamed module
  • 特斯拉财报看点:FSD拳打华为,Robotaxi 脚踢百度
  • Java类加载器实现机制详细笔记
  • Stable Diffusion WebUI本地环境搭建
  • kafka详解及应用场景介绍
  • ➹使用webpack配置多页面应用(MPA)
  • co.js - 让异步代码同步化
  • CSS 三角实现
  • docker容器内的网络抓包
  • golang 发送GET和POST示例
  • Java 网络编程(2):UDP 的使用
  • Mysql5.6主从复制
  • PHP CLI应用的调试原理
  • Spring Boot MyBatis配置多种数据库
  • UEditor初始化失败(实例已存在,但视图未渲染出来,单页化)
  • 从0搭建SpringBoot的HelloWorld -- Java版本
  • 道格拉斯-普克 抽稀算法 附javascript实现
  • 互联网大裁员:Java程序员失工作,焉知不能进ali?
  • 3月27日云栖精选夜读 | 从 “城市大脑”实践,瞭望未来城市源起 ...
  • 国内唯一,阿里云入选全球区块链云服务报告,领先AWS、Google ...
  • ​【经验分享】微机原理、指令判断、判断指令是否正确判断指令是否正确​
  • #if和#ifdef区别
  • #QT 笔记一
  • (1)Map集合 (2)异常机制 (3)File类 (4)I/O流
  • (10)ATF MMU转换表
  • (2022 CVPR) Unbiased Teacher v2
  • (39)STM32——FLASH闪存
  • (delphi11最新学习资料) Object Pascal 学习笔记---第5章第5节(delphi中的指针)
  • (MonoGame从入门到放弃-1) MonoGame环境搭建
  • (附源码)springboot教学评价 毕业设计 641310
  • (回溯) LeetCode 131. 分割回文串
  • (九)One-Wire总线-DS18B20
  • (四) Graphivz 颜色选择
  • (四)React组件、useState、组件样式
  • (心得)获取一个数二进制序列中所有的偶数位和奇数位, 分别输出二进制序列。
  • (原創) 如何將struct塞進vector? (C/C++) (STL)
  • .bat批处理(五):遍历指定目录下资源文件并更新
  • .Net 6.0--通用帮助类--FileHelper
  • .net8.0与halcon编程环境构建
  • .NET8使用VS2022打包Docker镜像
  • .NET企业级应用架构设计系列之应用服务器
  • .ui文件相关
  • //usr/lib/libgdal.so.20:对‘sqlite3_column_table_name’未定义的引用
  • :如何用SQL脚本保存存储过程返回的结果集
  • ??在JSP中,java和JavaScript如何交互?