【ZooKeeper高手实战】ZAB协议:ZooKeeper分布式一致性的基石

news2024/9/30 3:33:03

🌈🌈🌈🌈🌈🌈🌈🌈
欢迎关注公众号(通过文章导读关注:【11来了】),及时收到 AI 前沿项目工具及新技术 的推送
发送 资料 可领取 深入理解 Redis 系列文章结合电商场景讲解 Redis 使用场景中间件系列笔记编程高频电子书
文章导读地址:点击查看文章导读!
🍁🍁🍁🍁🍁🍁🍁🍁
在这里插入图片描述

ZooKeeper 中的分布式一致性协议 ZAB

zk 使用了 ZAB( ZooKeeper Atomic Broadcast) 分布式一致性协议来保证在分布式系统中的所有节点可以 保证数据一致性

下边将从具体的功能出发,来介绍 ZAB 协议的原理

ZAB 协议如何实现主从同步机制?

在 zk 集群中,只有 Leader 可以接收写操作,Follower 只可以读,Leader 收到写的事务请求后,会香所有的 Follower 发送一个 事务操作的提议,也就是 Proposal,当 Follower 收到 Proposal 之后,会先将数据的变更写入到磁盘的日志文件中,表示已经收到了 Proposal,之后会返回 Ack 给 Leader,当 Leader 收到了超过半数 Follower 的 Ack,之后 Leader 会先将数据写到自己的 znode 中(也就是写到内存中去,此时数据就可以被客户端感知到了),之后再给所有的 Follower 发一个 Commit 消息,让大家提交这个请求事务,Follower 收到 Commit 消息后,就会将磁盘中刚刚写入的数据往内存中的 znode 中写,之后客户端就可以读取到数据了

光读上边的字,可能看起来很头疼,可以通过下边这个图很清晰的了解整个流程:
在这里插入图片描述

ZAB 协议如何实现崩溃恢复机制?

下边将会介绍 zk 集群 启动 再到 崩溃 再到 恢复 整体的流程:

zk 集启动的时候,进入 恢复模式,选举一个 Leader 出来,然后 Leader 等待集群中过半的 Follower 跟他进行数据同步,只要过半的 Follower 完成数据同步,接着就退出恢复模式,可以对外提供服务了

此时,还没完成同步的 Follower 会自己去跟 Leader 进行数据同步的

之后会进入 消息广播模式,只有 Leader 可以接受写请求,但是客户端可以任意连接 Leader 或者 Follower,如果客户端连接到 Follower,Follower 就会将写请求转发给 Leader

Leader 收到写请求,就把请求同步给所有的 Follower,当超过半数的 Follower 都返回了 Ack,之后 Leader 先将数据写到自己的 znode 中,再给所有的 Follower 发一个 Commit 消息,让大家提交这个请求事务,Follower 收到 Commit 消息后,就会将磁盘中刚刚写入的数据往内存中的 znode 中写,之后客户端就可以读取到数据了

如果 Leader 宕机了,就会进入 恢复模式,重新选举一个 Leader,只要获得了过半的机器的投票,就可以成为 Leader

zk 集群中可以容忍不超过一半的机器宕机,就比如说一个集群有 3 台机器,那么最多允许 1 台机器宕机,剩下的 2 台选举 Leader,只要 2 台机器都认可其中一台机器当 Leader,也就是超过了集群一半的机器都认可,那么就可以选举这台机器作为 Leader

新的 Leader 等待过半的 Follower 跟他同步,之后重新进入 消息广播模式

以上就是 zk 集群恢复崩溃的整个流程了,当然我也花了一个流程图,更方便观看,如下:
在这里插入图片描述

主要就是分为 3 个阶段:

  • 集群启动时:恢复模式,Leader 选举 + 数据同步
  • 消息写入时:消息广播模式,Leader 采用 2PC 的过半写机制,给 Follower 进行同步
  • 崩溃恢复:恢复模式,Leader/Follower 宕机,只要剩余机器超过一半,就可以选举新的 Leader

