ZAB算法

什么是zab算法

zab协议全称为zookeeper atomic boradcast(原子广播协议)

zab协议是借鉴Paxos的思想来实现的一种保证分布式架构中数据一致性的算法

zab的协议包含两种 一种是原子广播协议 一种是崩溃恢复协议

原子广播

原子:要么成功,要么失败,不存在中间状态(队列+2阶段提交)

广播:在分布式多节点中,不是所有节点都会接收到广播,但会过半通过。

  1. 客户端发送请求给Follower
  2. 所有的Follower在接收到请求之后,会转发给Leader(所有的事务请求都由Leader来处理)
  3. Leader将会将拿到的请求转化成事务提议,事务序列号Zxid+1。
  4. Leader将提议通过广播给所有的Follower,让其写入日志。(Leader会为每个Follower各设置一个队列,广播的时候把提议放入对应Follower的FIFO队列)
  5. 而Follower的操作结果将反馈给Leader。
  6. Leader在接收到Follower的反馈后,如果集群中有过半的Follower进行正确的ack反馈。Leader将会再次广播Follower ,发送commit消息,提交提议

崩溃恢复

所谓的崩溃恢复 就是在Leader节点崩溃下线后,从有效的Follower节点中推选出一个新的Leader,从而让整个集群继续对外提供服务,在选择的阶段可能会导致各个节点存在数据不一致的问题。

进入崩溃恢复模式的情况
  1. 服务首次启动
  2. 当Leader服务器出现网络/重启等问题导致其无法和过半的服务器正常连接。
恢复模式的策略:
  1. 最先选择zxid最大的节点作为Leader
  2. 新的Leader 会把事务日志中未提交的请求处理掉

leader选举

在选举的时候会参考两个重要的参数:

  • 事务ID(zxid): 值越大说明权重越大,其数据最新
  • 服务器ID(myid): 自定义的服务节点ID,值越大权重越大

谁的票数最多谁就会变为leader 前提是票数是超过节点机器的半数

消息广播流程

zxid

​ zxid 是一个用于标识事务的唯一标识符。每个事务在ZooKeeper中都会被分配一个唯一的ZXID。

​ ZXID由两部分组成:高位部分表示事务的Epoch(选举轮次),低位部分表示事务的序列号。Epoch是在领导者选举过程中使用的概念,用于区分不同的选举周期。序列号用于在选举周期内对事务进行排序

当一个节点成为ZooKeeper集群的领导者时,它会生成具有较高Epoch值的ZXID。在该选举周期内,领导者生成的所有事务都具有较高的Epoch值。当选举周期结束并发生新的选举时,新领导者会增加Epoch值,以区分新的选举周期。

ZXID在ZooKeeper中的使用非常重要。它用于确定事务的顺序和一致性。比较两个ZXID可以确定哪个事务先发生,从而保证了数据的正确顺序和一致性。

总之,ZXID是ZooKeeper中用于标识事务的唯一标识符,由Epoch和序列号组成,用于维护事务的顺序和一致性。

  1. Leader 接收到消息请求后,将消息赋予一个全局唯一的 64 位自增 id,叫做:zxid,通过 zxid 的大小比较即可实现因果有序这一特性。
  2. Leader 通过先进先出队列(通过 TCP 协议来实现,以此实现了全局有序这一特性)将带有 zxid 的消息作为一个提案(proposal)分发给所有 follower。
  3. 当 follower 接收到 proposal,先将 proposal 写到硬盘,写硬盘成功后再向 leader 回一个 ACK。
  4. 当 leader 接收到合法数量的 ACKs 后,leader 就向所有 follower 发送 COMMIT 命令,同时会在本地执行该消息。
  5. 当 follower 收到消息的 COMMIT 命令时,就会执行该消息。

相比于完整的二阶段提交,Zab 协议最大的区别就是不能终止事务,follower 要么回 ACK 给 leader,要么抛弃 leader,在某一时刻,leader 的状态与 follower 的状态很可能不一致,因此它不能处理 leader 挂掉的情况,所以 Zab 协议引入了恢复模式来处理这一问题。

从另一角度看,正因为 Zab 的广播过程不需要终止事务,也就是说不需要所有 follower 都返回 ACK 才能进行 COMMIT,而是只需要合法数量(2n+1 台服务器中的 n+1 台) 的follower,也提升了整体的性能。

奔溃恢复流程

zookeeper崩溃恢复有两个场景

  • Zookeeper服务器启动时Leader选举。
  • Zookeeper集群运行过程中Leader崩溃后的Leader选举。
