Zookeeper ----- ZAB算法
介绍
Zookeeper没有使用Paxos实现,而是使用ZAB(Zookeeper原子消息广播协议)作为数据一致性的核心算法。
ZAB是一种专为Zookeeper设计的支持崩溃恢复的原子广播协议。
ZAB分为原子广播和崩溃恢复两种模式。
原子广播

原子广播类似于前面说过的2pc协议,过程如下:
- Leader将客户端请求封装成Proposal,同时分配一个事务ID(ZXID)
- Leader会为每一个Follower分配一个队列,然后将Proposal放入队列中,根据FIFO策略发送消息
- Follower接收到Proposal后,以日志形式写入本地磁盘中。然后反馈Ack
- Leader接收到大半Follower的Ack后,广播Commit,并且提交Proposal
- Follower接收到Commit后提交
与2pc的差异在于移除了中断操作,只要超过半数的Follower反馈Ack后,Leader就会发送Commit;此外2pc的单点问题会由崩溃恢复解决。
崩溃恢复
一旦 Leader 服务器出现崩溃或者由于网络原因导致 Leader 服务器失去了与过半 Follower 的联系,那么就会进入崩溃恢复模式。
崩溃恢复要求具有以下特性:
- 确保那些已经在Leader上提交的事务最终被所有服务器提交
场景:一个事务在 Leader 上提交了,并且过半的 Folower 都响应 Ack 了,但是 Leader 在 Commit 消息发出之前挂了。 - 确保丢弃已经被 Leader 提出的但是没有被提交的事务
场景:假设一个事务在 Leader 提出之后,Leader 挂了。
崩溃恢复分为发现(Leader选举)和数据同步两个阶段
发现(Leader选举)
针对上面的特性1,我们如果让新选举出来的Leader具有最大的ZXID,那么这个Leader将拥有所有被Leader提交的事务;同时省去检查Proposal的提交和丢弃工作。
ZAB的选举算法为FastLeaderElection,规则如下:
- 优先检查ZXID,ZXID的较大的为Leader;
- ZXID一样,myid较大的为Leader。
数据同步
Leader会为每个Follower创建一个队列,将那些未被Follower同步的消息以Proposal发送,并紧接着发送Commit;等到Follower同步所有数据,才加入真正可用的Follower列表。
ZAB对特性2场景下产生的数据进行回退是依据ZXID。
ZXID = 32位的Leader的周期epoch + 32位的单调递增的事务id
epoch在每次选举出新的Leader都为自增1,而事务id会置0
当一个在特性2场景下崩溃的机器重启以follower身份连上新Leader时,会比较ZXID,然后回退崩溃前的事务。
数据同步结束之后将切换为原子广播模式。
ZAB的整体流程

参考资料
从 Paxos 到 Zookeeper——分布式一致性原理和实践
https://www.jianshu.com/p/2bceacd60b8a
Zookeeper ----- ZAB算法的更多相关文章
- Zookeeper ZAB 协议分析[转]
写在开始:这是我找到一篇比较好的博客,转载到这来进行备份原文参考: Zookeeper ZAB 协议分析 前言 ZAB 协议是为分布式协调服务 ZooKeeper 专门设计的一种支持崩溃恢复的原子广播 ...
- Zookeeper选举算法原理
Zookeeper选举算法原理 Leader选举 Leader选举是保证分布式数据一致性的关键所在.当Zookeeper集群中的一台服务器出现以下两种情况之一时,需要进入Leader选举. (1) 服 ...
- Zookeeper ZAB 协议分析
前言 ZAB 协议是为分布式协调服务 ZooKeeper 专门设计的一种支持崩溃恢复的原子广播协议.在 ZooKeeper 中,主要依赖 ZAB 协议来实现分布式数据一致性,基于该协议,ZooKeep ...
- Zab算法详解
Zookeeper使用了一种称为Zab(Zookeeper Atomic Broadcast)的协议作为其一致性复制的核心,据其作者说这是一种新发算法,其特点是充分考虑了Yahoo的具体情况:高吞吐量 ...
- ZAB 算法
ZAB (Zookeeper Atomic Broadcast ) zookeeper原子消息广播协议 保证:分布式数据一致性 所有事务请求必须由一个全局唯一的服务器来协调处理,这样的服务器被称为 ...
- zookeeper选举算法
一.ZAB协议三阶段 – 发现(Discovery),即选举Leader过程– 同步(Synchronization),选举出新的Leader后,Follwer或者Observer从Leader同步最 ...
- zookeeper ZAB协议 Follower和leader源码分析
Follower处理逻辑 void followLeader() throws InterruptedException { //... try { //获取leader server QuorumS ...
- Zookeeper协议篇-Paxos算法与ZAB协议
前言 可以自行去学习一下Zookeeper中的系统模型,节点特性,权限认证以及事件通知Watcher机制相关知识,本篇主要学习Zookeeper一致性算法和满足分布式协调的Zab协议 Paxos算法 ...
- zookeeper 入门系列-理论基础 – zab 协议
上一章讨论了paxos算法,把paxos推到一个很高的位置.但是,paxos有没有什么问题呢?实际上,paxos还是有其自身的缺点的: 1. 活锁问题.在base-paxos算法中,不存在leader ...
随机推荐
- Python变量与基本数据类型
Python变量与基本数据类型 前言 好了,从本章开始将正式进入Python的学习阶段.本章主要介绍的是Python变量与基本数据类型的认识,这些都是最基本的知识并且必须要牢靠掌握在心中. 注释 学习 ...
- JDK8--07:并行流与串行流
JDK8中,提供了并行流和串行流,使用parallel()和sequential()来处理,parallel()为并行流sequential()为串行流,两者可以相互转换,以最后一个为准 LongSt ...
- python+opencv实现检测物体聚集区域
内容涉及:二值图像转换 / 检测连通区域面积 / 在原图上画框等 import cv2 import numpy as np for n in open('list.txt'): # list.txt ...
- c++数字转化为字符串、字符串转换为数字
char ch[20]; int i =1; int j = 2; char *p = "34567"; 数字装换为字符串 sprintf(ch , "%d,%d&quo ...
- 最简单的jQuery轮播图(原理解析)
html: <div class="middle_right"> <div id="lunbobox"> <div id=&quo ...
- QtableWidget用法流程
QtableWidget用法流程 作者:流火 日期:2020/5/10 QTableWidget的基本构造函数 QTableWidget 是QTableview的子类.主要去呗是QTableVie ...
- npm tip: go to the package's home page
exec the following order: --- npm home <package name>
- css图片居中,通过纯css实现图片居中的多种实现方法
在网页布局中,图文排版是我们常用的,那么经常会遇到如何让图片居中显示呢,这篇文章将总结常用css实现图片居中的方法总结: html结构: <div class="demo" ...
- redo log 与 binlog
redo log 与 binlog redo log redo log (重做日志)是处于存储引擎层的,是InnoDB引擎特有的 redo log 存储的是物理日志 --- 即,"在某个 ...
- 洛谷 P3574 [POI2014]FAR-FarmCraft
题目传送门 题目描述 输入输出格式 输入格式: 输出格式: 一行,包含一个整数,代表题目中所说的最小时间. 输入输出样例 样例输入 样例输出 提示 分析 我们设f[x]为遍历完以x为根的子树且将这棵子 ...