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 ...
随机推荐
- 2、尚硅谷_SSM高级整合_创建Maven项目.avi
第一步我们新建立一个web工程 这里首先要勾选上enable的第一个复选框 这里要勾选上add maven support 我们在pom.xml中添加sevlet的依赖 创建java web项目之后, ...
- 【Spring】@Transactional 闲聊
菜瓜:上次的AOP理论知识看完收获挺多的,虽然有一个自定义注解的demo,但还是觉得差点东西 水稻:我也觉得没有跟一遍源码还是差点意思,这次结合@Transactional注解深入源码看一下 菜瓜:事 ...
- Swoole 绑定域名 80 端口 (Nginx 反向代理)
启动 Swoole 的 http server,可以使用 IP + 端口 进行访问 创建 Nginx 虚拟域名 vim swotp.liuguofeng.com.conf server { liste ...
- 【asp.net core 系列】14 .net core 中的IOC
0.前言 通过前面几篇,我们了解到了如何实现项目的基本架构:数据源.路由设置.加密以及身份验证.那么在实现的时候,我们还会遇到这样的一个问题:当我们业务类和数据源越来越多的时候,我们无法通过普通的构造 ...
- DOM-BOM-EVENT(2)
2.获取DOM元素的方法 2.1.getElement系列 documentElementById 通过id获取元素 <div id="box"></div> ...
- js语法基础入门(7)
7.数组 7.1.什么是数组以及相关概念? 什么是数组?是一组数据有序排列的集合.将一组数据按一定顺序组织为一个组合,并对这个组合命名,这样便构成了数组. 什么是数组元素?组成数组的每一个数据称为数组 ...
- div嵌套引起的内层margin-top对外层div起作用
嵌套div中margin-top转移问题的解决办法在这两个浏览器中,有两个嵌套关系的div,如果外层div的父元素padding值为0,那么内层div的margin-top或者margin-botto ...
- 比Minikube更快,使用Kind快速创建K8S学习环境
简述 K8S 如火如荼的发展着,越来越多人想学习和了解 K8S,但是由于 K8S 的入门曲线较高很多人望而却步. 然而随着 K8S 生态的蓬勃发展,社区也呈现了越来越多的部署方案,光针对生产可用的环境 ...
- mat-paginatoor控件
pageNumber是点击搜索查询后,跟新的变量值. import { MatPaginatorIntl } from '@angular/material'; const getRangeLabel ...
- Erlang模块inet翻译
模块 inet 模块概述 访问TCP / IP协议. 描述 此模块提供对TCP/IP协议的访问. 另请参阅<ERTS用户指南:Inet配置>,以获取有关如何配置用于IP通信的Erlang运 ...