分布式共识算法(故障容错算法)系列整理(五):ZAB

2024-06-15 21:32

本文主要是介绍分布式共识算法(故障容错算法)系列整理(五):ZAB,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

五篇分布式共识系列文章合集:
分布式共识算法(拜占庭容错算法)的系列整理一:PBFT、PoW、PoS、DPos
分布式共识算法(故障容错算法)系列整理(二):Bully、Gossip、NWR
分布式共识算法(故障容错算法)系列整理(三):Paxos
分布式共识算法(故障容错算法)系列整理(四):Raft
分布式共识算法(故障容错算法)系列整理(五):ZAB

Replicated State Machine(复制状态机) 和 Primary-Backup System 的对比

  • 假设初始时 X=0,客户端发送了 X=1, X=X+5,X=X+1 三个指令
  • Replicated State Machine(复制状态机)
    • 节点持久化的是日志序列,在节点之间复制的是日志序列,然后把日志序列应用到状态机(X),最终 X=7
  • Primary-Backup System
    • 节点存储和复制的都是 X=1、X=6、X=7 这种状态的变化序列
  • 两种模型的对比
    • 1.数据同步次数不一样
      • 存储的是日志序列:客户端的所有写请求都要在节点之间同步,不管状态有无变化
      • 存储的是状态变化:只需同步最后一条数据
    • 2.存储状态变化
      • 以客户端发送一个指令 X = X+1 为例
      • 日志序列:Apply 多次就会出现问题
      • 状态变化:具有幂等性,如 X=6,Apply 多次也没关系

Primary-Backup 复制模型在 ZAB 中的应用

  • Zookeeper 是一个树状结构,ZAB 是单点写入,客户端的写请求都会写入Primary Node,Primary Node更新自己本地的树,这棵树也就是上面所说的状态机,完全在内存当中,对应的树的变化存储在磁盘上面,称为Transaction日志。Primary节点把Transaction日志复制到多数派的Backup Node上面,BackupNode根据Transaction日志更新各自内存中的这棵树

zxid 的原理

  • Zookeeper中的Transaction指的并不是客户端的请求日志,而是Zookeeper的这棵内存树的变化。每一次客户端的写请求导致的内存树的变化,生成一个对应的Transaction, 每个Transaction有一个唯一的 ID,称为zxid
  • 在Raft里面,每条日志都有一个term和index,把这两个拼在一起,就类似于zxid。 zxid 是一个64位的整数,高32位表示Leader的任期,在Raft里面叫term,这里叫epoch;低32位是任期内日志的顺序编号
  • 对于每一个新的epoch, zxid 的低32位的编号都从0开始。这是不同于Raft的一个地方,在Raft里面,日志的编号呈全局的顺序递增。
  • 两条日志的新旧比较办法和Raft中两条日志的比较办法类似:
    • 1.日志a的epoch大于b的epoch, 则日志a的zxid大于b的zxid, 日志a比日志b新
    • 2.日志a的epoch等于b的epoch,并且日志a的编号大于日志b的编号,则日志a的zxid大于b的zxid,日志a比日志b新

ZAB 是如何保证日志的顺序提交的

  • 因为 Raft 和 ZAB 使用了单点写入,Paxos 则不能保证,因为是多点写入,乱序提交
  • 这样日志有了「时序」的保证,就相当于在全局为每条日志做了个顺序的编号!基于这个编号,就可以做日志的顺序提交、不同节点间的日志比对,回放日志的时候,也可以按照编号从小到大回放
  • 基于「序」的本质概念,可以保证以下几点
    • 1.如果日志a小于日志b,则所有节点一定先广播a,后广播b
    • 2.如果日志a小于日志b,则所有节点一定先Commit a, 后Commit b。这里的Commit,指的是Apply到状态机。

ZAB算法选举时,集群有哪4种角色?

  • Leader: 主节点
  • Follower: 跟随者节点
  • Observer: 观察者,无投票权
  • Election:类似 Raft 的 Candidate 状态,即自己进入选举状态

