一文彻底搞懂ZooKeeper选举机制

news2024/11/13 12:56:11

原文阅读:【巨人肩膀社区·博客·分享】一文彻底搞懂ZooKeeper选举机制

1. ZooKeeper 集群

ZooKeeper 是一个高性能分布式的开源协调服务,用于构建分布式应用程序和服务。 一个 ZooKeeper 集群通常由多个 ZooKeeper 服务器组成,这些服务器分布在不同的物理节点上。在集群中,每个服务器都知道其他服务器的存在,并且彼此协调工作以提供一致性可用性。主要原理如下:

写请求: 在 ZooKeeper 集群中,每个服务器可能处于三种状态之一:LeaderFollower Observer。Leader 负责处理客户端的请求,并将更新广播给其他服务器;而 Follower 和 Observer 则负责接收更新复制数据。当一个 ZooKeeper 服务器启动或者 Leader 失效时,集群中的服务器会通过一种选举算法选出新的 Leader,以确保系统的可用性。

数据同步: ZooKeeper 使用 ZAB(ZooKeeper Atomic Broadcast)协议来确保数据的一致性和可靠性。当 Leader 收到写请求时,它会将请求转发给所有的 Follower,并等待大多数 Follower 确认写操作,然后再将写操作应用到本地状态。这种方式确保了数据的一致性,并且即使在部分服务器故障的情况下,系统仍然可以继续工作。

读请求: 客户端可以通过连接到任意一个 ZooKeeper 服务器来访问集群,一旦连接建立成功,客户端就可以向任意一个服务器发送读写请求。如果客户端连接的是 Follower 或 Observer,那么它会被重定向到 Leader,并在 Leader 上执行操作。

Watch 机制: ZooKeeper 提供了 Watch 机制,允许客户端在节点状态发生变化时接收通知。客户端可以在节点上设置 Watch,当节点的状态发生变化时,ZooKeeper 会向客户端发送通知,客户端可以据此执行相应的逻辑。



2. 选举机制

半数机制(过半机制):2n + 1,安装奇数台。

10台服务器:3台。

20台服务器:5台。

100台服务器:11台。

台数多,好处:提高可靠性;坏处:影响通信延时。



说明:

SID:服务器ID。用来唯一标识一台ZooKeeper集群中的机器,每台机器不能重复,和myid一致。

ZXID:事务ID。ZXID是一个事务ID,用来标识一次服务器状态的变更。在某一时刻,集群中的每台机器的ZXID值不一定完全一致,这和ZooKeeper服务器对于客户端“更新请求”的处理逻辑有关。

Epoch:每个Leader任期的代号。没有Leader时同一轮投票过程中的逻辑时钟值是相同的。每投完一次票这个数据就会增加



2.1 第一次启动选举



image.png



(1)服务器1启动,发起一次选举。服务器1投自己一票。此时服务器1票数一票,不够半数以上(3票),选举无法完成,服务器1状态保持为LOOKING;

(2)服务器2启动,再发起一次选举。服务器1和2分别投自己一票并交换选票信息:此时服务器1发现服务器2的myid比自己目前投票推举的(服务器1)大,更改选票为推举服务器2。此时服务器1票数0票,服务器2票数2票,没有半数以上结果,选举无法完成,服务器1,2状态保持LOOKING

(3)服务器3启动,发起一次选举。此时服务器1和2都会更改选票为服务器3。此次投票结果:服务器1为0票,服务器2为0票,服务器3为3票。此时服务器3的票数已经超过半数,服务器3当选Leader。服务器1,2更改状态为FOLLOWING,服务器3更改状态为LEADING;

(4)服务器4启动,发起一次选举。此时服务器1,2,3已经不是LOOKING状态,不会更改选票信息。交换选票信息结果:服务器3为3票,服务器4为1票。此时服务器4服从多数,更改选票信息为服务器3,并更改状态为FOLLOWING;

(5)服务器5启动,同4一样当小弟。

2.2 非第一次启动



image.png



(1)当ZooKeeper集群中的一台服务器出现以下两种情况之一时,就会开始进入Leader选举:

Leader 故障: 当前的 Leader 出现故障或不可用时,需要选举一个新的 Leader 来接管领导权,以确保系统的正常运行。这种情况下,其他 ZooKeeper 服务器会通过一种选举算法选出新的 Leader。

新节点加入: 当新的 ZooKeeper 服务器加入集群时,需要选举一个 Leader 来维护集群的状态和数据一致性。新节点会参与选举,并且如果选举成功,它可能成为新的 Leader。

