zookeeper选举机制

全新集群选举

zookeeper 全新集群选举机制网上资料很多说法很模糊,仔细思考了一下,应该是这样

得到票数最多的机器>机器总数半数

具体启动过程中的哪个节点成为 leader 与 zoo.cfg 中配置的节点数有关,下面以3个举例

选举过程如下

  1. server1 启动,给自己投票,然后群发投票信息,由于其他 server 没有启动,所有收不到任何反馈信息,状态处于 LOOKING
  2. server2 启动,给自己投票,由于myid文件内容比server1的大,自己得票两票,机器总数半数是1.5,符合上面的规则所以胜出,server2 成为 leader,server1 成为 follower
  3. server3 启动,给自己投票,由于myid文件内容比server2的大,自己得票三票,机器总数半数是1.5,符合上面的规则,但是 leader 已经有了,所以只能成为 follower(有点委屈,有点类似于国内结婚每个男人只有一个老婆,哈哈哈)

机器总数对应在 zoo.cfg 中配置如下形式配置节点信息

server.X=A:B:C

X 代表当前机器在整个架构中的序号,是整数

A 代表第X个节点的ip地址

B 代表第X个节点与 leader 节点交换信息的端口

C 表示万一 leader 节点宕机,需要C这个端口在多个 follower 之间进行选举,选出一个新的 leader,用来进行选举时节点之间相互通信的端口

集群节点数量计算公式

y=2x+1,x为正整数,y为节点数

为什么是奇数?之前写过一篇文章

redis集群最少使用三个主节点和使用16384个槽以及主节点数量不超过1000的原因_zlpzlpzyd的博客-CSDN博客

很多说法是按照5个节点来讲的,按照公式来讲三个应该可以。

下面就来试一下

在自己的机器上安装 zookeeper

三个节点

分别为 master、node1、node2

zoo.cfg

sudo tee conf/zoo.cfg <<-'EOF'
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/opt/zookeeper
clientPort=2181
server.1=master:2888:3888
server.2=node1:2888:3888
server.3=node2:2888:3888
EOF

各个节点的 zoo.cfg 文件内容一致。各个节点 dataDir 中文件 myid 内容如下。

master

echo 1 > /opt/zookeeper/myid

node1

echo 2 > /opt/zookeeper/myid

node2

echo 3 > /opt/zookeeper/myid

启动 zookeeper

先启动两个节点,看看情况

[root@master apache-zookeeper-3.9.0-bin]# ./bin/zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /opt/apache-zookeeper-3.9.0-bin/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
[root@node1 apache-zookeeper-3.9.0-bin]# ./bin/zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /opt/apache-zookeeper-3.9.0-bin/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED

节点状态

[root@master apache-zookeeper-3.9.0-bin]# ./bin/zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /opt/apache-zookeeper-3.9.0-bin/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost. Client SSL: false.
Mode: follower
[root@node1 apache-zookeeper-3.9.0-bin]# ./bin/zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /opt/apache-zookeeper-3.9.0-bin/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost. Client SSL: false.
Mode: leader

配置了三个节点,只启动了两个节点的情况下,正常选举,符合想法。说明3个节点中有两个节点启动就可以完成选举流程。

下面再启动 node2

[root@node2 apache-zookeeper-3.9.0-bin]# ./bin/zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /opt/apache-zookeeper-3.9.0-bin/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
[root@node2 apache-zookeeper-3.9.0-bin]# ./bin/zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /opt/apache-zookeeper-3.9.0-bin/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost. Client SSL: false.
Mode: follower

符合上面的推测

突发奇想,两个节点会是什么情况?

个人猜测,跟上面两个节点启动一致。

两个节点

分别为 master、node1

zoo.cfg

sudo tee conf/zoo.cfg <<-'EOF'
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/opt/zookeeper
clientPort=2181
server.1=master:2888:3888
server.2=node1:2888:3888
server.3=node2:2888:3888
EOF

各个节点的 zoo.cfg 文件内容一致。

启动 zookeeper

[root@master apache-zookeeper-3.9.0-bin]# ./bin/zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /opt/apache-zookeeper-3.9.0-bin/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
[root@node1 apache-zookeeper-3.9.0-bin]# ./bin/zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /opt/apache-zookeeper-3.9.0-bin/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED

