Zookeeper 集群节点选举原理实现(三)

Zookeeper 集群节点选举原理实现(三)

刚部署三个节点或者多个节点启动时,此时还未选择出领导节点,不同节点的初始化zxid
是如何保证不重复不冲突有序呢?

在 Zookeeper 集群的初始启动阶段,所有节点会在选举领导节点之前先初始化自己的状态和 ZXID。为了确保不同节点的初始化 ZXID 不重复、不冲突且有序,Zookeeper 采用了一套完整的机制来管理和分配 ZXID。以下是详细的原理和实现逻辑。

初始化 ZXID 的过程

  1. 读取持久化数据

    • 每个节点在启动时,会首先读取本地磁盘上的快照文件和事务日志文件。这些文件包含了该节点的最新状态和已处理的事务记录。
    • 如果节点是第一次启动,没有任何持久化数据,那么它的初始 ZXID 为 0。
  2. 确定最新的 ZXID

    • 节点通过解析快照文件和事务日志文件,确定本地存储的最新事务的 ZXID。
    • 每个节点会将解析到的最新 ZXID 作为其当前的 ZXID。

领导节点选举过程中的 ZXID 确保有序

领导节点选举过程中,ZXID 的有序性和唯一性是通过以下步骤确保的:

  1. 节点投票

    • 每个节点在启动时都会投票给自己,并将自己的投票信息(包含自己的 ZXID)广播给其他节点。
    • 初始阶段,每个节点的投票信息中包含的 ZXID 是该节点从持久化文件中解析到的最新 ZXID。如果是全新部署,ZXID 为 0。
  2. 收集和比较投票

    • 每个节点会收集其他节点的投票信息,并比较这些投票的 ZXID 和节点 ID。
    • 投票信息包括节点的 ID 和 ZXID。
  3. 选举出拥有最新 ZXID 的节点作为领导节点

    • 通过比较 ZXID,拥有最大 ZXID 的节点更有可能成为领导节点。
    • 如果 ZXID 相同,则比较节点 ID,ID 较大的节点优先成为领导节点。
    • 这一步确保选出的领导节点拥有最新的事务,并保证了事务的顺序性。
  4. 领导节点同步最新状态

    • 新的领导节点选举成功后,会将自己的最新状态同步给所有跟随节点。
    • 跟随节点会更新自己的状态,并设置最新的 ZXID,确保所有节点的 ZXID 有序且一致。

实现逻辑示例

以下是 Zookeeper 中初始化 ZXID 和领导节点选举的简化代码示例,展示了如何确保 ZXID 的有序性和唯一性:

