【大数据】Zookeeper 集群及其选举机制

news2024/11/17 15:44:12

Zookeeper 集群及其选举机制

  • 1.安装 Zookeeper 集群
  • 2.如何选取 Leader

1.安装 Zookeeper 集群

我们之前说了,Zookeeper 集群是由一个领导者(Leader)和多个追随者(Follower)组成,但这个领导者是怎么选出来的呢?我们貌似没有在配置文件中看到有关领导者和追随者的参数啊?

在此之前先来看看 Zookeeper 内部的一些机制:

  • 半数机制:只要有半数以上的节点存活,则集群可用,所以 Zookeeper 集群的节点数量适合为奇数。
  • 虽然在配置文件中没有指定领导者和追随者,但 Zookeeper 在工作时,有一个节点为 Leader,其它则为 Follower,而 Leader 是通过内部的选举机制临时产生的。

那么领导者到底是怎么选出来的呢?很简单,每台服务器都有一个 id(这里的 id 后面说),当启动的服务器超过半数的时候,就会选择 id 最大的 Server 成为领导者。比如有五台服务器,半数就是 2.5 2.5 2.5,因此当启动三台的时候就可以选出领导者。至于剩余的两台,启动之后只能成为追随者,因为领导者已经选出来了。关于这里的细节,一会儿再详细聊。

那么怎么指定服务器的 id 呢?还记得配置文件中的 dataDir 参数吗,在该参数指定的目录下创建一个 myid 文件(文件必须叫这个名字),然后在里面写上服务器的 id 即可。

[root@satori zkData]# echo 2 > myid

这里给 id 设置为 2,因为一会要搭建由三个节点组成的集群,而我希望当前节点成为 Leader,所以它的 id 应该为 2,其它的两个节点的 id 显然分别为 1 和 3。这样按着 id 从小到大的顺序启动时,该节点就会成为 Leader。

下面来我们来搭建 zookeeper 集群,总共三个节点:

  • IP:82.157.146.194,主机名:satori
  • IP:121.37.165.252,主机名:koishi
  • IP:123.60.7.226,主机名:marisa

satori 节点就是当前一直在用的节点,剩余的两个节点的 Zookeeper 也已经安装完毕。那么问题来了,我们要如何将这三个节点组成一个集群呢?显然还需要修改配置文件,先在 satori 节点进行修改。

# koishi 节点
server.1=121.37.165.252:2888:3888
# satori 节点
server.2=0.0.0.0:2888:3888
# marisa 节点
server.3=123.60.7.226:2888:3888

将集群中都有哪些节点写在 zoo.cfg 中,解释一下具体含义,首先两个冒号把等号右边分成了三部分,第一部分就不用说了,IP 地址或者主机名,用于定位节点; 2888 2888 2888 是 Leader 和 Follower 交换信息 的端口,因为副本要进行同步; 3888 3888 3888交换选举信息 的端口,因为要选出 Leader。

然后我们注意到 satori 节点的 IP 设置成了 0.0.0.0,这是因为当前的三个节点不在同一个网段,IP 用的都是公网 IP,而公网 IP 在绑定服务的时候会失败。所以在绑定的时候,其它节点的 IP 要写成公网 IP,自身节点的 IP 要写成 0.0.0.0。因此其它两个节点的 zoo.cfg 文件就应该这么改:

########## koishi 节点配置 ##########
# koishi 节点
server.1=0.0.0.0:2888:3888
# satori 节点
server.2=82.157.146.194:2888:3888
# marisa 节点
server.3=123.60.7.226:2888:3888

########## marisa 节点配置 ##########
# koishi 节点
server.1=121.37.165.252:2888:3888
# satori 节点
server.2=82.157.146.194:2888:3888
# marisa 节点
server.3=0.0.0.0:2888:3888

但是在 生产中,一个集群内的节点应该都位于同一网段,然后将配置文件中的 IP 全部换成内网 IP 即可。这样彼此之间可以通过内网访问,而内网的访问速度要远远快于公网,并且还不需要走公网的流量。但我当前的三台云服务器不在同一个网段,所以只能用公网 IP,并且绑定的时候,将节点自身的 IP 换成 0.0.0.0

至于等号左边的 server. 是固定的,后面的数字表示节点的 id,而节点 id 我们说了,通过在 myid 文件中进行指定。而节点 id 决定了,最终由谁担任领导者。其中 satori 节点的 id 2 2 2,刚刚已经改过了,然后将 koishimarisa 两个节点的 id 分别改为 1 1 1 3 3 3,然后就大功告成了。

