zookeeper4==zookeeper源码阅读,FOLLOWER收到了需要LEADER执行的命令后各节点会执行什么

news2024/12/23 13:38:37

上面已经阅读并观察了节点确定自己的身份后会做些什么,大致就是比对双方信息然后完成同步。

本篇阅读,

FOLLOWER收到了需要LEADER执行的命令后,怎么同步给LEADER的,并且LEADER会执行什么操作。

源码启动zkCli用于测试

将原本的代码拷贝一份用IDEA打开后,找到org.apache.zookeeper.ZooKeeperMain#main,然后修改org.apache.zookeeper.ZooKeeperMain#run中监听控制台输入命令的代码,修改成本次需要执行的ls  /命令,或者create /test命令,然后启动ZooKeeperMain

后续的每次测试的流程是每次都将ZK1 ZK2 ZK3的data目录下除了myid之外的所有文件清空后(意味着从零启动集群)依次启动他们,然后修改ZKCLI的命令后启动。

总体上是ZK1的AcceptThread接受2181的连接,SelectorThread读取ZKCLI连接传过来的消息。(这里需要写个NIO的DEMO了解下NIO的用法)

1-zkCli.cmd连接上ZK1

1-1

zkCli连接上ZK1,ZK1的AcceptThread接住连接,ZKCLI然后向ZK1发送第一个request(Session establishment request),ZK1的SelectorThread接住request,

1-2

ZK1的FollowerRequestProcessor会让自己处理命令,并且将createSession request发送给LEADER,

org.apache.zookeeper.server.quorum.FollowerRequestProcessor#run

zks.getFollower().request(request);//需要转发给LEADER的要转发给LEADER

1-3