leader选举参数
  1. myid: 服务器ID,这个是在安装Zookeeper时配置的,myid越大,该服务器在选举中被选为Leader的优先级会越大。ZAB算法中通过myid来规避了多个节点可能有相同zxid问题,注意可以对比之前的Raft算法,Raft算法中通过随机的timeout来规避多个节点可能同时成为Leader的问题。
  2. zxid: 事务ID,这个是由Zookeeper集群中的Leader节点进行Proposal时生成的全局唯一的事务ID,由于只有Leader才能进行Proposal,所以这个zxid很容易做到全局唯一且自增。因为Follower没有生成zxid的权限。zxid越大,表示当前节点上提交成功了最新的事务,这也是为什么在崩溃恢复的时候,需要优先考虑zxid的原因。
  3. epoch: 投票轮次,每完成一次Leader选举的投票,当前Leader节点的epoch会增加一次。在没有Leader时,本轮此的epoch会保持不变
选举流程

​ 1.每个Server会发出一个投票,第一次都是投自己。投票信息:(myid,ZXID)

​ 2.收集来自各个服务器的投票

​ 3.处理投票并重新投票,处理逻辑:优先比较ZXID,然后比较myid

​ 4.统计投票,只要超过半数的机器接收到同样的投票信息,就可以确定leader

​ 5.改变服务器状态,进入正常的消息广播流程。

如果保证数据的一致性?
什么情况下会出现的数据不一致性?

当 leader 收到合法数量 follower 的 ACKs 后,就向各个 follower 广播 COMMIT 命令,同时也会在本地执行 COMMIT 并向连接的客户端返回「成功」。但是如果在各个 follower 在收到 COMMIT 命令前 leader 就挂了,导致剩下的服务器并没有执行都这条消息。

答案:

我的理解是这样的。 当前leader同步的该条数据没有被follower提交就挂了。 然后follower中就选举出来的一个新的leader 此时是不是在对外提供服务中,刚才写入的数据是无法获取到的?因为此时该leader节点的那条数据并没有被提交?。。 如果此后原leader节点启动了,是如何把刚才的那条数据的提交操作与其它节点处理的呢?

所以zookeeper zab协议还是一个最终实现一致性的实现是吧。 我可以保证各个节点数据完全一致,但是在特殊情况下(就比如我刚才描述的情况下) 是会有延迟的(我感觉是这样的 还是一个最终一致性的实现)

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

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

相关文章

Swagger + Knife4j 接口文档的整合

Swagger 接口文档的整合: 引入依赖(Swagger 或 Knife4j)。自定义 Swagger 配置类。定义需要生成接口文档的代码位置(Controller)。注意:线上环境不要把接口暴露出去!!!可…

C#操作pdf之使用itext实现01-生成一个简单的table

创建.net 8控制台项目 安装itext <PackageReference Include"itext" Version"8.0.2" /><PackageReference Include"itext.bouncy-castle-adapter" Version"8.0.2" /><PackageReference Include"itext.bouncy-cast…

企业级大数据安全架构(四)Ranger安装

作者&#xff1a;楼高 Ranger是支持审计功能的&#xff0c;安装时可以选择审计数据保存的位置&#xff0c;默认支持Solr和HDFS。HDFS的配置比较简单&#xff0c;这里就不赘述了&#xff0c;我们这里使用Ambari默认自带的Solr保存审计日志&#xff0c;下面部署Solr&#xff1a; …

MySQL基础笔记(8)多表查询

一.多表关系介绍 项目开发中&#xff0c;在进行数据库表结构设计时&#xff0c;会根据业务需求及业务模块之间的关系&#xff0c;分析并设计表结构&#xff0c;由于业务之间相互关联&#xff0c;所以各个表结构之间也会存在着各种联系&#xff0c;分为如下3类&#xff1a; 一对…

探索设计模式的魅力:一篇文章让你彻底搞懂建造者模式

建造者模式&#xff08;Builder Pattern&#xff09;是一种创建型设计模式&#xff0c;旨在将一个复杂对象的创建过程与其表示分离&#xff0c;使得同样的构建过程可以创建不同的表示形式。 主要角色&#xff1a; 产品&#xff08;Product&#xff09;&#xff1a;表示正在构建…

论rtp协议的重要性

rtp ps流工具 rtp 协议&#xff0c;实时传输协议&#xff0c;为什么这么重要&#xff0c;可以这么说&#xff0c;几乎所有的标准协议都是国外创造的&#xff0c;感叹一下&#xff0c;例如rtsp协议&#xff0c;sip协议&#xff0c;webrtc&#xff0c;都是以rtp协议为基础&#…

springboot知识04

1、集成swaggershiro放行 &#xff08;1&#xff09;导包 &#xff08;2&#xff09;SwaggerConfig&#xff08;公共&#xff09; package com.smart.community.common.swagger.config;import io.swagger.annotations.ApiOperation; import org.springframework.beans.facto…

WordPress判断页面函数is_page()怎么使用?