ZAB算法选举过程中,集群中的节点拥有哪4个状态?

  • Looking/Election(选举)状态:当节点处于该状态时,它会认为当前集群中没有Leader,因此自己进入选举状态
  • Leading(领导者)状态:表示已经选出主,且当前节点为Leader
  • Following(跟随者)状态:集群中已经选出主后,其它非主节点状态更新为Following,表示对Leader的追随
  • Observing(观察者)状态:表示当前节点为Observer,持观望态度,没有投票权和选举权

ZAB算法的节点的数据结构三元组(server_id, server_zxID, epoch)分别是什么意思?

  • server_id: 本节点的唯一ID
  • server_zxID: 本节点存放的数据ID,数据ID越大表示数据越新,选举权重越大
  • epoch: 当前选取轮数,一般用逻辑时钟表示

ZAB算法的核心和选主原则是什么?

  • 核心:少数服从多数,ID大的节点优先成为主
  • 选主原则:server_zxID最大者成为Leader, 若server_zxID相同,则server_id最大者成为Leader

Zookeeper 实现 ZAB 的 3 个阶段

Leader 选举:FLE(Fast Leader Election)算法

  • 在初始的时候,节点处于Election 状态,然后开始发起选举,选举结束,处于Leader或者Follower状态
  • 在Raft里面,Leader 和Follower之间是单向心跳,只会是Leader给Follower 发送心跳。但在Zab里面是双向心跳,Follower 收不到Leader的心跳,就切换到Election状态发起选举;反过来,Leader 收不到超过半数的Follower心跳,也切换到Election 状态,重新发起选举
  • Raft 选取日志最新的节点作为新的 Leader
  • ZAB 选取zxid 最大的节点作为 Leader,如果所有的节点的 zxid 相等,如系统刚初始化的时候,所有节点的 zxid 都为 0,此时将选取节点编号最大的节点作为Leader(Zookeeper为每个节点配置了一个编号)

正常阶段:2 阶段提交

  • 接收客户端的请求,然后复制到多数派,在 Zookeeper 里面也成为 2 阶段提交
  • 阶段1:Leader收到客户端的请求,先发送Propose消息给所有的Follower,收到超过半数的Follower返回的ACK消息
  • 阶段2:给所有节点发送Commit消息
  • 注:
  • 1.Commit是纯内存操作。这里所说的Commit指的是Raft里面的Apply,Apply到Zookeeper的状态机
  • 2.在阶段1,收到多数派的ACK后,就表示返回给客户端成功了。而不是等多数派的节点收到Commit,再返回给客户端
  • 3.Propose 阶段有一次落盘操作,也就是生成一条Transaction日志,落盘。这与MySQL中Write-ahead Log原理类似

恢复阶段:当 Leader 宕机后,新选出了 Leader,其它 Follower 要切换到新的 Leader,从新的 Leader 同步数据

  • Raft 里面的恢复阶段是,新选出的 Leader 发出一个空的 AppendEntries RPC 请求,即复用了正常复制阶段的通信协议
  • 在 ZAB 里面是,Leader 日志不动,Follower 要与 Leader 做日志比对,然后可能做日志的截断、补齐等操作
  • 恢复的算法和Raft的AppendEntries 很类似,只是在Raft里面这些工作都由Follower自己做了。而在这里,是Leader把主要的工作做了,Leader 比对日志,然后告诉Follower做截断、补齐或全量同步

ZAB算法的选举过程是怎样?

  • 1.当系统刚启动时,3个服务器当前投票均为第一轮投票,即epoch=1, 且zxID均为0。此时每个服务器都推选自己,并将选票信息<epoch, vote_id, vote_zxID>广播出去
  • 2.根据判断规则,由于3个Server的epoch、zxID都相同,因此比较server_id,较大者即为推选对象,因此Server1和Server2将vote_id改为3,更新自己的投票箱并重新广播自己的投票
  • 3.此时系统内所有服务器都推选了Server3,因此Server3当选Leader,处于Leading状态,向其它服务器发送心跳包并维护连接;Server1和2处于Following状态