下边来介绍一下 ZAB 协议中是如何采用 2PC 两阶段提交思想完成数据写入的:

采用 2PC 两阶段提交思想 的 ZAB 消息广播流程:

每一个消息广播的时候,都是基于 2PC 的思想,先是发起事务提议 Proposal 的广播,各个 Follower 返回 Ack,当过半的 Follower 都返回 Ack 之后,Leader 就发送 Commit 消息到 Follower,让大家提交事务

这里的两阶段指的就是发送 ProposalCommit

发起一个事务 Proposal 之前,Leader 会分配一个全局唯一递增的事务 id(zxid),以此来严格保证顺序

Leader 会为每个 Follower 创建一个队列,里边存放要发给 Follower 的事务 Proposal,保证了一个同步的顺序性

Follower 收到事务 Proposal 之后,就立即写入本地磁盘日志中,写入成功后数据就不会丢失了,之后返回 Ack 给 Leader,当过半的 Follower 都返回 Ack,Leader 推送 Commit 消息给全部 Follower,让大家进行事务提交

那么 zk 到底是 强一致性 还是 最终一致性

zk 不是强一致的,因为当 Leader 给 Follower 发送 Commit 消息之后,可能有的 Follower 提交成功了,有的还没有提交成功,这会导致 短暂的数据不一致

但是说 zk 是最终一致性也不太对,zk 官方给自己的定位是 顺序一致性,因为 Leader 会保证所有的事务 Proposal 同步到 Follower 上都是按照顺序来执行的

ZAB 协议下可能存在的 数据一致性问题

在 ZAB 写一下有两种可能造成数据不一致的情况

  • 第一种情况:Leader 在收到过半 Follower 的 Ack 之后,Leader 就会 Commit,如果 Leader 在自己 Commit 之后,还没来得及给 Follower 发送 Commit 就挂掉了,此时 Leader 和所有的 Follower 的数据都是不一致的

    所以在 Leader 崩溃的时候,就会选举一个拥有最大 事务 id 的机器作为 Leader,它需要去检查事务日志,如果发现自己磁盘日志里有一个 Proposal 并且没有提交,说明肯定是之前的 Leader 没来得及发送 Commit 就挂掉了,此时新选举的 Leader 就为这个 Proposal 发送 Commit 到其他所有的 Follower 中去,这样就保证了老 Leader 提交的事务最终可以同步到所有的 Follower 中去
    在这里插入图片描述

  • 第二种情况:Leader 收到客户端请求,结果还没来得及给 Follower 发送 Proposal 就挂了,此时这个 Leader 上的 Proposal 请求应该是要被丢弃的,这种情况下,当新的 Leader 选举出来之后,老的 Leader 作为 Follower 重新启动,看到自己的磁盘日志有一个事务 Proposal,并且发现这个 Proposal 其实不应该存在,那么直接丢弃就可以了
    在这里插入图片描述

那么在 第二种情况 中,需要丢弃的消息是如何在 ZAB 协议中进行处理的?

每一条事务的 zxid 都是 64 位的,高 32 位是 Leader 的 epoch,可以看作是 Leader 的版本,低 32 位才是自增长的事务 id

如果 Leader 没有来得及给 Follower 发送 Proposal 就挂掉了,那么新的 Leader 选举出来之后,它的 epoch 会增长 1,老的 Leader 成为 Follower 之后,发现自己比新的 Leader 多一条 Proposal,并且 Proposal 的 epoch 比新 Leader 的 epoch 要小,那么直接丢弃即可

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

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

相关文章

第17课 为rtsp流加入移动检测功能

在上节课,我们成功拿到了rtsp视频和音频流,在第13课,我们为普通的usb摄像头加上了移动检测功能,那能不能给rtsp摄像头也加上移动检测功能以实现一些好玩的应用呢?答案是肯定的,在usb摄像头检测中&#xff0…

