分布式与一致性协议之ZAB协议(二)

ZAB协议

ZAB协议是如何实现操作地顺序性的?

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

如果用一句话解释ZAB协议到底是什么,我觉得它是能保证操作顺序性的、基于主备模式的原子广播协议。
接下来,还是以指令X、Y为例具体演示一下,帮助你更好地理解为什么ZAB协议能实现操作的顺序性(为了演示,我们假设节点A为主节点,节点B、C为备份节点)。
首先,在ZAB协议中,写操作必须在主节点(比如节点A)上执行。如果客户端访问的节点是备份节点(比如节点B),则备份节点会将写请求转发给主节点,如图所示。
接着,当主节点接收到写请求后,它会基于写请求中的指令(也就是X、Y)来创建一个提案(Proposal),并使用一个唯一的ID来标识这个提案。这里我说的唯一ID就是事务标识符(TransactionID,也就是zxid),如图所示
从图中可以看到,指令X、Y对应的事务标识符分别为<1,1>和<1,2>。这两个标识符是什么含义呢?
你可以这么理解,事务标识符是64位的long型变量,由任期编号epoch和计数器counter两部分组成(为了形象和方便理解,我把epoch翻译城任期编号),格式为<epoch,counter>,其中,高32位位任期编号,低32位为计数器。
1.任期编号就是创建提案时领导者的任期编号,当新领导者当选时,任期编号递增,计数器被设置为零。比如,前领导者的任期编号为1,那么新领导者对应的任期编号将为2
2.计数器就是具体标识提案的整数,每次领导者创建新的提案时,计数器将递增。比如,前一个提案对应的计数器值为1,那么新的提案对应的计数器值将为2
为什么要设计这么复杂呢?因为事务标识符必须按照顺序、唯一标识一个提案,也就是说,事务标识符必须是唯一的、递增的。
在创建完提案之后,主节点会基于TCP协议并按照顺序将提案广播到其他节点,如图所示,这样就能保证先发送的消息先被收到,进而保证消息接收的顺序性。如图所示,指令X一定在指令Y之前到达节点B、C.
然后,当主节点接收到指定提案的大多数确认响应后,该提案将处于提交状态(Commited),此时主节点会通知备份节点提交该提案,如图所示。
主节点提交提案是有顺序性的。它会根据事务标识大小顺序提交提案,如果前一个提案未提交,此时主节点是不会提交后一个提案的。也就是说,指令X一定会在指令Y之前提交。
最后,主节点返回执行成功的响应给节点B,由节点B再转发给客户端,这样我们就实现了操作的顺序性,保证了指令X一定在指令Y之前执行。
最后想补充的是,当执行完写操作后,接下来你可能需要执行读操作。为了提升读并发能力,ZooKeeper提供的是最终一致性,也就是说,读操作可以在任何节点上执行,如图所示,客户端会读到旧数据。如果客户端必须要读到最新数据,怎么办呢?ZooKeeper提供了一个解决办法,那就是sync命令。我们可以在执行读操作前执行sync命令,从而使客户端可以读到最新数据,如代码所示

[zk: localhost:2181(CONNECTED) 17] create /geekbang 123
Created /geekbang
[zk: localhost:2181(CONNECTED) 18] create /geekbang/time 456
Created /geekbang/time
[zk: localhost:2181(CONNECTED) 19] sync /geekbang/time
Sync is OK
[zk: localhost:2181(CONNECTED) 20] get /geekbang/time
456
[zk: localhost:2181(CONNECTED) 22] stat /geekbang/time
cZxid = 0x51104
ctime = Sun May 05 15:46:28 CST 2024
mZxid = 0x51104
mtime = Sun May 05 15:46:28 CST 2024
pZxid = 0x51104
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 3
numChildren = 0

注意