优点

  • 1.性能高,对系统无特殊要求
  • 2.选举稳定性比较好,当有新节点加入或节点故障恢复后,会触发选主,但不一定会真正切主,除非新节点或故障后恢复的节点数据 ID 和节点 ID 最大,且获得投票数过半,才会导致切主

缺点

  • 1.采用广播方式发送信息,若节点中有n个节点,每个节点同时广播,则集群中信息量为n*(n-1)个消息,容易出现广播风暴
  • 2.除了投票,还增加了对比节点ID和数据ID,这就意味着还需要知道所有节点ID和数据ID,所以选举时间相对较长

参考

  • 分布式协议与算法实战-极客时间
  • 分布式技术原理与算法解析-极客时间
  • 软件架构设计 大型网站技术架构与业务架构融合之道

这篇关于分布式共识算法(故障容错算法)系列整理(五):ZAB的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1064632

相关文章

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

康拓展开(hash算法中会用到)

康拓展开是一个全排列到一个自然数的双射(也就是某个全排列与某个自然数一一对应) 公式: X=a[n]*(n-1)!+a[n-1]*(n-2)!+...+a[i]*(i-1)!+...+a[1]*0! 其中,a[i]为整数,并且0<=a[i]<i,1<=i<=n。(a[i]在不同应用中的含义不同); 典型应用: 计算当前排列在所有由小到大全排列中的顺序,也就是说求当前排列是第

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖

【数据结构】——原来排序算法搞懂这些就行,轻松拿捏

前言:快速排序的实现最重要的是找基准值,下面让我们来了解如何实现找基准值 基准值的注释:在快排的过程中,每一次我们要取一个元素作为枢纽值,以这个数字来将序列划分为两部分。 在此我们采用三数取中法,也就是取左端、中间、右端三个数,然后进行排序,将中间数作为枢纽值。 快速排序实现主框架: //快速排序 void QuickSort(int* arr, int left, int rig

poj 3974 and hdu 3068 最长回文串的O(n)解法(Manacher算法)

求一段字符串中的最长回文串。 因为数据量比较大,用原来的O(n^2)会爆。 小白上的O(n^2)解法代码:TLE啦~ #include<stdio.h>#include<string.h>const int Maxn = 1000000;char s[Maxn];int main(){char e[] = {"END"};while(scanf("%s", s) != EO

科研绘图系列:R语言扩展物种堆积图(Extended Stacked Barplot)

介绍 R语言的扩展物种堆积图是一种数据可视化工具,它不仅展示了物种的堆积结果,还整合了不同样本分组之间的差异性分析结果。这种图形表示方法能够直观地比较不同物种在各个分组中的显著性差异,为研究者提供了一种有效的数据解读方式。 加载R包 knitr::opts_chunk$set(warning = F, message = F)library(tidyverse)library(phyl

秋招最新大模型算法面试,熬夜都要肝完它

💥大家在面试大模型LLM这个板块的时候,不知道面试完会不会复盘、总结,做笔记的习惯,这份大模型算法岗面试八股笔记也帮助不少人拿到过offer ✨对于面试大模型算法工程师会有一定的帮助,都附有完整答案,熬夜也要看完,祝大家一臂之力 这份《大模型算法工程师面试题》已经上传CSDN,还有完整版的大模型 AI 学习资料,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

数论入门整理(updating)

一、gcd lcm 基础中的基础,一般用来处理计算第一步什么的,分数化简之类。 LL gcd(LL a, LL b) { return b ? gcd(b, a % b) : a; } <pre name="code" class="cpp">LL lcm(LL a, LL b){LL c = gcd(a, b);return a / c * b;} 例题: