介绍

Zookeeper没有使用Paxos实现,而是使用ZAB(Zookeeper原子消息广播协议)作为数据一致性的核心算法。

ZAB是一种专为Zookeeper设计的支持崩溃恢复的原子广播协议。

ZAB分为原子广播和崩溃恢复两种模式。

原子广播



原子广播类似于前面说过的2pc协议,过程如下:

  1. Leader将客户端请求封装成Proposal,同时分配一个事务ID(ZXID)
  2. Leader会为每一个Follower分配一个队列,然后将Proposal放入队列中,根据FIFO策略发送消息
  3. Follower接收到Proposal后,以日志形式写入本地磁盘中。然后反馈Ack
  4. Leader接收到大半Follower的Ack后,广播Commit,并且提交Proposal
  5. Follower接收到Commit后提交

与2pc的差异在于移除了中断操作,只要超过半数的Follower反馈Ack后,Leader就会发送Commit;此外2pc的单点问题会由崩溃恢复解决。

崩溃恢复

一旦 Leader 服务器出现崩溃或者由于网络原因导致 Leader 服务器失去了与过半 Follower 的联系,那么就会进入崩溃恢复模式。

崩溃恢复要求具有以下特性:

  1. 确保那些已经在Leader上提交的事务最终被所有服务器提交

    场景:一个事务在 Leader 上提交了,并且过半的 Folower 都响应 Ack 了,但是 Leader 在 Commit 消息发出之前挂了。
  2. 确保丢弃已经被 Leader 提出的但是没有被提交的事务

    场景:假设一个事务在 Leader 提出之后,Leader 挂了。

崩溃恢复分为发现(Leader选举)和数据同步两个阶段

发现(Leader选举)

针对上面的特性1,我们如果让新选举出来的Leader具有最大的ZXID,那么这个Leader将拥有所有被Leader提交的事务;同时省去检查Proposal的提交和丢弃工作。

ZAB的选举算法为FastLeaderElection,规则如下:

  1. 优先检查ZXID,ZXID的较大的为Leader;
  2. 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算法的更多相关文章

  1. Zookeeper ZAB 协议分析[转]

    写在开始:这是我找到一篇比较好的博客,转载到这来进行备份原文参考: Zookeeper ZAB 协议分析 前言 ZAB 协议是为分布式协调服务 ZooKeeper 专门设计的一种支持崩溃恢复的原子广播 ...

  2. Zookeeper选举算法原理

    Zookeeper选举算法原理 Leader选举 Leader选举是保证分布式数据一致性的关键所在.当Zookeeper集群中的一台服务器出现以下两种情况之一时,需要进入Leader选举. (1) 服 ...

  3. Zookeeper ZAB 协议分析

    前言 ZAB 协议是为分布式协调服务 ZooKeeper 专门设计的一种支持崩溃恢复的原子广播协议.在 ZooKeeper 中,主要依赖 ZAB 协议来实现分布式数据一致性,基于该协议,ZooKeep ...

  4. Zab算法详解

    Zookeeper使用了一种称为Zab(Zookeeper Atomic Broadcast)的协议作为其一致性复制的核心,据其作者说这是一种新发算法,其特点是充分考虑了Yahoo的具体情况:高吞吐量 ...

  5. ZAB 算法

    ZAB (Zookeeper Atomic Broadcast )  zookeeper原子消息广播协议 保证:分布式数据一致性  所有事务请求必须由一个全局唯一的服务器来协调处理,这样的服务器被称为 ...

  6. zookeeper选举算法

    一.ZAB协议三阶段 – 发现(Discovery),即选举Leader过程– 同步(Synchronization),选举出新的Leader后,Follwer或者Observer从Leader同步最 ...

  7. zookeeper ZAB协议 Follower和leader源码分析

    Follower处理逻辑 void followLeader() throws InterruptedException { //... try { //获取leader server QuorumS ...

  8. Zookeeper协议篇-Paxos算法与ZAB协议

    前言 可以自行去学习一下Zookeeper中的系统模型,节点特性,权限认证以及事件通知Watcher机制相关知识,本篇主要学习Zookeeper一致性算法和满足分布式协调的Zab协议 Paxos算法 ...

  9. zookeeper 入门系列-理论基础 – zab 协议

    上一章讨论了paxos算法,把paxos推到一个很高的位置.但是,paxos有没有什么问题呢?实际上,paxos还是有其自身的缺点的: 1. 活锁问题.在base-paxos算法中,不存在leader ...

随机推荐

  1. ElasticSearch--validate验证搜索语句是否合法或者存在语法错误

    GET /accounts/person/_validate/query?explain { "query":{ "match": { "user&q ...

  2. JavaWeb网上图书商城完整项目--day02-21.退出功能的实现

    1.当用户点击退出的时候,跳转到登陆页面 当用户点击退出的时候,需要将session中保存的登陆的用户销毁掉 当用户点击退出的时候,调用UserServlet的quit方法 退出按钮在top.jsp中 ...

  3. 7-4 List Leaves (25分) JAVA

    Given a tree, you are supposed to list all the leaves in the order of top down, and left to right. I ...

  4. php计算两个时间段内的 工作日 工作小时

    <?php class WorkTime { // 定义工作日 [1, 2, 3, 4, 5, 6, 0] public $week_workingday = [1, 2, 3, 4, 5]; ...

  5. C++的逗号运算符

    逗号运算符( , )是C++语言运算符中优先级最低的一种运算符,结合顺序是从左至右,用来顺序求值(最后一个逗号后面表达式的值作为整个表达式的值). 感觉这个东西还是挺冷门的,之前都不知道,平时也比较少 ...

  6. 【搬砖】/etc/passwd 文件结构

    文件的内容: 每个Linux都会有root账号,以此来说明,从内容上看,每行都使用[:]分隔(注意:每行前面的数字是行号,不是内容),所以一共有七部分内容,分别是: 1. 账号名称:root,用来对应 ...

  7. Python3笔记012 - 3.3 条件表达式

    第3章 流程控制语句 3.3 条件表达式 在程序开发中,经常会根据表达式的结果,有条件地进行赋值. # 返回两个数中较大的数 a = 10 b = 6 if a>b: r = a else: r ...

  8. js修改函数内部的this指向(bind,call,apply)

    js修改函数内部的this指向 在调用函数的时候偶尔在函数内部会使用到this,在使用this的时候发现并不是我们想要指向的对象.可以通过bind,call,apply来修改函数内部的this指向. ...

  9. 每日一题 - 剑指 Offer 38. 字符串的排列

    题目信息 时间: 2019-06-29 题目链接:Leetcode tag:深度优先搜索 回溯法 难易程度:中等 题目描述: 输入一个字符串,打印出该字符串中字符的所有排列. 你可以以任意顺序返回这个 ...

  10. 关于display的box和flex布局

    关于二者的区别于联系,在知乎上看到有人这么回答的 flex 2012年的语法,也将是以后标准的语法,大部分浏览器已经实现了无前缀版本. box是2009年的语法,已经过时,是需要加上对应前缀的. 另外 ...