然后我们来启动 Zookeeper,由于 satori 节点的 Zookeeper 已经启动了,我们在修改完配置文件之后,需要重新启动。

在这里插入图片描述

但是我们查看状态的时候,发现出错了,相信原因很好想。因为配置文件中指定了三个节点,而剩余两个节点的 Zookeeper 还没启动。下面我们来启动一下,然后再次查看状态。

在这里插入图片描述

当剩余的两个节点启动之后,再次查看状态,发现 Mode 变成了 Leader。显然集群已经启动成功,至于剩余的两个节点,显然就是 Follower。

在这里插入图片描述
在这里插入图片描述
此时集群就启动成功了,但是关于领导者和追随者的选举问题,我们还得再说一说。

2.如何选取 Leader

领导者选举分为两种情况:

  • 集群第一次启动的时候,选举领导者。
  • 运行过程中领导者挂了,从追随者当中选择一个作为领导者。

我们先来看第一种情况,假设集群当中有 5 个节点,id 分别为 1 到 5,来看看选举过程是怎样的?这里 5 个节点按照 id 从小到大顺序启动。
在这里插入图片描述

  • 首先 server1 启动,发起一次选举,每个节点都有投票权,并且默认都会投给自己。此时 server1 1 1 1 票,但还不够半数以上( 3 3 3 票),选举无法完成,于是 server1 将状态保持为 LOOKING
  • 然后 server2 启动,再发起一次选举,重新投票。server1server2 仍会把票投给自己,然后再交换选票信息。由于 server1 发现 server2id 比自己大,于是会将自己的票改投给 server2。此时 server1 0 0 0 票,server2 2 2 2 票,但仍然没有哪个节点拥有超过半数的票,选举无法完成,server1server2 状态都保持为 LOOKING
  • 接下来 server3 启动,再发起一次选举,相信整个过程不需要解释了。老规矩还是先投给自己,再交换选票信息,然后 server1server2 发现自己的 id 都没有 server3 大,于是都会将票改投给 server3。此时 server1server2 的票数为 0 0 0server3 的票数为 3 3 3,由于 server3 的票数已超过半数,所以成功当选为 Leader,状态变为 LEADING。而 server1server2 则成为 Follower,状态改为 FOLLOWING
  • 所以 5 5 5 个节点,启动 3 3 3 个之后就能选择出 Leader。然后 server4 又启动了,于是也发起一次选举,并把票投给自己。但 server1server2server3 已经不是 LOOKING 状态,所以它们不会更改自己的选票信息,最终结果 server3 仍有 3 3 3 票,server4 只有 1 1 1 票。少数服从多数,于是会再将自己的选票交给 server3,成为 Follower,状态改为 FOLLOWING
  • 同理,最后 server5 启动,结果就是 server3 4 4 4 票,自己只有 1 1 1 票。少数服从多数,于是将自己的选票交给 server3,成为 Follower。

所以整个过程,关键点有两个

  • 每个 server 启动之后都会发起选举,并将票投给自己。然后交换选票信息,并将票投给 id 最大的 server
  • 一旦选择出 Leader,其它节点自动成为 Follower。而后启动的 server,不论 id 多大,也只能成为 Follower。

以上就是集群第一次启动的时候,选举领导者。

但如果在运行过程中,领导者挂了该怎么办呢?显然要再选举出一个新的领导者。所以当集群中的追随者发现自己连接不上领导者的时候,就会开始进入 Leader 选举,但此时是存在两种可能的。

  • 领导者真的挂了。
  • 领导者没有挂,只是追随者因为某些原因无法和领导者建立连接。比如 server5 发现连接不上 server3 了,于是它认为领导者挂了,便开启 Leader 选举。但事实上 server3 并没有挂,其它追随者都能正常连接,只是 server5 因为某些原因连接不上罢了。

先来解释第二种情况,server5 认为 server3 挂了之后,便会发起 Leader 选举,呼吁其它追随者进行投票。但是其它追随者发现领导者并没有挂,于是会拒绝 server5 的选举申请,并告知它当前已存在的领导者信息。对于 server5 而言,只需要和已存在的领导者重新建立连接,并进行数据同步即可。

server3:老子还没挂呢!!!😤

但如果是第一种情况,领导者真的挂了,该怎么办?比如这里的领导者 server3,在运行的时候,节点突然宕机了。