ZAB协议的术语众多,而且有些术语表达的是同一个含义,它们有些在文档中出现,有些在代码中出现,你只有准确理解术语,才能更好地理解ZAB协议地原理。这里补充一些内容。

  • 1.提案(Proposal):进行共识协商地基本单元,可以理解为操作(Operation)或指令(Command),常出现在文档中
  • 2.事务(Transaction):也是指提案,常出现代码中。比如,pRequest2Txn()将接收到的请求转换为事务;再比如,未提交提案会持久化存储在事务日志中。这里需要注意的是,这个术语很容易引起误解,因为它不是指更广泛被接受的含义,具有ACID特性的操作序列,而是仅仅指提案

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

力扣每日一题113:路径总和||

题目 中等 给你二叉树的根节点 root 和一个整数目标和 targetSum &#xff0c;找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。 叶子节点 是指没有子节点的节点。 示例 1&#xff1a; 输入&#xff1a;root [5,4,8,11,null,13,4,7,2,null,null,5,1], targetSu…

【R语言数据分析】函数

目录 自定义函数 apply函数 分类汇总函数aggregate 自定义函数 R语言中的自定义函数更像是在自定义一种运算规则。 自定义函数的语法是 函数名 函数体 } 比如 表示定义了一个名为BMI_function的函数&#xff0c;这个函数代表了一种运算规则&#xff0c;就是把传入的x和…

stm32开发之netxduo网口通讯,网线热插拔处理

前言 在使用netxduo组件时&#xff0c;如果在上电过程中&#xff0c;未插入网线&#xff0c;eth驱动使能过程中未正常初始化本次使用以下几种方式进行设置 问题原因 使用定时器事件回调方式 网络组件中进行调整 /** Copyright (c) 2024-2024&#xff0c;shchl** SPDX-Licen…

openGL

open Graphics Library 核心是一个c库&#xff0c;同时支持多语言的派生。 可编程管线&#xff0c; 状态机&#xff08;State Machine&#xff09;是一种数学模型&#xff0c;用于描述对象在不同状态下的行为及状态之间的转换关系。状态机由一组状态&#xff08;States&#…

2010NOIP普及组真题 2. 接水问题

线上OJ&#xff1a; 一本通&#xff1a;http://ybt.ssoier.cn:8088/problem_show.php?pid1950 解法一、朴素模拟 核心思想&#xff1a; 朴素模拟&#xff1a; 1、先给每个b[i]水龙头分配一个人a[i]&#xff0c;b[i] 表示水龙头的剩余时间。同时标记该水龙头为 used 使用中 2…

深入解析:匹配网络(Matching Networks)的原理和应用

匹配网络&#xff08;Matching Networks&#xff09; 深入解析&#xff1a;匹配网络&#xff08;Matching Networks&#xff09;的原理和应用匹配网络的核心原理工作原理算法流程 匹配网络的实现应用示例结论 深入解析&#xff1a;匹配网络&#xff08;Matching Networks&#…

01_SpringBoot简单搭建入门程序

目录 1、先创建一个java项目2、导入依赖3、将Java项目修改为SpringBoot项目4、编写一个测试的Controller5、测试(创建一个*.http的文件)方式1&#xff1a;方式2&#xff1a;可以直接在浏览器访问该地址方式3&#xff1a;使用postman也可以 1、先创建一个java项目 我的项目结构…

FlinkSql使用ES sink并指定主键,为什么数据还是会被覆盖?

FlinkSql使用ES sink并指定主键&#xff0c;为什么数据还是会被覆盖&#xff1f; 1. 问题描述 根据ES connector文档中的描述&#xff0c;创建ES表并指定主键后将采用upsert模式。 但是在实际的使用过程中却发现部分数据仍然存在被直接覆盖的问题。 举个例子&#xff0c;假如…

NumPy库与PyTorch库的异同点

目录 1.单位的创建和操作 1.创建 2.形状变换 2.数学和统计操作 1.矩阵乘法 2.广播 3.统计计算 3.GPU支持 4.在深度学习中的作用 5.应用范围 NumPy库为数组服务&#xff0c;PyTorch库为张量服务&#xff0c;这是最本质的区别。 1.单位的创建和操作 1.创建 NumPy:使…

