Java开发从入门到精通(一):ZK 集群的部署

ZK 集群的部署

server.<节点ID>=:<数据同步端口>:<选举端口>
节点 ID:为 1 到 125 之间的数字,写到对应服务节点的{dataDir}/myid 文件中。
IP 地址:节点的远程 IP 地址,可以相同,生产环境建议用不同的机器,否则无法达到容错的目的。
数据同步端口:主从同步时数据复制端口。
选举端口:主从节点选举端口。
3 个 zookeeper 节点,要编写 3 份 config 配置,分别放在不同的服务器上。

集群配置

server.1=192.168.1.1:2888:3888
server.2=192.168.1.2:2888:3888
server.3=192.168.1.3:2888:3888
其中 dataDir 参数指定的是一个目录,用来存放 zk 的数据,里面有个文件 myid,3 台机器上 myid 文件里面分别存放 1,2,3,对应各自节点 ID。

配置好 3 个配置文件后,分别启动。

./bin/zkServer.sh start conf/zoo.cfg
ZK 集群中的角色
leader 主节点,又名领导者。用于写入数据,通过选举产生,如果宕机将会选举新的主节点。
observer 的配置,只要在集群配置中加上 observer 后缀即可,示例如下:

server.3=127.0.0.1:2883:3883:observer
其中 leader 只有一个,剩下的都是 follower 和 observer,但是我们一般生产上不会配置 observer,因为 observer 并没有选举权。除此之外,它和 follower 的功能是一样的。

什么时候需要用到 observer 呢,因为 zk 一般读的请求会大于写。当整个集群压力过大时,可以增加几个 observer 来获得性能的提升。在不需要的时候的时候,可以随时撤掉 observer。

zk 进行连接时,一般我们都会把 zk 所有的节点都配置上去,用逗号分隔。

如何查看 ZK 集群中的角色
./bin/zkServer.sh status conf/zoo.cfg
ZK 集群的选举机制
服务器启动或者服务器运行期间(Leader挂了),都会进入Leader选举。假设现在ZooKeeper集群有五台服务器,它们myid分别是服务器1、2、3、4、5,如图:

服务器启动的Leader选举
zookeeper集群初始化阶段,服务器(myid=1-5)依次启动,开始zookeeper选举Leader~

服务器1(myid=1)启动,当前只有一台服务器,无法完成Leader选举
服务器2(myid=2)启动,此时两台服务器能够相互通讯,开始进入Leader选举阶段
2.1. 每个服务器发出一个投票
服务器1和服务器2都将自己作为Leader服务器进行投票,投票的基本元素包括:服务器的myid和ZXID,我们以(myid,ZXID)形式表示。初始阶段,服务器1和服务器2都会投给自己,即服务器1的投票为(1,0),服务器2的投票为(2,0),然后各自将这个投票发给集群中的其他所有机器。
2.2 接受来自各个服务器的投票
每个服务器都会接受来自其他服务器的投票。同时,服务器会校验投票的有效性,是否本轮投票、是否来自LOOKING状态的服务器。
2.3. 处理投票
收到其他服务器的投票,会将被人的投票跟自己的投票PK,PK规则如下:
优先检查ZXID。ZXID比较大的服务器优先作为leader。
如果ZXID相同的话,就比较myid,myid比较大的服务器作为leader。

服务器1的投票是(1,0),它收到投票是(2,0),两者zxid都是0,因为收到的myid=2,大于自己的myid=1,所以它更新自己的投票为(2,0),然后重新将投票发出去。对于服务器2呢,即不再需要更新自己的投票,把上一次的投票信息发出即可。
2.4. 统计投票
每次投票后,服务器会统计所有投票,判断是否有过半的机器接受到相同的投票信息。服务器2收到两票,少于3(n/2+1,n为总服务器),所以继续保持LOOKING状态
服务器3(myid=3)启动,继续进入Leader选举阶段
3.1 跟前面流程一致,服务器1和2先投自己一票,因为服务器3的myid最大,所以大家把票改投给它。此时,服务器为3票(大于等于n/2+1),所以服务器3当选为Leader。服务器1,2更改状态为FOLLOWING,服务器3更改状态为LEADING;
服务器4启动,发起一次选举。
4.1 此时服务器1,2,3已经不是LOOKING状态,不会更改选票信息。选票信息结果:服务器3为3票,服务器4为1票。服务器4并更改状态为FOLLOWING;
服务器5启动,发起一次选举。
同理,服务器也是把票投给服务器3,服务器5并更改状态为FOLLOWING;
投票结束,服务器3当选为Leader
服务器运行期间的Leader选举
zookeeper集群的五台服务器(myid=1-5)正在运行中,突然某个瞬间,Leader服务器3挂了,这时候便开始Leader选举~

