ZooKeeper集群服务器启动

news2024/11/19 13:40:18

在本文中,我们将对集群版ZooKeeper服务器的启动过程做详细讲解。集群和单机ZooKeeper服务器的启动过程在很多地方都是一致的,因此本节只会对有差异的地方展开进行讲解。下图所示是集群版ZooKeeper服务器的启动流程图。

 

预启动

预启动的步骤如下。

(1)统一由QuorumPeerMain作为启动类。

(2)解析配置文件zoo.cfg。

(3)创建并启动历史文件清理器DatadirCleanupManager。

(4)判断当前是集群模式还是单机模式的启动。

在集群模式中,由于已经在zoo.cfg中配置了多个服务器地址,因此此处选择集群模式启动ZooKeeper。

初始化

初始化的步骤如下。

(1)创建ServerCnxnFactory。

(2)初始化ServerCnxnFactory。

(3)创建ZooKeeper数据管理器FileTxnSnapLog。

(4)创建QuorumPeer实例。

Quorum是集群模式下特有的对象,是ZooKeeper服务器实例(ZooKeeperServer)的托管者,从集群层面看,QuorumPeer代表了ZooKeeper集群中的一台机器。在运行期间,QuorumPeer会不断检测当前服务器实例的运行状态,同时根据情况发起Leader选举。

(5)创建内存数据库ZKDatabase。

ZKDatabase是ZooKeeper的内存数据库,负责管理ZooKeeper的所有会话记录以及DataTree和事务日志的存储。

(6)初始化QuorumPeer。

在步骤5中我们已经提到,QuorumPeer是ZooKeeperServer的托管者,因此需要将一些核心组件注册到QuorumPeer中去,包括FileTxnSnapLog、ServerCnxnFactory和ZKDatabase。同时ZooKeeper还会对QuorumPeer配置一些参数,包括服务器地址列表、Leader选举算法和会话超时时间限制等。

(7)恢复本地数据。

(8)启动ServerCnxnFactory主线程。

Leader选举

Leader选举的步骤如下。

(1)初始化Leader选举。

Leader选举可以说是集群和单机模式启动ZooKeeper最大的不同点。ZooKeeper首先会根据自身的SID (服务器ID)、lastLoggedZxid (最新的ZXID)和当前的服务器epoch(currentEpoch)来生成一个初始化的投票一简单地讲,在初始化过程中,每个服务器都会给自己投票。

然后,ZooKeeper会根据zoo.cfg中的配置,创建相应的Leader选举算法实现。在ZooKeeper中,默认提供了三种Leader选举算法的实现,分别是LeaderElection、AuthFastLeaderElection和FastLeaderElection,可以通过在配置文件(zoo.cfg)中使用electionAlg属性来指定,分别使用数字0~3来表示。从3.4.0版本开始,ZooKeeper废弃了前两种Leader选举算法,只支持FastLeaderElection选举算法了。

在初始化阶段,ZooKeeper会首先创建Leader选举所需的网络I/O层QuorumCnxManager,

同时启动对Leader选举端口的监听,等待集群中其他服务器创建连接。

(2)注册JMX服务。

(3)检测当前服务器状态。

在上文中,我们已经提到QuorumPeer是ZooKeeper服务器实例的托管者,在运行期间,QuorumPeer的核心工作就是不断地检测当前服务器的状态,并做出相应的处理。在正常情况下,ZooKeeper 服务器的状态在LOOKING、LEADING和FOLLOWING/OBSERVING之间进行切换。而在启动阶段,QuorumPeer的初始状态是LOOKING,因此开始进行Leader选举。

(4)Leader选举:

ZooKeeper的Leader选举过程,简单地讲,就是一个集群中所有的机器相互之间进行一系列投票,选举产生最合适的机器成为Leader,同时其余机器成为Follower或是Observer的集群机器角色初始化过程。关于Leader选举算法,简而言之,就是集群中哪个机器处理的数据越新(通常我们根据每个服务器处理过的最大ZXID来比较确定其数据是否更新),其越有可能成为Leader。当然,如果集群中的所有机器处理的ZXID一致的话,那么SID最大的服务器成为Leader。

Leader和Follower启动期交互过程

到这里为止,ZooKeeper已经完成了Leader选举,并且集群中每个服务器都已经确定了自己的角色一通常情况下就分为Leader 和Follower两种角色。下面我们来对Leader和Follower在启动期间的工作原理进行讲解,其大致交互流程如下图所示。

 

Leader和Follower服务器启动期交互过程包括如下步骤。

(1)创建Leader服务器和Follower服务器。

完成Leader选举之后,每个服务器都会根据自己的服务器角色创建相应的服务器实例,并开始进入各自角色的主流程。

(2)Leader服务器启动Follower接收器LearnerCnxAcceptor。

在ZooKeeper集群运行期间,Leader 服务器需要和所有其余的服务器(本文余下部分,我们使用“Learner”来指代这类机器)保持连接以确定集群的机器存活情况。LearnerCnxAcceptor接收器用于负责接收所有非Leader服务器的连接请求。