LEADER收到createSession request (org.apache.zookeeper.server.quorum.Learner#request  case Leader.REQUEST)后,

LADER会将该请求做成个proposal发给各个FOLLOWER,并等待他们的ACK,比如发给ZK3如下

1-4

ZK3收到proposal后,写入日志后给LEADER返回ACK消息

1-5

LEADER收到来自FOLLOWER的ACK消息后,判断是否超过半数的已经ACK,如果已经超过半数的FOLLOWER进行了ACK,就对所有FOLLOWER发出COMMIT命令

1-6

FOLLOWER收到来自LEADER的COMMIT命令后,进行提交,不需要再对LEADER进行ACK回复。

整个流程的日志体现:

ZKCLI连接上ZK1,创建连接并通知给LEADER(ZK2),LEADER通知给ZK3。整个流程在日志中体现如下:

ZK1 9279085697300接收到客户端请求需要转发给leader: sessionid:0x100008d4de80000 type:createSession cxid:0x0 zxid:0xfffffffffffffffe txntype:unknown reqpath:n/a

ZK2 9279087048900收到了客户端转发的请求Processing request:: sessionid:0x100008d4de80000 type:createSession cxid:0x0 zxid:0x200000001

ZK2 将客户端请求封装成PROPOSAL Proposing:: sessionid:0x100008d4de80000 type:createSession cxid:0x0 zxid:0x200000001 txntype:-10 reqpath:n/a

ZK2 9279087198100往FOLLOWER1发送消息。消息类型是Leader.2
ZK2 9279087239700往FOLLOWER3发送消息。消息类型是Leader.2

ZK1 9279087377600收到了来自LEADER的消息,消息类型是2
ZK1 9279087474600收到了来自LEADER的PROPOSAL消息72058200935366656,0,8589934593,1702784374368,-10
ZK1 9279089191900 给LEADER返回ACK消息,该ACK针对的ZXID是 8589934593

ZK3 9279087412300收到了来自LEADER的消息,消息类型是2
ZK3 9279087569300收到了来自LEADER的PROPOSAL消息72058200935366656,0,8589934593,1702784374368,-10
ZK3 9279089655500 给LEADER返回ACK消息,该ACK针对的ZXID是 8589934593

ZK2 9279088663200收到了2对于Proposal的ACK2, 8589934593, sessionid:0x100008d4de80000 type:createSession cxid:0x0
ZK2 9279088831800关于该Proposal的ACK数量还不够
ZK2 9279089581300收到了1对于Proposal的ACK2, 8589934593, sessionid:0x100008d4de80000 type:createSession cxid:0x0 zxid:0x200000001 
ZK2 9279089865700关于该Proposal的ACK数量够了,开始要求commit,该Proposal的ZXID是8589934593
ZK2 9279089933300告知FOLLOWER们,可以进行COMMIT了 8589934593

ZK2 9279089997000往FOLLOWER3发送消息。消息类型是Leader.4
ZK2 9279090025600往FOLLOWER1发送消息。消息类型是Leader.4

ZK2 9279090080900收到了3对于Proposal的ACK,但是之前已经收到了超过半数的ACK了

ZK1 9279090224600收到了来自LEADER的消息,消息类型是4
ZK3 9279090135900收到了来自LEADER的消息,消息类型是4

2-zkCli.cmd连接上ZK1后执行ls /命令

2-zkCli.cmd连接上ZK1后执行create /test命令

这个是1中createSession request一样的步骤,只是生成的proposal的内容变了,不是createSession而是create

总结:

如上,已经阅读了客户端连接上ZK集群中某一个节点,并执行命令,该命令要么需要发给LEADER同步给其他节点的命令,要么只需要当前节点执行。其中核心就是需要同步的命令,而这种命令的执行就是ZAB的主要内容:

客户端将请求(如果creat /test)发给某个节点,

该节点发给LEADER,

LEADER创建个PROPOSAL发给所有FOLLOWER,

FOLLOWER给LEADER返回ACK,

LEADER收到过半数的ACK后,向所有FOLLOWER发送COMMIT命令,

FOLLOWER进行COMMIT,不需要再给LEADER汇报。

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

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

相关文章

解决PP材质粘合问题用PP专用UV胶水

PP材料已经广泛应用于各行各业,在粘接中会有不同的问题需求,那么使用专用于PP的UV胶水可能是解决PP材质粘合问题的一种有效方法。 主要在于:UV胶水在紫外线照射下可以快速固化,形成坚固的连接。所以使用PP专用UV胶水时可以考虑&am…

如何在Docker部署draw.io流程图软件并实现公网远程访问

前言 提到流程图,大家第一时间可能会想到Visio,不可否认,VIsio确实是功能强大,但是软件为收费,并且因为其功能强大,导致安装需要很多的系统内存,并且是不可跨平台使用。所以,今天给…

使用axios的详细图文教程

介绍 当我们使用Vue开发项目时,会发送Ajax请求服务器接口,会对axios封装。 Axios(ajax i/o system)不是一种新技术,本质上也是对原生XHR(XMLHttpReques)的封装,只不过它是基于Pr…

和葡萄酒时为什么要写品酒笔记?

如果你不把你的想法写下来,它们可能会在你离开房间之前就离开你的大脑。写笔记,包括令人难忘的品酒笔记,它是关于记录一些超越今天和明天的有意义的事情。这是你的记忆葡萄酒,对你来说最相关、最有区别的就是最重要的。最后&#…

Keil新建STM32软件工程 - (详细步骤图文)

文章目录 1. 前言2. 下载芯片对应的Keil开发包3. 下载芯片对应的标准外设库 - STM32F10x_StdPeriph_Lib_Vx.x.x4. 新建工程文件夹 - Demo34.1 移植标准外设库4.2 启动文件介绍及如何选择 5. 新建软件工程 - Demo5.1 打开Keil → Project → New uVision Project5.2 选择芯片型号…

CSS 的背景属性(开发中常用)

目录 1 内容预览 背景颜色 背景图片 背景平铺 背景图片位置(常用) 背景图像固定 背景复合写法 背景色半透明 实现案例 1 内容预览 背景属性可以设置背景颜色、背景图片、背景平铺、背景图片位置、背景图像固定等。 注意: 把表格中的五个属背下来&#xff0c…

朱卫明:从韶关走向世界的创作型歌手

朱卫明,艺名Aming,是一位来自广东韶关的杰出唱作音乐人。他以其独特的创作才华和深情的嗓音,赢得了众多歌迷的喜爱。作为一名创作型歌手,朱卫明用音乐传递情感,用歌声打动人心。 一、早年经历与音乐启蒙 朱卫明出生于…

Explain工具-SQL性能优化

文章目录 SQL性能优化的目标Explain覆盖索引ExplainindexExplainfilesortExplainfilesort创建 idx_bd(b,d) SQL性能优化的目标 达到 range 级别 Explain覆盖索引 Extra中Using index表示覆盖索引 Explainindex type中是index,代表全索引扫描,磁盘扫…

Sketch for Mac:实现你的创意绘图梦想的矢量绘图软件

随着数字时代的到来,矢量绘图软件成为了广告设计、插画创作和UI设计等领域中必不可少的工具。在众多矢量绘图软件中,Sketch for Mac(矢量绘图软件)以其强大的功能和简洁的界面脱颖而出,成为了众多设计师的首选。 Sket…

【LeetCode:746. 使用最小花费爬楼梯 | 递归 -> 记忆化搜索 -> DP】

🚀 算法题 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜,…

【机器学习】应用KNN实现鸢尾花种类预测

目录 前言 一、K最近邻(KNN)介绍 二、鸢尾花数据集介绍 三、鸢尾花数据集可视化 四、鸢尾花数据分析 总结 🌈嗨!我是Filotimo__🌈。很高兴与大家相识,希望我的博客能对你有所帮助。 💡本文由Fil…

YOLOv5改进 | 2023 | CARAFE提高精度的上采样方法(助力细节长点)

一、本文介绍 本文给大家带来的CARAFE(Content-Aware ReAssembly of FEatures)是一种用于增强卷积神经网络特征图的上采样方法。其主要旨在改进传统的上采样方法(就是我们的Upsample)的性能。CARAFE的核心思想是:使用…

【LeetCode刷题笔记】155.最小栈

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; 更多算法知识专栏&#xff1a;算法分析&#x1f525; 给大家跳段街舞感谢…

指针运算笔试题解析

题目一 #include <stdio.h>int main(){int a[5] { 1, 2, 3, 4, 5 };int *ptr (int *)(&a 1);printf( "%d,%d", *(a 1), *(ptr - 1));return 0;}// 程序的结果是什么&#xff1f; 答案中显示第一个是2&#xff0c;第二个是5 咱们先来解释一下第一个答…

C语言入门基础(二)

基本概念 地址 计算机的内存是一块用于存储数据的空间&#xff0c;由一系列连续的存储单元组成&#xff0c;就像下面这样&#xff0c; 每一个单元格都表示1个Bit&#xff0c;一个bit在EE专业的同学看来就是高低电位&#xff0c;而在CS同学看来就是0&#xff0c;1两种状态。 …

K8s中pod詳解

目录 Yaml语法解析 Pod pod是如何被创建的 1.创建一个pod 2.创建一个多容器pod 进入容器 3.配置节点标签 4.Pod容器的交互 4.1创建pod&#xff0c;并做本地解析 4.2pod共享进程 4.3pod共享宿主机namespace 5.钩子函数lifecycle 基础指令 # 查看对应资源: 状态 $ kubectl…

人工智能_机器学习065_SVM支持向量机KKT条件_深度理解KKT条件下的损失函数求解过程_公式详细推导---人工智能工作笔记0105

之前我们已经说了KKT条件,其实就是用来解决 如何实现对,不等式条件下的,目标函数的求解问题,之前我们说的拉格朗日乘数法,是用来对 等式条件下的目标函数进行求解. KKT条件是这样做的,添加了一个阿尔法平方对吧,这个阿尔法平方肯定是大于0的,那么 可以结合下面的文章去看,也…

首字母转大写在线工具

具体请前往&#xff1a;在线首字母转大写

结构体基础全家桶(2)结构体指针

目录 指向结构体类型数据的指针&#xff1a; 指向结构体变量的指针&#xff1a; 创建&#xff1a; 应用&#xff1a; 注意事项&#xff1a; 指向结构体数组的指针 创建&#xff1a; 应用&#xff1a; 注意&#xff1a; 用结构体变量和指向结构体的指针做函数的参数 …

oracle详细安装教程(附带百度网盘资源)

一,下载安装包途径 1.官网 Unauthorized Request 2.百度网盘分析 https://pan.baidu.com/s/1n221gdTK0Fcho839oRab9g 提取码1q2w 二&#xff0c;安装教程 1.下载完安装包后点击 setup.exe 如果出现一下的问题&#xff0c;使用windows10等系统安装oracle 11g等版本的数据库…