BetaFlight开源代码之电压校准

BetaFlight开源代码之电压校准 1. 源由2. 分析数据流3. 采样电路3. 原理4. 示例5. 实测&转换数据6. 参考资料 1. 源由 既然复杂的BetaFlight开源代码之电流校准都过了一遍,电压相对来说是比较简单的,一起过一下 2. 分析数据流 电源路径1》采样电路…

【Spring实战】24 使用 Spring Boot Admin 管理和监控应用

文章目录 1. 定义2. 使用场景3. 主要功能4. 示例1)[服务端] 添加依赖2)[服务端] 相关配置3)[服务端] 启动类4)[服务端] 启动服务5)[服务端] 浏览器访问6)[客户端] 添加依赖7)[客户端] 相关配置8…

双变量probit模型

1. Probit模型 1.1 模型含义 假设个体只有两种选择,y1或y0。影响选择的变量都包括在向量x中。即线性概率模型为 y值服从两点分布 被认为是连接函数,函数选择具有一定的灵活性。如果为标准正态的累积分布函数,则模型成为Probit模型&#xff…

网络嗅探器的设计与实现(2024)-转载

1.题目描述 参照 raw socket 编程例子,设计一个可以监视网络的状态、数据流动情况以及网络上传输 的信息的网络嗅探器。 2.运行结果 3.导入程序需要的库 请参考下面链接: 导入WinPcap到Clion (2024)-CSDN博客 4.参考代码 #define HAVE_REMOTE #define LINE_LEN …

【数据库原理】(11)SQL数据查询功能

基本格式 SELECT [ALL|DISTINCT]<目标列表达式>[,目标列表达式>]... FROM <表名或视图名>[,<表名或视图名>] ... [ WHERE <条件表达式>] [GROUP BY<列名 1>[HAVING <条件表达式>]] [ORDER BY <列名 2>[ASC DESC]];SELECT: 指定要…

WinForms中的UI卡死

WinForms中的UI卡死 WinForms中的UI卡死通常是由于长时间运行的操作阻塞了UI线程所导致的。在UI线程上执行的操作&#xff0c;例如数据访问、计算、文件读写等&#xff0c;如果耗时较长&#xff0c;会使得UI界面失去响应&#xff0c;甚至出现卡死的情况。 解决方法 为了避免…

061:vue中通过map修改一维数组,增加一些变量

第061个 查看专栏目录: VUE ------ element UI 专栏目标 在vue和element UI联合技术栈的操控下&#xff0c;本专栏提供行之有效的源代码示例和信息点介绍&#xff0c;做到灵活运用。 &#xff08;1&#xff09;提供vue2的一些基本操作&#xff1a;安装、引用&#xff0c;模板使…

系列二、GitHub中的Alpha、Beta、RC、GA、Release等各个版本

一、GitHub中的Alpha、Beta、RC、GA 1.1、概述 1.2、参考 https://www.cnblogs.com/huzhengyu/p/13905129.html

Qt——TCP UDP网络编程

目录 前言正文一、TCP二、UDP1、基本流程2、必备知识 三、代码层级1、UDP服务端 END、总结的知识与问题1、如何获取QByteArray中某一字节的数据&#xff0c;并将其转为十进制&#xff1f;2、如何以本年本月本日为基础&#xff0c;获取时间戳&#xff0c;而不以1970为基础&#…

Ps 滤镜:高反差保留

Ps菜单&#xff1a;滤镜/其它/高反差保留 Filter/Others/High Pass 高反差保留 High Pass滤镜常用于锐化、保护纹理、提取线条等图像编辑工作流程中。它的工作原理是&#xff1a;只保留显示图像中的高频信息&#xff08;即图像中的细节和边缘区域&#xff09;&#xff0c;而图像…