(3)Learner服务器开始和Leader建立连接。

所有的Learner服务器在启动完毕后,会从Leader选举的投票结果中找到当前集群中的Leader服务器,然后与其建立连接。

(4)Leader服务器创建LearnerHandler。

Leader接收到来自其他机器的连接创建请求后,会创建一个LearnerHandler实例。每个LearnerHandler实例都对应了一个Leader与Learner服务器之间的连接,其负责Leader和Learner服务器之间几乎所有的消息通信和数据同步。

(5)向Leader注册。

当和Leader建立起连接后,Learner就会开始向Leader进行注册一所谓的注册,其实就是将Learner 服务器自己的基本信息发送给Leader 服务器,我们称之为LearnerInfo,包括当前服务器的SID和服务器处理的最新的ZXID。

(6)Leader解析Learner信息,计算新的epoch。

Leader服务器在接收到Learner的基本信息后,会解析出该Learner的SID和ZXID,然后根据该Learner的ZXID解析出其对应的epoch_of_learner,和当前Leader服务器的epoch_of_leader进行比较,如果该Learner的epoch_of_learner更大的话,那么就更新Leader的epoch:

epoch_of_leader = epoch_of_learner + 1

然后,LearnerHandler会进行等待,直到过半的Learner已经向Leader 进行了注册,同时更新了epoch_of_leader之后,Leader就可以确定当前集群的epoch了。

(7)发送Leader状态。

计算出新的epoch之后,Leader会将该信息以一个LEADERINFO消息的形式发送给Learner,同时等待Learner的响应。

(8)Learner发送ACK消息。

Follower在收到来自Leader的LEADERINFO消息后,会解析出epoch和ZXID,然后向Leader反馈一个ACKEPOCH响应。

(9)数据同步。

Leader服务器接收到Learner的这个ACK消息后,就可以开始与其进行数据同步了。

(10)启动Leader和Learner服务器。

当有过半的Learner已经完成了数据同步,那么Leader和Learner服务器实例就可以开始启动了。

Leader和Follower启动

Leader和Follower启动的步骤如下。

(1)创建并启动会话管理器。

(2)初始化ZooKeeper的请求处理链。

和单机版服务器一样,集群模式下,每个服务器都会在启动阶段串联请求处理链,只是根据服务器角色不同,会有不同的请求处理链路。

(3)注册JMX服务。

至此,集群ZooKeeper服务器启动完毕。

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

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

相关文章

财报解读:上半年业绩实现增长,药师帮业务飞轮已经开始旋转?

今年6月底登陆港股的药师帮,近日发布了上市后的首份财务报告。 财报显示,2023年上半年,药师帮实现营收增长、经调整后净利润转正的成果,再次验证了二级市场对于其发展潜力的看好——6月底上市以来,药师帮股价涨幅接近…

Mybatis的学习笔记(IDEA快捷键,参数占位符,转义符)

一、IDEA快捷键: IDEA多行注释:ctrlShift/ 单行注释:ctrl/ 导入包,自动修正代码:altenter 自动生成代码:altinsert 二、Mybatis重要知识点: 2.1 参数占位符 一共分为2种:#{}和…

idea2023 springboot+mybatis+jsp 初学单表增删改查

创建项目 因为2.7.14使用量较少,特更改spring-boot为2.7.5版本 配置端口号 打开Sm01Application类,右键运行启动项目,或者按照如下箭头启动 启动后,控制台提示如下信息表示成功 此刻在浏览器中输入:http://lo…

盘点市面上的ipad协议对比

友情链接 geweapi.com 点击即可访问! Web网页端:2017年后不再支持新号登录,仅支持老号,并且掉线严重,功能缺失严重。 Xposed技术:在2019年6月份,微信官方在行业重点打击Xposed,自此行业内一片…

企望制造ERP系统 RCE漏洞[2023-HW]

企望制造ERP系统 RCE漏洞 一、 产品简介二、 漏洞概述三、 复现环境四、 漏洞复现小龙POC检测 五、 修复建议 免责声明:请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失,…

IO day 4

1、使用两个进程完成两个文件的拷贝&#xff0c;父进程拷贝前一半内容&#xff0c;子进程拷贝后一半内容&#xff0c;并且父进程要阻塞回收子进程资源 #include <myhead.h>int main(int argc, const char *argv[]) {char a[1] {0};pid_t pid;pid fork();//创建一个子进…

马哈鱼数据血缘工具背后的项目: gsp_demo_java 项目简单介绍与使用