要解释这个问题,我们需要引入一些新的概念。

  • sid:就是我们一直说的服务器 id,用于唯一标识集群中的节点。
  • zxid:事务 id,客户端在发起一次写请求的时候,都会带有 zxid,用于标识一次服务器状态的变更。所以 Zookeeper 也是有事务的,保证每次写数据的时候,要么全部写完,要么不写,不会出现只写一半的情况。另外每个节点都有自己的 zxid,它们的值也不一定相同。
  • epoch:Leader 任期的编号,就好比古代皇帝,每个皇帝在当政的时候都有自己的年号。并且每投完一次票,这个编号就会增加。

现在假设 server3 挂了,那么要重新选举 Leader,而选举规则如下:

  • 先比较节点之间的 epochepoch 大的直接当选。
  • epoch 相同,再比较 zxidzxid 大的当选。
  • epochzxid 都相同,则比较 sidsid 大的当选。

关于这么做背后的原理,我们先暂且不表,等到后面介绍 Paxos 协议的时候再细说。而且这里的 epoch 具体是干什么用的,估计也有人不太清楚,这些我们也留到后面再说。

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

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

相关文章

wpsjs学习——获取单元格批注

1.获取第一个单元格的值&#xff1a; wps.Application.ActiveSheet.Range(A1).Value2; 2.1.获取第一个单元格的批注&#xff1a; wps.Application.ActiveSheet.Range(A1).Comment.Text(); <div class"global">获取表格信息<div class"divItem">…

vr眼镜和AR眼镜的区别有哪些?哪些产品可以支持VR应用?

vr眼镜怎么连接手机 要将VR眼镜连接到手机上&#xff0c;您可以按照以下步骤进行&#xff1a; 1. 确保您的手机支持VR应用程序&#xff1a;首先&#xff0c;确保您的手机具备运行VR应用程序的硬件和软件条件。一些VR应用程序可能对设备有特定的要求&#xff0c;如处理器性能、操…

x-cmd pkg | pdfcpu - 强大的 PDF 处理工具

目录 简介首次用户多功能支持性能表现安全的加密处理进一步阅读 简介 pdfcpu 是一个用 Go 编写的 PDF 处理库。同时它也提供 API 和 CLI。pdfcpu 提供了丰富的 PDF 操作功能&#xff0c;用户还能自己编写配置文件&#xff0c;用来管理和使用各种自定义字体并存储有效的默认配置…

VR与数字孪生:共同构筑未来的虚拟世界

随着科技的不断发展&#xff0c;数字孪生和VR已经成为当今热门的科技话题。作为山海鲸可视化软件的开发者&#xff0c;我们对这两者都有深入的了解。在此&#xff0c;我们将详细探讨数字孪生与VR的区别和联系。 首先&#xff0c;数字孪生&#xff08;Digital Twin&#xff09;…

洛谷——P1983 [NOIP2013 普及组] 车站分级(拓扑排序、c++)

文章目录 一、题目[NOIP2013 普及组] 车站分级题目背景题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 样例 #2样例输入 #2样例输出 #2 提示 二、题解基本思路&#xff1a;代码 一、题目 [NOIP2013 普及组] 车站分级 题目背景 NOIP2013 普及组 T4 题目描述 一条单…

美年大健康黄伟:从选型到迁移,一个月升级核心数据库

核心生产系统的数据库&#xff0c;从接到替换需求到完成分布式升级&#xff0c;需要多久&#xff1f;一个月&#xff0c;这是美年大健康的回答。一个月集中调配各种资源&#xff0c;美年大健康完成了应用程序基本零改造的平滑迁移&#xff0c;新数据库在成本更低的前提下&#…

【Android】自定义View组件,并实现在 Compose、Kotlin、Xml 中调用

从事 Android 开发以来&#xff0c;很少有过自定义 View 的相关开发需求&#xff0c;大部分 UI 都是可以集成某些官方组件&#xff0c;在组件的基础上完成能够大大缩短开发时间。但今天我要讲的是&#xff1a;如何使用 Android 开发一个Compose、Xml都可以调用的组件&#xff1…

Vue中break关键字

