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

🌈🌈🌈🌈🌈🌈🌈🌈
欢迎关注公众号(通过文章导读关注:【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.mfbz.cn/a/298960.html

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

相关文章

小白入门基础 - Restful

一:REST与RESTful: REST:表现层状态转移,资源在网络中以某种形式进行状态转移。 RESTful是基于REST理念的一套开发风格,是具体的开发规则。 服务器端只返回数据,以json或者xml的格式。 RESTful开发规范&a…

DockerUI本地如何部署并结合内网穿透实现远程访问管理界面

文章目录 前言1. 安装部署DockerUI2. 安装cpolar内网穿透3. 配置DockerUI公网访问地址4. 公网远程访问DockerUI5. 固定DockerUI公网地址 前言 DockerUI是一个docker容器镜像的可视化图形化管理工具。DockerUI可以用来轻松构建、管理和维护docker环境。它是完全开源且免费的。基…

项目管理进阶之PDCA

前言 项目管理进阶系列,今天开始发布第一篇喽。 博主其实一直在构思,如何开启这个系列,但是我们通常项目管理讲的“五大过程十大领域”,往往太书面了。因此尝试从中抓取几个核心,以供有志之士参考。 那么&#xff0c…

C++——简介、Hello World、变量常量、数据类型

个人简介 👀个人主页: 前端杂货铺 🙋‍♂️学习方向: 主攻前端方向,正逐渐往全干发展 📃个人状态: 研发工程师,现效力于中国工业软件事业 🚀人生格言: 积跬步…

试除法求约数算法总结

知识概览 试除法求一个数的约数的时间复杂度是。 例题展示 题目链接 活动 - AcWing 系统讲解常用算法与数据结构,给出相应代码模板,并会布置、讲解相应的基础算法题目。https://www.acwing.com/problem/content/871/ 题解 用试除法求约数,…

Golang拼接字符串性能对比

g o l a n g golang golang的 s t r i n g string string类型是不可修改的,对于拼接字符串来说,本质上还是创建一个新的对象将数据放进去。主要有以下几种拼接方式 拼接方式介绍 1.使用 s t r i n g string string自带的运算符 ans ans s2. 使用…

火山软件开发平台调用奥迦插件源码模块实现找色找字类似大漠插件

主要是存档自用 奥迦插件在Windows 10操作系统上使用Visual Studio 2019编写,适用于所有较新的Windows平台,是一款集网络验证,深度学习,内核,视觉,文字,图色,后台,键鼠,窗口,内存,汇编,进程,文件,网络,系统,算法及其它功能于一身的综合插件,类似于大漠插件 插件使用C语言和COM技…

使用邮箱发送验证码前端完成登录

前言 在前一篇使用C#发送邮箱验证码已经完成使用.net core web api写了完成往登录邮箱发送验证码的接口。现在就用前端调用接口模拟登录功能。 接口 public class ApiResp{public bool Success { get; set; }public int Code { get; set; }public int count { get; set; }pu…

20240105-工作安排的最大收益

题目要求 我们有 n 份工作,每份工作都安排在 startTime[i] 至 endTime[i] 期间完成,从而获得 profit[i] 的利润。 给你 startTime、endTime 和 profit 数组,返回你能获得的最大利润,使得子集中没有两个时间范围重叠的工作。 如…

SSH 无密登录配置

1)配置 ssh (1)基本语法 ssh 另一台电脑的 IP 地址 (2)ssh 连接时出现 Host key verification failed 的解决方法 [yuxuan@yuxuan102 ~]$ ssh yuxuan103 ➢ 如果出现如下内容 Are you sure you want to continue connecting (yes/no)? ➢ 输入 yes,并回车 (3)退回到 …

MYSQL 存储过程/存储函数

简而言之,类似于封装函数 特点 基本语法 create peocedure p1() begin select coun(*) from studuent; end; call p1(); 设置完别忘了把delimiter改回来 变量 系统变量 用户自定义变量 set myname its; set myage : 10; 局部变量 if 参数(IN&…

基于多反应堆的高并发服务器【C/C++/Reactor】(中)线程池的启动和从线程池中取出一个反应堆实例

一、线程池的启动 (主线程) // 启动线程池 (主线程) void threadPoolRun(struct ThreadPool* pool) {/*线程池被创建出来之后,接下来就需要让线程池运行起来,其实就是让线程池里的若干个子线程运行起来*//…

JVM虚拟机的垃圾回收器(面试题)

1.什么是垃圾回收 垃圾回收主要说的是java会自动把程序在运行过程中产生的一些没有用的对象给回收掉,这样可以避免内存的浪费。 java主要是通过一个叫“根可达”的算法来识别这个对象是否可以被回收的,然后回收的算法也主要有三种:标记清除&a…

Python 教程 02:Python 编程环境的搭建与 IDE 的选择

目录 一、搭建 Python 环境 1.1 Python 官网 1.2 下载 Python 1.2.1 选择版本 1.2.2 选择平台 1.2.3 下载安装文件(Windows & macOS) 1.3 安装环境 1.3.1 Windows 平台 1.3.2 macOS 平台 1.3.3 Linux 平台 1.4 验证安装是否成功 二、选择…

Flink自定义Source模拟数据流

maven依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.…

瓢虫目标检测数据集VOC格式400张

瓢虫&#xff0c;一种小巧玲珑、色彩鲜艳的昆虫&#xff0c;因其独特的形态和生态习性而受到广泛欢迎。 瓢虫的体型小巧&#xff0c;一般为圆球形&#xff0c;体色鲜艳&#xff0c;有红、黄、黑等多种颜色。它们通常有一个坚硬的外壳&#xff0c;可以保护自己不受天敌的侵害。…

12月笔记

#pragma once 防止多次引用头文件&#xff0c;保证同一个&#xff08;物理意义上&#xff09;文件被多次包含&#xff0c;内容相同的两个文件同样会被包含。 头文件.h与无.h的文件&#xff1a; iostream是C的头文件&#xff0c;iostream.h是C的头文件&#xff0c;即标准的C头文…

前端--基础 常用标签 - 超链接标签 ( 内部链接,空链接,下载链接,网页元素连接)

链接分类 &#xff1a; 外部链接 内部链接 空链接 下载链接 网页元素链接 内部链接 &#xff1a; 即 网站内部页面之间的相互链接&#xff0c;直接点击 链接内部页面名称即可 所谓内部链接&#xff0c;就是在同一个网站里面&#xff0c;有许多链接&#xff0c;当你在 a…

机器学习笔记 - 用于语义图像分割的空洞卷积DeepLabv3

一、什么是DeepLabv3&#xff1f; DeepLabv3 是用于语义分割任务的深度神经网络 (DNN) 架构。虽然不是比较新的网络模型&#xff0c;但是也是分割模型里的杰出代表之一&#xff0c;所以还是值得深入了解。 它使用Atrous&#xff08;Dilated&#xff09;卷积来控制感受野和特征图…

房贷计算器,妥妥的数学计算

根据给出的公式&#xff0c;编写房贷计算器。妥妥的数学计算&#xff0c;把数学公式“翻译”成代码就好。 (笔记模板由python脚本于2024年01月06日 18:08:55创建&#xff0c;本篇笔记适合初具基本编程能力的coder翻阅) 【学习的细节是欢悦的历程】 Python 官网&#xff1a;http…
最新文章