节点状态

[root@master apache-zookeeper-3.9.0-bin]# ./bin/zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /opt/apache-zookeeper-3.9.0-bin/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost. Client SSL: false.
Mode: follower
[root@node1 apache-zookeeper-3.9.0-bin]# ./bin/zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /opt/apache-zookeeper-3.9.0-bin/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost. Client SSL: false.
Mode: leader

最终结果如上面猜测。

为什么最少三个节点?

去看一下官方文档

ZooKeeper: Because Coordinating Distributed Systems is a Zoo

For replicated mode, a minimum of three servers are required, and it is strongly recommended that you have an odd number of servers. If you only have two servers, then you are in a situation where if one of them fails, there are not enough machines to form a majority quorum. Two servers are inherently less stable than a single server, because there are two single points of failure.

对于集群节点,最少的 server 数量是三个, 强烈建议是奇数。如果是两个 server,当其中一个节点有故障,没有足够的机器进行优先级处理。

符合上面的最少三个节点的理论。

非全新集群选举

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

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

相关文章

tailscale自建headscale和derp中继

tailscale derp中继服务简介 tailscale是一个基于WireGuard的零配置软件&#xff0c;它可以轻松地在多台设备之间建立点对点加密连接。 derp服务器是tailscale网络的重要组成部分。它作为tailscale客户端之间的中继,帮助客户端找到并连接到其他客户端设备。 但Tailscale 官方…

微信小程序wxs标签 在wxml文件中编写JavaScript逻辑

PC端开发 可以在界面中编写JavaScript脚本 vue/react这些框架更是形成了一种常态 因为模板引擎和jsx语法本身就都是在js中的 我们小程序中其实也有类似的奇妙写法 不过先声明 这东西不是很强大 我们可以先写一个案例代码 wxml代码参考 <view><wxs module"wordSt…

MySQL命令行中文乱码问题

MySQL命令行中文乱码问题&#xff1a; 命令行界面默认字符集是gbk&#xff0c;若字符集不匹配会中文乱码或无法插入中文。 解决办法&#xff1a;执行set names gbk; 验证&#xff1a; 执行命令show variables like ‘char%’;查看默认字符集。 创建数据库设置字符集utf8&…

自动驾驶:未来的道路上的挑战与机遇

自动驾驶&#xff1a;未来的道路上的挑战与机遇 文章目录 引言安全与道路事故的减少交通拥堵的缓解城市规划的变革技术和法律挑战结语 2023星火培训【专项营】Apollo开发者社区布道师倾力打造&#xff0c;包含PnC、新感知等的全新专项课程上线了。理论与实践相结合&#xff0c;…

1.3.2有理数减法(第一课时)作业设计

【学习目标】 1&#xff0e;理解有理数减法法则&#xff0c;能熟练地进行有理数的减法运算&#xff0e; 2&#xff0e;感受有理数减法与加法对立统一的辨证思想&#xff0c;体会转化的思想方法&#xff0e;

请问python如何处理url带有“?”参数的接口?

在Python中处理带有"?"参数的URL接口&#xff0c;可以使用urllib.parse库中的urlencode()函数来进行编码。以下是一些示例代码 from urllib.parse import urlencodeparams {name: John, age: 25} url http://example.com? urlencode(params) print(url) 这个代…

泛微OA e-office平台uploadify.php任意文件上传漏洞

泛微OA e-office平台uploadify.php任意文件上传漏洞复现 0x01 前言 免责声明&#xff1a;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;所产生的…

NAT模式和桥接模式的区别

NAT模式和桥接模式的区别 NAT模式和桥接模式都是虚拟机网络配置的两种方式&#xff0c;主要区别在于虚拟机与外部网络交互的方式不同。 NAT&#xff08;Network Address Translation&#xff0c;网络地址转换&#xff09;模式&#xff1a;在这种模式下&#xff0c;虚拟机和宿主…

爬虫编程语言

文章目录 基本数据类型bytes类型python数据类型转换 python运算符python数字数学函数随机数函数三角函数数字常量 python字符串python访问字符串中的值python字符串更新python转义字符python字符串运算符python字符串格式化f-stringUnicode字符串python的字符串内建函数 python…