Change() {//每次触发该事件&#xff0c;都要讲data重新赋值一次this.data JSON.parse(JSON.stringify(this.data1));// 根据选中的等级更新数据switch (this.selectedlevel) {case 1:// 更新数据为一级数据this.data this.data.filter(item > item.level "1"…

架构(1)

目录 1.如何理解架构的演进&#xff1f; 2.如何理解架构的服务化趋势&#xff1f; 3.架构中有哪些技术点&#xff1f; 4.谈谈架构中的缓存应用&#xff1f; 5.在开发中缓存具体如何实现&#xff1f; 1.如何理解架构的演进&#xff1f; 初始阶段的网站架构应用服务和数据服…

2024年1月6日 十二生肖 今日运势

小运播报&#xff1a;2024年1月6日&#xff0c;星期六&#xff0c;农历十一月廿五 &#xff08;癸卯年乙丑月己巳日&#xff09;&#xff0c;法定节假日。 红榜生肖&#xff1a;牛、猴、鸡 需要注意&#xff1a;鼠、虎、猪 喜神方位&#xff1a;东北方 财神方位&#xff1a…

【2024最新版】Win11基础配置操作(磁盘分区、修改各种默认存储位置、安装软件操作)【释放C盘空间】

文章目录 一、硬盘分区0. 磁盘管理1. 压缩卷2. 新建简单卷向导 二、修改默认存储位置1. 保持新内容的地方a. 位置b. 操作 2. 快速访问六件套a. 位置b. 操作 三、安装软件0. 应用商店设置a. 设置中心b. 修改下载设置 1. 微信电脑版设置a. 下载b. 安装c. 聊天记录迁移与备份d. 存…

MySQL-DCL

DCL是数据控制语言&#xff0c;用来管理数据库用户&#xff0c;控制数据库的访问权限。 管理用户&#xff1a;管理哪些用户可以访问哪些数据库 1.查询用户 USE mysql; SELECT * FROM user; 注意&#xff1a; MySQL中用户信息和用户的权限信息都是记录在mysql数据库的user表中的…

Vue入门一(前端发展史|Vue介绍|Vue插值语法|Vue指令|style与class使用|条件渲染)

文章目录 一、前端的发展史二、Vue介绍 和 基本使用1) Vue介绍2) Vue特点3) M-V-VM思想1.MVVM介绍2.MVVM的特性3.MVVM逻辑 4) 组件化开发、单页面开发组件化开发单页面开发 5) 引入方式6) 补充解释型的语言是需要解释器的 nodejs&#xff1a;一门后端语言7) 快速使用 三、Vue之…

力扣1944.队列中可以看到的人数--单调栈

思路&#xff1a; 由题知一个人能 看到 他右边另一个人的条件是这两人之间的所有人都比他们两人 矮 &#xff0c;也就是说&#xff0c;在自己右边第一个比自己高的人后面的人就肯定看不到了那么只需要找到右边第一个比自己高的人与自己之间的所有满足要求的人就行了&#xff0…

PyTorch|一次画一批图像

想想这样一个场景&#xff0c;我们训练了一个神经网络&#xff0c;输入一些信息&#xff0c;这个网络可以根据信息为我们生成相关图片。 这些图片并不是一张&#xff0c;而是多张&#xff0c;我们想把这些图片一次全部显示出来&#xff0c;而不是一张一张的显示&#xff08;这…

CSS 缩小旋转动画

<template><div class="container" @mouseenter="startAnimation" @mouseleave="stopAnimation"><!-- 旋方块 --><div class="box" :class="{ rotate-scale-down: isAnimating }"><!-- 元素内容…

Linux 进程(十) 进程替换

用fork创建子进程后执行的是和父进程相同的程序(但有可能执行不同的代码分支),子进程往往要调用一种exec*函数以执行另一个程序。当进程调用一种exec*函数时,该进程的用户空间代码和数据完全被新程序替换,从新程序的启动例程开始执行。调用exec*并不创建新进程,所以调用exec*前…

stable diffusion 人物高级提示词(四)朝向、画面范围、远近、焦距、机位、拍摄角度

一、朝向 英文中文front view正面Profile view / from side侧面half-front view半正面Back view背面(quarter front view:1.5)四分之一正面 prompt/英文中文翻译looking at the camera看向镜头facing the camera面对镜头turned towards the camera转向镜头looking away from …

c语言题目之统计二级制数中1的个数

文章目录 题目一、方法1二、方法2三&#xff0c;方法3总结 题目 统计二进制数中1的个数 输入一行&#xff0c;输出一行 输入&#xff1a; 输入一个整数 输出&#xff1a; 输出存储在内存中二进制的1的个数 一、方法1 之前的文章中&#xff0c;小编写了有关于内存在二进制中的存…

基于YOLOv7算法的高精度实时安全背心目标检测识别系统(PyTorch+Pyside6+YOLOv7)

摘要&#xff1a;基于YOLOv7算法的高精度实时安全背心目标检测系统可用于日常生活中检测与定位安全背心&#xff0c;此系统可完成对输入图片、视频、文件夹以及摄像头方式的目标检测与识别&#xff0c;同时本系统还支持检测结果可视化与导出。本系统采用YOLOv7目标检测算法来训…