【busybox记录】【shell指令】md5sum

目录 内容来源&#xff1a; 【GUN】【md5sum】指令介绍 【busybox】【md5sum】指令介绍 【linux】【md5sum】指令介绍 使用示例&#xff1a; 128位MD5 - 默认输出 128位MD5 - 将每个文件当做二进制处理 128位MD5 - 从文件中读取MD5值并做检查 128位MD5 - 创建一个BSD风…

浅谈OpenCV 粗略计算工件轮廓面积和外接圆直径(Emgu.CV)

前言 最近领导在做库房工具管理这块的功能&#xff0c;希望能集成OpenCV 粗略的计算出工具的长度&#xff0c;以方便用户再归还工具的时候&#xff0c;提示用户该放在那种尺寸的盒子里面&#xff0c;这便是这篇文章的由来。 我们的系统是基于.net开发的&#xff0c;所以采用的是…

项目管理-项目采购管理1/2

项目管理&#xff1a;每天进步一点点~ 活到老&#xff0c;学到老 ヾ(◍∇◍)&#xff89;&#xff9e; 何时学习都不晚&#xff0c;加油 1.项目采购管理-主要内容 项目采购管理过程--重点&#xff1a; ①ITTO 输入&#xff0c;输出工具和技术。 ②问题和解决方案。 ③论文…

【白话机器学习系列】白话特征向量

白话特征向量 一个方阵 A A A 与列向量 v v v 的乘积会生成一个新的列向量。这个新向量通常与原向量有着不同的方向&#xff0c;矩阵在这里代表一个线性变换。然而&#xff0c;某些向量会保持其原始方向。我们称这种向量为矩阵 A A A 的特征向量&#xff08;eigenvector&…

python数据分析——业务指标分析

业务指标分析 前言一、业务指标分析的定义二、业务问题构建问题构建的要求 三、业务问题的识别在识别问题的阶段对于企业内部收益者的补充&#xff1a; 四、竞争者分析标题竞争者分析的内容&#xff1a;标题竞争者分析目的&#xff1a;案例&#xff1a; 黑莓公司为什么会消亡&a…

dynamic_cast 静态转换

dynamic_cast 静态转换 const_cast 常量转换 重新解释转换(reinterpret_cast) 最不安全

RocketMq详解:一、RocketMQ 介绍及基本概念

文章目录 前言1.RocketMQ简介2.RocketMQ 特点3.核心特性4.应用场景5.RocketMQ 优势6.RocketMQ 四大核心组件6.1 NameServer1.NameServer作用2.NameServer被设计为无状态的原因3.和NameServer和Zookeeper的区别4.NameServer的高可用保障 6.2 Broker1.Broker部署方式2.高可用与负…

ssm105基于JAVAEE技术校园车辆管理系统+jsp

校园车辆管理系统设计与实现 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本校园车辆管理系统就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短…

泰克示波器电流探头如何抓浪涌电流波形?

泰克示波器是一种常见的电子测量仪器&#xff0c;广泛应用于电子工程、通信工程、医疗设备等领域。它的主要功能是实时显示电信号的波形&#xff0c;从而帮助工程师和技术人员分析和调试电路。而在一些特定的应用场景中&#xff0c;例如电源、电机、电器设备等&#xff0c;我们…

模型全参数训练和LoRA微调所需显存的分析

大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的见解。曾经辅导过若干个非计算机专业的学生进入到算法…

TypeScript 基础学习笔记:泛型 <T> vs 断言 as

TypeScript 基础学习笔记&#xff1a;泛型 <T> vs 断言 as &#x1f525; 引言 &#x1f44b; TypeScript (TS) 以其静态类型的魔力&#xff0c;让我们的代码更加健壮、易读且易于维护。今天&#xff0c;我们将深入探讨两个核心概念——泛型&#xff08;Generics&#x…