集群初始化: 在集群初始化阶段,当第一个 ZooKeeper 服务器启动时,它会尝试成为 Leader。如果此时没有其他节点加入集群,那么它就会成为唯一的 Leader。

(2)而当一台机器进入Leader选举流程时,当前集群也可能会处于以下两种状态:

•集群中本来就已经存在一个Leader。机器试图去选举Leader时,会被告知当前服务器的Leader信息,对于该机器来说,仅仅需要和Leader机器建立连接,并进行状态同步即可。

•集群中确实不存在Leader。

假设ZooKeeper由5台服务器组成,SID分别为1、2、3、4、5,ZXID分别为8、8、8、7、7,并且此时SID为3的服务器是Leader。某一时刻,3和5服务器出现故障,因此开始进行Leader选举。



image.png



选举Leader规则:

①EPOCH大的直接胜出

②EPOCH相同,事务id大的胜出

③事务id相同,服务器id大的胜出



3. Follower(跟随者)和Candidate(候选者)节点区别

在Zookeeper中,Follower(跟随者)和Candidate(候选者)节点是Zookeeper集群中不同角色的节点,它们在集群中扮演着不同的角色和责任。

Follower节点(跟随者):

•Follower节点是Zookeeper集群中的普通节点,它们的主要责任是参与Leader选举和数据同步。

•Follower节点跟随Leader节点,对客户端的读请求进行处理,并与Leader节点保持数据同步。

•Follower节点只能接收来自Leader节点的消息,并不能主动发起消息。

Candidate节点(候选者):

•Candidate节点是在进行Leader选举时,从Follower节点中选出的临时候选节点。

•候选者节点在Leader选举期间参与投票,如果获得了大多数Follower节点的选票,就会成为新的Leader节点。

•候选者节点会在选举超时时间内等待Follower节点的投票结果,如果在超时时间内没有获得足够的选票,就会重新成为Follower节点。

总的来说,Follower节点是普通节点,负责数据同步和处理客户端的读请求;而Candidate节点是在Leader选举期间临时产生的候选者,参与选举过程,有可能成为新的Leader节点。



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

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

相关文章

C语言基础(二十三)