变更状态
Leader 服务器挂了之后,余下的非Observer服务器都会把自己的服务器状态更改为LOOKING,然后开始进入Leader选举流程。
每个服务器发起投票
每个服务器都把票投给自己,因为是运行期间,所以每台服务器的ZXID可能不相同。假设服务1,2,4,5的zxid分别为333,666,999,888,则分别产生投票(1,333),(2,666),(4,999)和(5,888),然后各自将这个投票发给集群中的其他所有机器。
接受来自各个服务器的投票
处理投票
投票规则是跟Zookeeper集群启动期间一致的,优先检查ZXID,大的优先作为Leader,所以显然服务器zxid=999具有优先权。
统计投票
改变服务器状态
ZK 集群的数据同步机制
大致分为 2 个流程:

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

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

相关文章

突破编程_C++_设计模式(享元模式)

1 享元模式的基本概念 享元模式&#xff08;Flyweight Pattern&#xff09;是一种主要用于减少创建对象的数量&#xff0c;以减少内存占用和提高性能的设计模式。它通过使用共享对象来支持大量的细粒度对象&#xff0c;从而减少了内存占用。在享元模式中&#xff0c;有些对象可…

【io.net】问题汇总

【io.net】问题汇总 大家最近挖挖的如火如荼&#xff0c;可是不论是社区活动积分和参与挖矿积分&#xff0c;大家遇到了很多类似问题&#xff0c;重复解决。 因此我这里整理了一下常见的相关问题&#xff0c;大家可以一站式找到解决方案。解决方案主要分为运营和挖矿两个两面…

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的障碍物检测系统(Python+PySide6界面+训练代码)

摘要&#xff1a;开发障碍物检测系统对于道路安全性具有关键作用。本篇博客详细介绍了如何运用深度学习构建一个障碍物检测系统&#xff0c;并提供了完整的实现代码。该系统基于强大的YOLOv8算法&#xff0c;并对比了YOLOv7、YOLOv6、YOLOv5&#xff0c;展示了不同模型间的性能…

如何解决由触发器导致 MySQL 内存溢出?

由触发器导致得 OOM 案例分析过程和解决方式。 作者&#xff1a;龚唐杰&#xff0c;爱可生 DBA 团队成员&#xff0c;主要负责 MySQL 技术支持&#xff0c;擅长 MySQL、PG、国产数据库。 爱可生开源社区出品&#xff0c;原创内容未经授权不得随意使用&#xff0c;转载请联系小编…

JavaScript 面试题

问题 1 // 请解释下面代码的输出结果 console.log(1 "2" "2"); console.log(1 "2" "2"); console.log(1 -"1" "2"); console.log("A" - "B" "2"); console.log(&qu…

零基础学习JS--基础篇--使用对象

JavaScript 的设计是一个简单的基于对象的范式。一个对象就是一系列属性的集合&#xff0c;一个属性包含一个名和一个值。一个属性的值可以是函数&#xff0c;这种情况下属性也被称为方法。除了浏览器里面预定义的那些对象之外&#xff0c;你也可以定义你自己的对象。本章节讲述…

苹果cms模板保护设置,防止被扒

苹果cms模板保护设置&#xff0c;防止被扒 如今互联网时代&#xff0c;网站模板前端被扒是常有的事&#xff0c;如何防止模板数据被扒&#xff1f; 保护设置方法&#xff1a; 登录宝塔 找到安装模板的网站 设置禁止访问文件 方法参考截图后缀填&#xff1a;php|html 目录填&a…

OA系统中的九大常用审批场景,你都晓得吗?

Hi&#xff0c;我是贝格前端工场&#xff0c;今天继续来剖析OA的功能&#xff0c;这次重点分析审批功能&#xff0c;欢迎老铁们点赞评论转发。 一、OA的审批功能和流程 OA的审批功能是指在办公自动化系统中&#xff0c;通过电子化的方式实现对各种申请、请求或业务流程的审批管…

项目管理工具及模板(甘特图、OKR周报、任务管理、头脑风暴等)