0.背景 马哈鱼数据血缘工具(https://www.sqlflow.cn/)是SQLflow工具的中文译名,实际就是sqlflow. 对于SQL flow来说,底层调用的是General SQL Parser(GSP https://sqlparser.com) 的库. 这个gsp有开源的java demo项目:https://github.com/sqlparser/gsp_demo_java 1.快速使用…

Focus-DETR利用双重注意力机制重建编码器,打造最强目标检测模型

前期的文章我们介绍了DETR模型,我们知道DETR模型首先使用CNN卷积神经网络搜集图片的核心特征点,然后把这些特征点整合起来,通过embedding方法,把特征图片转换到特征向量空间。然后根据标准Transformer模型的编码器与解码器进行注意力机制的计算,最后把计算后的数据进行图片…

vue3+ts+vite使用el-breadcrumb实现面包屑组件,实现面包屑过渡动画

简介 使用 element-plus 的 el-breadcrumb 组件&#xff0c;实现根据页面路由动态生成面包屑导航&#xff0c;并实现面包屑导航的切换过渡动画 一、先看效果加粗样式 1.1 静态效果 1.2 动态效果 二、全量代码 <script lang"ts" setup> import { ref, watch…

5个高清视频素材网站

推荐5个高清视频素材网站&#xff0c;免费、付费、商用的都有&#xff0c;可根据自己需求去选择&#xff0c;赶紧收藏吧&#xff01; 菜鸟图库 https://www.sucai999.com/video.html?vNTYxMjky ​ 菜鸟图库网素材非常丰富&#xff0c;网站主要还是以设计类素材为主&#xff…

RCE远程命令执行

逻辑运算符:: &&&#xff1a;代表首先执行命令a&#xff0c;若成功再执行命令b&#xff0c;又被称为短路运算符。 &&#xff1a;代表首先执行命令a再执行命令b&#xff0c;不管a是否成功&#xff0c;都会执行命令b。在执行效率上来说“&&”更加高效。 ||&a…

合宙Air724UG LuatOS-Air LVGL API--简介

为何是 LVGL LVGL 是一个开源的图形库&#xff0c;它提供了创建嵌入式 GUI 所需的一切&#xff0c;具有易于使用的图形元素、漂亮的视觉效果和低内存占用的特点。 LVGL特点&#xff1a; 强大的 控件 &#xff1a;按钮、图表、列表、滑动条、图像等 高级图形引擎&#xff1a;动…

AIGC之文本内容生成概述(下)—— BERT

关于AIGC系列的文章内容&#xff0c;我们在上一期介绍了基础模型Transformer&#xff0c;本期将会继续介绍基于Transformer模型改进的BERT&#xff08;双向编码器表示Transformer&#xff09;模型。如果想要查之前的介绍内容&#xff0c;可以关注本号&#xff0c;翻看之前的文章…

九耶丨阁瑞钛伦特-在项目中找到的经典BUG是什么?

在项目中找到的经典BUG有很多种&#xff0c;以下是其中一些常见的例子&#xff1a; 空指针异常&#xff08;NullPointerException&#xff09;&#xff1a;当程序试图访问一个空对象或未初始化的变量时&#xff0c;会抛出空指针异常。这通常是由于缺少对变量的正确初始化或检查…

知识继承概述

文章目录 知识继承第一章 知识继承概述1.背景介绍第一页 背景第二页 大模型训练成本示例第三页 知识继承的动机 2.知识继承的主要方法 第二章 基于知识蒸馏的知识继承预页 方法概览 1.知识蒸馏概述第一页 知识蒸馏概述第二页 知识蒸馏第三页 什么是知识第四页 知识蒸馏的核心目…

java练习6. 求完数

题目: 请编程求出1000 以内的所有完数。 完数:一个数如果恰好等于它的所有真因子&#xff08;即除了自身外的所有因数&#xff09;之和&#xff0c;这个数就称为"完数"。 public static void main(String[] args) {for (int i 2; i < 1000; i) {int sum0;for (in…

最大公约数题--夏令营

题目&#xff1a; 知识点&#xff1a; 1。数论-欧几里得算法-gcd最大公因数性质 证明性质2&#xff0c;为什么两组的公约数相等&#xff0c;同样&#xff0c;最大公约数也相等 算法表示 int gcd(int a, int b) {return b 0 ? a : gcd(b, a % b); } 2.分析题目&#xff1a;…

java forEach中不能使用break和continue的原因

1.首先了解break和continue的使用范围和作用 1.1使用范围 break适用范围&#xff1a;只能用于switch或者是循环语句中。当然可以用于增强for循环。 continue适用范围: 用于循环语句中。 1.2作用 break: 1. break用于switch语句的作用是结束一个switch语句。 2. break用于循…

STM32单片机WIFI手机APP智能窗户窗帘控制系统手动自动定时

实践制作DIY- GC0163--WIFI手机APP智能窗户窗帘控制系统 基于STM32单片机设计---WIFI手机APP智能窗户窗帘控制系统 二、功能介绍&#xff1a; STM32F103C系列最小系统板5VUSB电源ULN2003控制的步进电机5个按键DS1302时钟芯片LCD1602显示器光敏电阻结合内部ADC采集光强DHT11温度…

FPGA_学习_17_IP核_ROM(无延迟-立即输出)

由于项目中关于厂商提供的温度-偏压曲线数据已经被同事放在ROM表了&#xff0c;我这边可用直接调用。 今天在仿真的时候&#xff0c;发现他的ROM表用的IP核是及时输出的&#xff0c;就是你地址给进去&#xff0c;对应地址的ROM数据就立马输出&#xff0c;没有延迟。 我打开他的…