平时我们在折腾 WordPress 的时候&#xff0c;经常需要用到 is_page()函数来判断是否属于页面&#xff0c;是否属于指定页面等。那么对于这个判断页面函数 is_page()应该怎么使用呢&#xff1f; is_page()函数介绍 is_page( int|string|array $page ) 其中$page&#xff0…

开发实践8_REST

一、Django REST Framework, Django View & APIView MTV模式实现前后端分离。Representational State Transfer 表现层状态转化。Representation 资源&#xff08;Resource a specific info. on net.&#xff09;具体呈现形式。ST 修改服务端的数据。修改数据 POST请求。…

java使用AES加密数据库解密

目录 前言代码加密&#xff08;AES&#xff09;sql解密 前言 在一些项目中&#xff0c;客户要求一方面把一些敏感信息进行加密存储到数据库中&#xff0c;另一方面又需要通过加密的信息进行查询&#xff0c;这时就需要在sql对加密的字段进行解密后再进行查询。 代码加密&#x…

力扣labuladong——一刷day95

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、力扣225. 用队列实现栈二、力扣232. 用栈实现队列 前言 两种数据结构底层其实都是数组或者链表实现的&#xff0c;只是 API 限定了它们的特性&#xff0c;那…

数据结构与算法教程,数据结构C语言版教程!(第五部分、数组和广义表详解)二

第五部分、数组和广义表详解 数组和广义表&#xff0c;都用于存储逻辑关系为“一对一”的数据。 数组存储结构&#xff0c;99% 的编程语言都包含的存储结构&#xff0c;用于存储不可再分的单一数据&#xff1b;而广义表不同&#xff0c;它还可以存储子广义表。 本章重点从矩阵…

复现github项目的基本步骤

1. 克隆 GitHub 项目 找到项目仓库&#xff1a;在 GitHub 上找到你想复现的项目。 复制克隆链接&#xff1a;点击仓库页面的“Clone or download”按钮&#xff0c;复制提供的 URL。 克隆仓库&#xff1a;打开终端或命令提示符&#xff0c;使用以下命令克隆仓库&#xff1a; …

对多种股权激励方式进行分析,明确按照业绩贡献确定激励对象

一、背景 某生物创新材料有限公司创立于1990年&#xff0c;坐落于成都某高新技术产业开发区&#xff0c;是一家以研发、生产和销售医疗器械、医用高分子材料、生物技术等生物、能源方面的产品为主的大型企业&#xff0c;该公司与美国某科技研究所结成合作伙伴&#xff0c;研发出…

[python语言]数据类型

目录 知识结构​编辑 复数类型 整数类型、浮点数类型 1、整型 2、浮点型 字符与字符串 1、转义字符 2、字符串的截取 3、字符串的拼接级连 4、字符串的格式化 1、format格式化 2、字符格式化 3、f标志位格式化--(推荐) 5、字符串的常用属性 1、对字符串做出判断…

电脑上怎么进行pdf合并?这几招分分钟解决

电脑上怎么进行pdf合并&#xff1f;在现代办公中&#xff0c;PDF文件已经成为了我们处理文档的常用格式之一。有时候&#xff0c;我们需要将多个PDF文件合并成一个文件&#xff0c;以方便阅读或打印。那么&#xff0c;如何在电脑上进行PDF合并呢&#xff1f;下面就给大家介绍几…

yolov5 检测封装

yolov5 pytorch推理 检测封装 v7测试成功 import csv import os import platform import sys from pathlib import Pathimport numpy as np import torchFILE = Path(__file__).resolve() ROOT = FILE.parents[0] # YOLOv5 root directory if str(ROOT) not in sys.path:sys.p…

知识图谱的演进

目录 前言1 Memex&#xff1a;信息存储的雏形2 超文本和Web&#xff1a;链接的崛起3 Semantic Web&#xff1a;从文本链接到数据链接4 Linked Big Data&#xff1a;规范化的语义表示5 谷歌的知识图谱搜索引擎6 多种语义网/知识图谱项目结语 前言 随着人工智能和互联网的飞速发…

Keil下载芯片包(DFP)时找不到根目录的解决办法

目录 1 发现的问题 2 想到的可能解决问题的措施 1 发现的问题 打开Keil时Pack Installer 自动打开下载芯片包&#xff0c;但弹出如下提示&#xff0c;无法下载&#xff1a; Refresh Pack description E: the specified CMsls Pack Root directorydoes NoT exist! Please tak…

go语言(一)----声明变量

package mainimport ("fmt""time" )func main() {fmt.Print("hello go!")time.Sleep(1 * time.Second)}运行后&#xff0c;结果如下&#xff1a; 1、golang表达式中&#xff0c;加&#xff1b;和不加&#xff1b;都可以 2、函数的{和函数名一…