项目管理常用模板大全&#xff1a; 1. 项目组OKR周报 2. 项目组传统周报工作法 3. 项目甘特图 4. 团队名单 5. 招聘跟进表 6. 出勤统计 7. 年度工作日历 8. 项目工作年计划 9. 版本排期 10. 项目组任务管理 11. 项目规划模板 12. 产品分析报告 13. 头脑风暴 信息化项目建设全套…

阻塞队列学习

1、什么是阻塞队列&#xff1f; 顾名思义&#xff0c;就是支持阻塞的队列&#xff0c;相比于其他的队列&#xff0c;阻塞队列支持以下特性&#xff1a; 队列为空的时候&#xff0c;获取元素的线程会等待队列变为非空。队列为满的时候&#xff0c;存储元素的线程会等待队列可以…

Python 单元测试

本篇为Python的单元测试的方法及示例 目录 概念 结果 示例 对函数进行测试 创建函数文件 创建测试文件 测试结果 对类进行测试 创建待测试类 创建测试文件 文档测试 创建函数 进行测试 总结 概念 用来对一个函数、一个类或者一个模块来进行正确性校验工作 结果 …

提取B站视频教程详情

提取B站视频教程详情 背景 B站这个视频列表是真的体验感太差了,有时候想把章节复制下来,再对应的章节下面做笔记,实在是太难搞了,于是就有了这篇文文章 根据关键字获取视频id Test public void list() {String url "https://api.bilibili.com/x/web-interface/wbi/sea…

虚拟机(KVM)克隆

当需要批量部署虚拟机时&#xff0c;可以使用克隆虚拟机的方式来进行。 使用图形界面来克隆虚拟机。 [rootzhoujunru_node1 zhou]# virsh list --allId Name State ------------------------------ vm01 shut off- vm01-clone shut off克隆完成。

Django入门 整体流程跑通

Django学习笔记 一、Django整体流程跑通 1.1安装 pip install django //安装 import django //在python环境中导入django django.get_version() //获取版本号&#xff0c;如果能获取到&#xff0c;说明安装成功Django目录结构 Python310-Scripts\django-admi…

Centos7 安装mongodb 7.0

官方手册参考&#xff1a; https://www.mongodb.com/docs/manual/tutorial/install-mongodb-on-red-hat/ Mongodb支持的版本 安装 MongoDB 社区版 按照以下步骤使用包管理器安装 MongoDB Community Edition yum。 配置包管理系统 ( yum) 创建一个/etc/yum.repos.d/mongodb-o…

Mabatis缓存详细介绍

MyBatis缓存分为一级缓存和二级缓存&#xff0c;是 MyBatis 中用于提高性能的两种缓存机制。 一级缓存 定义&#xff1a; 一级缓存指的是在同一个 SqlSession 中执行相同的查询语句时&#xff0c;第二次及后续的查询会直接从内存中获取结果&#xff0c;而不需要再次查询数据库…

容量治理三板斧:扩容、限流与降级

前言 随着现代软件系统日益复杂和用户规模的不断增长&#xff0c;分布式架构成为了保持系统高可用性与高性能的标准解决方案。然而&#xff0c;随之而来的是对系统容量治理的新挑战。在这样的背景下&#xff0c;容量治理成为了分布式系统设计和运维中不可或缺的一环。要确保系…

Python 主线任务之列表和操作列表,知其然知其所以然【玩转Python】

主线任务 主线任务之数据类型已进行66.6%&#xff0c;今日主线任务为“列表和操作列表”的了解和掌握。了解“列表”是什么的同时也不要忽略“怎么用”。即"知其然知其所以然"&#xff0c;方能达到学习的更优效果。 接下来让我们一起开启今日份的Python的主线任务。…

Orange3数据预处理(转换器组件)

该组件接收数据&#xff0c;然后重新应用之前在模板数据上执行的转换。 这些转换包括选择变量的子集以及从数据中出现的其他变量计算新的变量&#xff0c; 例如&#xff0c;离散化、特征构建、主成分分析&#xff08;PCA&#xff09;等。 在Orange3中&#xff0c;描述的这个组件…

php运行报错: Class ‘SimpleXMLElement‘ not found in

前言 CentOS7php 8.1.27CentOS7 利用remi yum源安装php8.1 php运行报错&#xff1a; Class ‘SimpleXMLElement’ not found in [12-Mar-2024 05:47:29 UTC] PHP Warning: Undefined array key "token" in /data/www/a.php on line 3 [12-Mar-2024 05:47:29 UTC]…