二分查找算法(指定数值的左右边界)

之前一直以为二分查找有什么难的&#xff0c;不就是确定左右边界&#xff0c;然后while循环求mid&#xff0c;大于mid的找右半边&#xff0c;小于mid的找左半边。直到最后相同了就是最后查找的结果了. 后来等真正用到二分查找算法的时候&#xff0c;发现问题远没有这么简单&…

【论文阅读笔记】ISINet: An Instance-Based Approach for Surgical Instrument Segmentation

1. 论文介绍 ISINet: An Instance-Based Approach for Surgical Instrument Segmentation ISINet&#xff1a;一种基于实例的手术器械分割方法 2020 MICCAI 【Paper】 【Code】 2.摘要 我们研究了机器人辅助手术场景中手术器械的语义分割任务。我们提出了基于实例的手术器械…

计算机Java项目|基于Springboot实现患者管理系统

作者主页&#xff1a;编程指南针 作者简介&#xff1a;Java领域优质创作者、CSDN博客专家 、掘金特邀作者、多年架构师设计经验、腾讯课堂常驻讲师 主要内容&#xff1a;Java项目、毕业设计、简历模板、学习资料、面试题库、技术互助 文末获取源码 项目编号&#xff1a;KS-032…

Hello 2024

Hello 2024 A. Wallet Exchange 题意&#xff1a;Alice和Bob各有a和b枚硬币&#xff0c;每次他们可以选择交换硬币或者保留&#xff0c;然后扣除当前一枚手中的硬币&#xff0c;当一方没得扣另一方就赢了。 思路&#xff1a;Alice先手&#xff0c;所以当硬币和为奇数时Alice…

Java面试之并发篇(一)

1、前言 本篇主要总结JAVA面试中关于并发相关的高频面试题。本篇的面试题基于网络整理&#xff0c;和自己编辑。在不断的完善补充哦。 2、简述程序、进程、线程、的基本概念&#xff1f; 2.1、程序 程序&#xff0c;是含有指令和数据的文件&#xff0c;被存储在磁盘或其他的…

基于神经网络的手写汉字提取与书写评分系统研究

相关源码和文档获取请私聊QQ:3106089953 论文目录结构 目 录 摘 要 I Abstract II 目 录 IV 第1章 绪论 1 1.1. 研究背景与意义 1 1.2. 国内外研究现状 2 1.2.1. 文本定位技术研究现状 2 1.2.2. 手写汉字识别研究现状 3 1.2.3. 汉字书写质量评价方法研究现状 4 1.3. 本文所做工…

OS_lab——bochs源码的编译与安装

1. 实验环境VMware station 15 Ubuntu 14.04.6 32位。2. 实验步骤2.1 安装虚拟机&#xff0c;并在虚拟机根目录下编译并安装bochs环境。 2.2 使用bochs自带工具bximage创建虚拟软驱。 2.3 编写引导程序boot.asm并用nasm编译得到引导文件boot.bin和boot.com。 2.4 修改bochs…

Hadoop分布式文件系统(二)

目录 一、Hadoop 1、文件系统 1.1、文件系统定义 1.2、传统常见的文件系统 1.3、文件系统中的重要概念 1.4、海量数据存储遇到的问题 1.5、分布式存储系统的核心属性及功能含义 2、HDFS 2.1、HDFS简介 2.2、HDFS设计目标 2.3、HDFS应用场景 2.4、HDFS重要特性 2.4…

性能分析与调优: Linux 安装基于BPF的bcc-tools系统性能工具库

目录 一、实验 1.环境 2.agent服务器安装使用ELRepo安装依赖包 3.agent服务器安装基于BPF的bcc-tools系统性能工具库 二、问题 1.安装bcc-tools后执行命令报错 一、实验 1.环境 &#xff08;1&#xff09;主机 表1-1 主机 主机架构组件IP备注prometheus 监测 系统 pro…