【轻松玩转MacOS】外部设备篇

引言 在开始之前&#xff0c;我们先来了解一下为什么要连接外部设备。想象一下&#xff0c;你正在享受MacOS带来的便捷和高效&#xff0c;突然需要打印一份文件&#xff0c;但你发现打印机无法连接&#xff1b;或者你需要将手机投屏到电脑上&#xff0c;却不知道该如何操作。这…

Docker搭建MySQL8.0主从复制(一主一从)

0. 配置说明 宿主机使用的版本为19045的win10专业版&#xff0c;MySQL使用的是8.0&#xff0c;Docker容器使用Linux。 1. 安装Docker Desktop 略 修改Docker默认安装路径 安装包自己就提供了修改安装路径的功能&#xff0c;CMD中运行&#xff1a; “Docker Desktop Installe…

【网络安全-信息收集】网络安全之信息收集和信息收集工具讲解(提供工具)

工具下载百度网盘链接(包含所有用到的工具&#xff09;&#xff1a; 百度网盘 请输入提取码百度网盘为您提供文件的网络备份、同步和分享服务。空间大、速度快、安全稳固&#xff0c;支持教育网加速&#xff0c;支持手机端。注册使用百度网盘即可享受免费存储空间https://pan.…

HDLbits: ece241 2014 q4

module top_module (input clk,input x,output z ); reg [2:0] Q;always(posedge clk)beginQ[0] < Q[0] ^ x;Q[1] < (~Q[1]) & x;Q[2] < (~Q[2]) | x;z < ~(| Q[2:0]); //错误&#xff01;&#xff01;&#xff01;&#xff01;endendmodule 正确答案&#xf…

10.07hw

int main() {string str;cout << "输入字符串:";getline(cin,str);int size str.size();int big 0;int small 0;int num 0;int space 0;int other 0;for(int i0;i<size;i){if(str[i]<Z&&str[i]>A){big;}else if(str[i]<z&&st…

透明度和透明贴图制作玻璃水杯

1、什么是透明度 模型透明度是指一个物体或模型在呈现时的透明程度。它决定了物体在渲染时&#xff0c;是否显示其后面的物体或背景。 在图形渲染中&#xff0c;透明度通常以0到1之间的值表示。值为0表示完全透明&#xff0c;即物体不可见&#xff0c;背景或其他物体完全穿透…

RabbitMQ-网页使用消息队列

1.使用消息队列 几种模式 从最简单的开始 添加完新的虚拟机可以看到&#xff0c;当前admin用户的主机访问权限中新增的刚添加的环境 1.1查看交换机 交换机列表中自动新增了刚创建好的虚拟主机相关的预设交换机。一共7个。前面两个 direct类型的交换机&#xff0c;一个是…

MongoDB——window11安装mongodb5.0.21版本服务端(图解版)

目录 一、mongodb官网下载地址二、安装步骤三、配置环境变量四、运行mongodb 一、mongodb官网下载地址 mongodb官网下载地址&#xff1a;https://www.mongodb.com/try/download/community 二、安装步骤 双击运行下载好的mongodb-windows-x86_64-5.0.21-signed.msi安装包&am…

【群智能算法改进】一种改进的光学显微镜算法 IOMA算法[1]【Matlab代码#60】

文章目录 【获取资源请见文章第5节&#xff1a;资源获取】1. 光学显微镜算法&#xff08;OMA&#xff09;1.1 物镜放大倍数1.2 目镜放大倍数 2. 改进后的IOMA算法2.1 透镜成像折射方向学习 3. 部分代码展示4. 仿真结果展示5. 资源获取说明 【获取资源请见文章第5节&#xff1a;…

【MySQL】视图特性

目录 MySQL视图特性 基本使用 准备测试表 创建视图 修改视图影响基表 修改基表影响视图 删除视图 视图规则和限制 MySQL视图特性 视图的概念 视图是一个虚拟表&#xff0c;其内容由查询定义&#xff0c;同真实的表一样&#xff0c;视图包含一系列带有名称的列和行数据。…

【傅里叶梅林图像配准】用于图像配准的傅里叶梅林相位相关性的实现(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…