在C语言中,修改链表中的数据涉及遍历链表以找到要修改的元素,然后更新该元素的值。链表是一种动态数据结构,它由一系列节点组成,每个节点包含数据部分和指向列表中下一个节点的指针(双向链表,还会有指向前一…

<Rust>egui学习之小部件(四):如何在窗口中添加滑动条部件?

前言 本专栏是关于Rust的GUI库egui的部件讲解及应用实例分析,主要讲解egui的源代码、部件属性、如何应用。 环境配置 系统:windows 平台:visual studio code 语言:rust 库:egui、eframe 概述 本文是本专栏的第四篇博…

Ubuntu 24.04 安装 intel 编译器

目录 1.采用用户界面 GUI 安装英特尔基本工具包 Intel oneAPI Base Toolkit 1.1 下载离线英特尔基本工具包 1.2 安装英特尔基本工具包 1.3 英特尔基本工具包 Intel oneAPI Base Toolkit 环境设置 2.安装英特尔基本工具包 Intel HPC Toolkit 2.1 下载离线英特尔高性能计算…

智能座舱高通8155摄像头方案

高通汽车开发平台 (ADP)基于8155的多媒体硬件框图如下所示:有4个4路CSI摄像头处理通路,2个4路DSI屏幕处理通路,1个DisplayPort。 基于摄像头的详细方案如下:可以处理4路MAX9296解串后信号。 再深入细化基于…

Java10 集合

集合 集合集合接口等级:Collection:单例集合接口,将数据一个一个存储,存储的是值。ArrayList类:泛型集合Linkedlist集合:Vector集合:Stack集合:Vetor的子类 Set接口:存储是无序的&am…

【使用 Python 进行截图的两种方法】

在 Python 中,可以使用 pyautogui 和 Pillow 进行截图 使用 pyautogui 进行截图时,其提供了方便的函数。例如,使用 pyautogui.screenshot() 函数可以获取整个屏幕的截图,该函数返回一个包含屏幕截图的图像对象。如果不想截取整个…

最大噪音值甚至受法规限制,如何基于LBM算法有效控制风扇气动噪音

风扇的气动噪声 在工业设备行业,最大噪音值受法规限制。在很多使用风扇冷却的设备上,风扇噪声通常是这些设备工作噪声的最大贡献量。而在家电民用行业,例如空调、空气净化器、油烟机等,其噪音大小直接关系到用户的体验感受&#x…

从零开始掌握容器技术:Docker的奇妙世界

容器技术在当今的云计算和软件开发领域中扮演着越来越重要的角色。如果你是一名计算机专业的学生或从事IT行业的从业者,可能已经听说过Docker这个词。它在软件开发、部署、运维等环节中大放异彩,但对于刚接触这个概念的朋友来说,可能还是有些…

【乐企】有关乐企能力测试接口对接(详细)

1、申请密钥 2、验证本地服务器与乐企服务器的连通性 乐企服务器生产和测试域名均为:https://lqpt.chinatax.gov.cn:8443。开发者可以在“能力中心”查看基础公用能力详情,按照能力接入和开发指引完成接口对接,验证服务器连通性和证书配置正确…

给一个web网站,如何开展测试?

前言 Web测试是指针对Web应用程序(网站或基于Web的系统)进行的测试活动,以确保其质量、性能、安全性、可用性和兼容性等方面符合预期标准。Web测试涵盖了从前端用户界面(UI)到后端逻辑和数据库的各个方面,确保Web应用程序在不同环境和条件下都能正常运行…

参会投稿 | 第三届先进传感与智能制造国际学术会议(ASIM 2024)

第三届先进传感与智能制造国际会议(The 3rd International Conference on Advanced Sensing, Intelligent Manufacturing),由江汉大学、西安交通大学和山东大学主办,由江西省机械工程学会、东华理工大学机械与电子工程学院等联合协…

Hibernate 批量插入速度慢的原因和解决方法

由于业务需要一次性连续写入超过10k条以上的新数据,当对象超过10个成员变量以后,整个写入过程居然需要长达35秒,这个速度是不能接受的,故此研究了一下怎么开启Hibernate批量写入的功能。 我这边使用的是Hibernate 5.6.15 在网上…

推动光模块技术发展:从400G、800G到1.6T

随着数据通信领域的持续发展,对于更快、更高传输速率的需求也在不断增长。作为现代数据传输的基石,光模块技术不断进步以满足这一需求。其中一项重大进展是网络速率从400G提升到800G,并将向1.6T继续发展。让我们深入探讨这些技术的演变&#…

Java语言程序设计基础篇_编程练习题***17.9 (地址簿)

目录 题目:***17.9 (地址簿) 习题思路 代码示例 结果展示 题目:***17.9 (地址簿) 编写程序用于存储、返回、增加,以及更新如图 17-20 所示的地址薄。使用固定长度的字符串来存储地址中的每个属性。使用随机访问文件来读取和写人一个地址…

刚刚认证!网络主播成为国家新职业,易播易赚打造打造职业入门全新模式

近期,人力资源和社会保障部会同国家市场监督管理总局、国家统计局日前增设网络主播为国家新职业,这标志着网络主播的职业身份在“国家确定职业分类”上首次得以确立。 据人社部此前印发的《关于加强新职业培训工作的通知》表示,新职业从业者可…

代码随想录算法训练营第二十三天| 39. 组合总和 40.组合总和II 131.分割回文串

目录 一、LeetCode 39. 组合总和思路:C代码 二、LeetCode 40.组合总和II思路C代码 三、LeetCode 131.分割回文串思路C代码 总结 一、LeetCode 39. 组合总和 题目链接:LeetCode 39. 组合总和 文章讲解:代码随想录 视频讲解:带你学…

直播平台直播API集成之快手篇

前言: 本篇我们来介绍如何使用快手 的直播API创建直播。 准备工作: 1、你首先得有个快手账号; 2、创建快手应用,填写应用审核信息,等待应用创建审核通过,应用成功创建后在开发与上线前还要提前做好API权限申请,如果你只需要获取用户基本信息,以及得到直播API的访问权限…

Python | Leetcode Python题解之第377题组合总和IV

题目&#xff1a; 题解&#xff1a; class Solution:def combinationSum4(self, nums: List[int], target: int) -> int:dp [1] [0] * targetfor i in range(1, target 1):for num in nums:if num < i:dp[i] dp[i - num]return dp[target]

合宙LuatOS产品规格书——Air700EMQ

Air700EMQ是合宙通信的LTE Cat.1bis通信模块&#xff0c; 依托移芯EC716E平台&#xff0c;支持先进的LTE 3GPP Rel.13技术。 主要特点如下&#xff1a; 1. 技术平台与标准支持&#xff1a; Air700EMQ采用移芯EC716E平台&#xff0c;基于先进的LTE技术。支持LTE 3GPP Releas…

leetcode234. 回文链表(java实现)

题目描述&#xff1a; 本道题的思路可以使用集合先存储链表的值&#xff0c;然后进行判断即可。 总体思路比较简单。 代码实现&#xff1a; class Solution {public boolean isPalindrome(ListNode head) {List<Integer> res new ArrayList();ListNode cur head;whil…