初始化 ZXID 的逻辑
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.util.ArrayList;
import java.util.List;class ZookeeperNode {private long currentZxid;private List<File> snapshotFiles;private List<File> logFiles;public ZookeeperNode(List<File> snapshotFiles, List<File> logFiles) {this.snapshotFiles = snapshotFiles;this.logFiles = logFiles;this.currentZxid = 0;}public void initialize() throws IOException {for (File file : snapshotFiles) {long zxid = parseFile(file);if (zxid > currentZxid) {currentZxid = zxid;}}for (File file : logFiles) {long zxid = parseFile(file);if (zxid > currentZxid) {currentZxid = zxid;}}System.out.println("Initialized ZXID: " + currentZxid);}private long parseFile(File file) throws IOException {try (FileInputStream fis = new FileInputStream(file)) {byte[] buffer = new byte[8];fis.read(buffer);return ByteBuffer.wrap(buffer).getLong();}}public long getCurrentZxid() {return currentZxid;}
}
领导节点选举的逻辑
import java.util.HashMap;
import java.util.Map;class Vote {int nodeId;long zxid;Vote(int nodeId, long zxid) {this.nodeId = nodeId;this.zxid = zxid;}
}class QuorumPeer {int myId;long myZxid;

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

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

相关文章

jieba中文分词器的使用

Jieba 是一个中文分词的第三方库&#xff0c;主要用于对中文文本进行分词。分词是将文本分割成一个个词语的过程&#xff0c;这在中文文本处理中尤为重要&#xff0c;因为中文不像英文那样有明显的空格来分隔词语。Jieba 的分词算法可以实现精确分词、全模式分词和搜索引擎模式…

嵌入式实验---实验一 通用GPIO实验

一、实验目的 1、掌握STM32F103 GPIO程序设计流程&#xff1b; 2、熟悉STM32固件库的基本使用。 二、实验原理 1、通过按键实现&#xff1a;按键按下&#xff0c;LED点亮&#xff1b;按键释放&#xff0c;LED熄灭。 三、实验设备和器材 电脑、Keil uVision5软件、Proteus…

Hierarchical Integration Diffusion Model for Realistic Image Deblurring

neurips23 上交&ETH&字节&清华&上海ai lab&悉尼大学&西湖大学https://github.com/zhengchen1999/HI-Diff 问题引入 现在的diffusion的方法在sample的时候需要的iteration过多&#xff0c;所以本文提出在高度压缩的空间进行DM&#xff0c;且deblur模型…

力扣第209题“长度最小的子数组”

关注微信公众号 数据分析螺丝钉 免费领取价值万元的python/java/商业分析/数据结构与算法学习资料 在本篇文章中&#xff0c;我们将详细解读力扣第209题“长度最小的子数组”。通过学习本篇文章&#xff0c;读者将掌握如何使用滑动窗口和双指针的方法来解决这一问题&#xff0…

甲辰年五月十四风雨思

甲辰年五月十四风雨思 夜雨消暑气&#xff0c;远光归家心。 ​只待万窗明&#xff0c;朝夕千家勤。 ​苦乐言行得&#xff0c;酸甜日常品。 宫商角徵羽&#xff0c;​仁义礼智信。

【python】PyCharm如何设置字体大小和背景

目录 效果展示 字体大小 背景设置 效果展示 字体大小 再左上角找到四条杠的图标 找到File 一般字体大小为22最合适&#xff0c;行间距为默认 背景设置 还是再字体设置的页面搜索 background 小编的其他文章详见&#xff0c;欢迎来支持 东洛的克莱斯韦克-CSDN博客 【机器…

如何优雅的一键下载OpenHarmony活跃分支代码?请关注【itopen: ohos_download】

itopen组织&#xff1a;1、提供OpenHarmony优雅实用的小工具2、手把手适配riscv qemu linux的三方库移植3、未来计划riscv qemu ohos的三方库移植 小程序开发4、一切拥抱开源&#xff0c;拥抱国产化 一、概述 为方便大家每次下载OpenHarmony不同分支/tag代码&#xff0c…

【文末附gpt升级秘笈】“登月游戏”对人类的意义

“登月游戏”对人类的意义是多方面的&#xff0c;不仅体现在科技、教育和娱乐层面&#xff0c;还对人类探索未知的精神产生了深远影响。 一、科技意义 “登月游戏”作为早期计算机游戏的代表之一&#xff0c;展示了计算机技术在模拟现实世界方面的能力。通过模拟登月器的着陆…

数据库-单表查询-排序和分组

对查询结果排序&#xff1a; SELECT 字段名 FROM 表名 ORDER BY 字段名 [ASC[DESC]]; ASC 升序关键字DESC 降序关键字 分组查询的单独使用: SELECT 字段名 FROM 表名 GROUP BY 字段名; 使用 LIMIT 限制查询结果的数量: SELECT 字段名 FROM 表名 LIMIT [OFFSET,] 记录数; 第一个…

程序员失业了,你可以做这些事情

这篇文章&#xff0c;我们讲&#xff0c;你先别带入自己哈&#xff0c;如果失业了&#xff0c;放心吧&#xff0c;你那么有上进心&#xff0c;不会失业的。咱就是说&#xff0c;如果万一失业了&#xff0c;你可以做这些事情。 1 体力好的铁人三项 &#x1f469;‍&#x1f3e…

Kotlin 编程语言详解:特点、应用领域及语法教程

什么是 Kotlin&#xff1f; Kotlin 是一种现代、流行的编程语言&#xff0c;由 JetBrains 在 2016 年发布。 自发布以来&#xff0c;它已经变得非常流行&#xff0c;因为它与 Java 兼容&#xff08;Java 是目前最流行的编程语言之一&#xff09;&#xff0c;这意味着 Java 代…

Python基础-引用参数、斐波那契数列、无极分类

1.引用参数的问题 &#xff08;1&#xff09;列表&#xff08;list&#xff09; 引用参数&#xff0c;传地址的参数&#xff0c;即list1会因list2修改而改变。 list1 [1,2,3,4] list2 list1 print(list1) list2[2] 1 print(list2) print(list1)非引用参数&#xff0c;不传…

【Java】线程池技术(一)Executor框架

背景 Java 底层提供了 Thread 类支持开发人员手动创建线程执行任务&#xff0c;但是这种操作会存在以下问题&#xff1a; 每次都要重新创造和回收 Thread 对象&#xff0c;性能较差。如果并发线程数较大&#xff0c;且任务执行时间较短&#xff0c;频繁创建和回收线程对象会大…

解锁TikTok内容趋势——高效获取TikTok标签信息接口

一、引言 在TikTok这个全球热门的短视频平台上&#xff0c;标签&#xff08;Hashtags&#xff09;是用户和内容创作者连接、发现新内容的重要工具。为了帮助品牌、市场分析师、内容创作者等更好地理解和利用TikTok上的内容趋势&#xff0c;我们推出了一款全新的接口服务&#…

PD19 Parallels Desktop 虚拟机 安装Windows10系统 操作步骤(保姆级教程,轻松上手)

Mac分享吧 文章目录 效果一、准备工作**下载软件** 二、开始安装1、打开pd 19 虚拟机&#xff0c;点击右上角文件&#xff0c;新建2、通过下载好的镜像安装Windows10系统。找到镜像文件位置&#xff0c;安装&#xff0c;配置2、显示安装完成&#xff0c;打开Windows10系统 三、…

单链表的合并

分数 5 作者 李卫明 单位 杭州电子科技大学 1.2 编写程序&#xff0c;在第1题(第1题&#xff1a;编写程序&#xff0c;建立2个带头结点单链表&#xff0c;输入若干整数将正整数插入第1个单链表&#xff0c;将负整数插入第2个单链表&#xff0c;插入前和插入后单链表保持递增…

UI设计速成课:理解模态窗口与非模态窗口的区别

我们日常所说的弹性框架是非常笼统的概念。我们习惯性地称之为对话框架、浮动层和提示条。弹性框架可以分为两种:模态弹性框架和非模态弹性框架。产品需要弹性框架来传递信息&#xff0c;用户需要弹性框架来接受反馈&#xff0c;但是没有经过推敲的弹出窗口设计很容易让用户感到…

最新版首发 | 手把手教你安装 Vivado2024.1(附安装包)

Q&#xff1a;Vivado出2024版了&#xff01;不知迪普微有没有对应的安装包呢&#xff1f; A&#xff1a;有的&#xff01;回复“Vivado2024.1”即可获得相应安装包哦~ Q&#xff1a;好哒~但是我不会安装&#xff0c;可否安排一期安装教程&#xff1f; A&#xff1a;立马安排&…

Gin 详解

Gin 介绍 gin框架是一个基于go语言的轻量级web框架&#xff0c;它具有高效性、灵活性、易扩展性路由 gin框架使用的是定制版的httprouter 其路由原理是大量使用公共前缀的树结构&#xff0c;注册路由的过程就是构造前缀树的过程。 具有公共前缀的节点也共享一个公共父节点。…