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

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

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

相关文章

基于FPGA的数字信号处理(20)--半加器和全减器

1、前言 既然有半加器和全加器,那自然也有半减器和全减器了。尽管在电路中减法的实现基本都是 补码 加法 的形式,但是正所谓技多不压身,了解一下半减器和全减器还是有一定作用的,至少能扩宽知识面嘛。 2、半减器 最简单的减法器叫…

RESNET

ResNet 文章目录 ResNet主要内容开发背景解决两个问题:1. 梯度消失和梯度爆炸2. 退化问题: 解决方法1. BN(Batch Normalization)层2. 残差块 Pytorch实现BasicBlockBottleNeckResNet 主要内容 开发背景 残差神经网络(ResNet)是由微软研究院…

LLM大模型:十大人工智能大模型技术介绍

十大人工智能大模型技术的简介: 深度学习模型 深度学习是人工智能领域中一种重要的机器学习技术,通过构建深度神经网络来模拟人脑的认知过程。深度学习模型能够自动提取数据的特征,并在海量数据中进行学习和优化,从而在语音识别…

搭建规范化的vue2项目

项目包含的库 Vue2VuexRouterEslintPrettier 环境 vue:2.6.14 eslint:7.32.0 prettier:2.4.1 eslint-plugin-prettier:4.0.0 eslint-plugin-vue:8.0.3 vue/cli:5.0.8 步骤 全局安装cli工具 npm in…

CAE仿真软件怎样下载和安装?

CAE仿真软件是一类专业工程软件,通过数值计算和仿真技术,帮助工程师和设计师在计算机上模拟和分析各种工程问题,如结构强度、热传导、流体力学等,从而优化产品设计、减少试验成本,提高产品性能和质量。HyperWorks是常见…

快手文生图模型-Kolors快速上手

Kolors是什么 可图(Kolors):用于真实感文本到图像合成的扩散模型的有效训练 可图,是快手开源的一个文生图模型,架构上使用了chatglm,比普通的sd模型在中文理解上要强大很多,以往sd模型的提示词理解能力往往只有两种 …

二进制部署k8s集群之cni网络插件flannel和calico工作原理

3、部署 CNI 网络组件 在 master01 节点上操作 上传flannel-v0.21.5.zip并解压 unzip flannel-v0.21.5.zipscp flannel*.tar 192.168.80.20:/opt/k8s/ scp flannel*.tar 192.168.80.30:/opt/k8s/ node两个节点操作 cd /opt/k8s/ docker load -i flannel.tar docker load -i …

nginx代理设置时能获取到源IP地址的方法

nginx通过http_x_forwarded_for限制来访IP示例_ngnix 根据header的x-forwarded-for限制接入-CSDN博客 名称ip客户端地址10.0.23.90nginx服务器地址110.0.202.48:18888,代理到10.0.204.82:8888nginx服务器地址210.0.204.82:8888,代理到10.0.204.82:8887后…

自写ApiTools工具,功能参考Postman和ApiPost

近日在使用ApiPost的时候,发现新版本8和7不兼容,也就是说8不支持离线操作,而7可以。 我想说,我就是因为不想登录使用才从Postman换到ApiPost的。 众所周知,postman时国外软件,登录经常性抽风,…

leetcode 1555 银行账号概要(postgresql)

需求 用户表: Users --------------------- | Column Name | Type | --------------------- | user_id | int | | user_name | varchar | | credit | int | --------------------- user_id 是这个表的主键。 表中的每一列包含每一个用户当前的额度信息。 交易表&…

使用 Elastic Observability 中的 OpenTelemetry 进行基础设施监控

作者:来自 Elastic ISHLEEN KAUR 将 OpenTelemetry 与 Elastic Observability 相结合,形成应用程序和基础设施监控解决方案。 在 Elastic,我们最近决定全面采用 OpenTelemetry 作为首要的数据收集框架。作为一名可观察性工程师,我…

分享5款ai头像工具,助你轻松实现社交新形象

如今,无论是社交媒体上的个人形象塑造,还是虚拟世界中的角色扮演,一个独特而吸引人的AI头像都能成为你个性化的代表。 例如,ai头像男古风通常代表着一种对传统文化的尊重和热爱;而现代简约头像可能代表着一种追求简洁…

Mongodb集合操作

文章目录 1、进入容器2、如果数据库不存在,则创建数据库,否则切换到指定数据库3、在 MongoDB 中,创建集合不是必须操作。当你插入一些文档时,MongoDB 会自动创建集合。4、查看数据库列表5、查看集合6、显示创建集合7、删除集合 1、…

百度竞价托管如何判断关键词出价是否偏高

在百度竞价推广中,关键词出价的高低直接影响着广告的展示位置、点击率以及最终的转化效果。然而,过高的出价不仅会增加推广成本,还可能导致预算的浪费。因此,作为百度竞价托管 www.pansem.com 的专业团队,如何准确判断…

springboot校园跑腿服务系统-计算机毕业设计源码15157

摘要 本文介绍了一种基于Springboot和uniapp的校园跑腿服务系统的设计与实现。该系统旨在为大学校园提供一种方便快捷的跑腿服务,满足学生和教职员工的日常需求。首先,系统采用了Springboot作为后端框架,利用其轻量级、高效的特性&#xff0c…

httpx,一个网络请求的 Python 新宠儿

大家好!我是爱摸鱼的小鸿,关注我,收看每期的编程干货。 一个简单的库,也许能够开启我们的智慧之门, 一个普通的方法,也许能在危急时刻挽救我们于水深火热, 一个新颖的思维方式,也许能…

计算机网络-七层协议栈介绍

之前介绍了网络世界的构成,从宏观角度介绍了网络设备和网络架构,链接: link,但是这种认识过于粗糙,过于肤浅。网络本质上是用于主机之间的通信,是端对端的连接通信,两台计算机可能距离很远,主机…

thinkPHP开发的彩漂网站源码,含pc端和手机端

源码简介 后台thinkPHP架构,页面程序双分离,Mysql数据库严谨数据结构、多重数据审核机制、出票机制和监控机制,html5前端技术适用移动端,后台逻辑更多以server接口可快捷实现对接pc和ap,下载会有少量图片素材丢失,附件有下载说明前端demo账户密码和后台管理地址管理员账户密码…

C 语言动态链表

线性结构->顺序存储->动态链表 一、理论部分 从起源中理解事物,就是从本质上理解事物。 -杜勒鲁奇 动态链表是通过结点(Node)的集合来非连续地存储数据,结点之间通过指针相互连接。 动态链表本身就是一种动态分配内存的…

Java 8-函数式接口

目录 一、概述 二、 函数式接口作为方法的参数 三、函数式接口作为方法的返回值 四、 常用的函数式接口 简单总结 简单示例 4.1 Consumer接口 简单案例 自我练习 实际应用场景 多线程处理 4.2 Supplier接口 简单案例 自我练习 实际应用场景 配置管理 4.3 Func…