理解ZAB协议
ZAB协议
介绍
1、zab协议是为分布式协调服务zookpeer专门设计的一种支持崩溃恢复的原子广播协议
2、在zookeeper中主要依赖ZAB协议来实现数据一致性,基于该协议zk实现了一种主备模式的系统架构来保证集群中各个副本之间数据的一致性。具体就是zk使用一个单一的主进程来接收并处理客户端的事务请求(就是写请求),并采用ZAB的原子广播协议,将服务器数据的状态变更以事务proposal的形式广播到所有的副本进程上去。
事务请求的处理方式
所有的事务请求必须由一个全局唯一的服务器来协调处理,这样的服务器被称为Leader服务器,而余下的其他服务器则是Follow服务器。Leader负责将一个事务请求转换成一个事务proposal,并将该proposal分发给集群中所有的Follow,之后Leader需要等待所有的Follow的反馈,一单超过半数Follow进行了正确的反馈后,那么Leader就会再次向所有的Follow发送commit消息,要求其将前一个proposal进行提交
注意:如果集群中非Leader服务器接收到事务请求,这些非Leader服务器会将事务请求转发给Leader服务器,只有Leader才能处理事务请求。
协议具体内容
ZAB协议包括两种基本模式:分别是崩溃恢复和消息广播
当整个集群启动过程中或者当Leader服务器出现网络中断,崩溃退出或重启等异常时,ZAB协议j就会进入恢复模式并选举产生新的Leader,当选举产生了新的Leader,同时集群中有过半的机器与该Leader服务器完成了状态同步(即数据同步)之后,ZAB协议就会退出崩溃恢复模式,进入消息广播模式。这时如果有一台遵守ZAB协议的服务器加入集群,因为此时集群中已经存在一个Leader服务器在广播消息,那么新加入的服务器自觉的进入恢复模式:找到Leader服务器并与之完成数据同步然后一起参与到消息广播流程中去。
当Leader出现崩溃退出或者机器重启,亦或是集群中已经不存在过半的服务器与Leader保持正常的通信,ZAB就会重新发一轮Leader选举并实现数据同步,最后又进入消息广播模式,接收事务请求
消息必须是有顺序的
在整个消息广播过程中,Leader会将每个事务请求转换成对应的proposal来进行广播,并且在广播事务proposal之前,Leader服务器会首先为这个事务proposal分配一个全局的单调递增的唯一ID,称之为事务ID(即ZXID),由于ZAB需要保证每一个消息严格的因果关系,因此必须将每一个proposal按照其ZXID的先后顺序来进行排序与处理。
消息广播
ZAB协议的消息广播使用的是一个原子广播协议,类似于二阶段提交,Leader接收事务请求,并转换成proposal广播给其他的Follow,然后过半的Follow ack消息,最后再给广播commit消息完成事务提交。
具体的,在消息广播过程中,Leader为每个Follow服务器分配一个单独的队列,然后将需要广播的proposal依次放到队列中去,并且根据FIFO策略进行消息发送。每一个Follow接收到proposal后,都会首先将其以事务日志的形式写入本地磁盘中,并且写入成功后反馈Leader一个ACK响应。当Leader接收到超过半数的ACK响应后,就会广播一个commit消息给Follow已通知他们完成事务提交,同时Leader自身也会完成事务的提交。
崩溃恢复
Leader挂了之后,ZAB协议就自动进入崩溃恢复模式,选举出新的Leader,并完成数据同步,然后退出崩溃恢复模式进入消息广播模式
ZAB协议如何保证数据一致性
异常情况:
1、假设一个事务在Leader上提交了,并且过半Follow都响应ACK了,但是Leader将commit消息发出后就挂了
2、假设一个事务在Leader提交了之后,Leader就挂掉了。
要保证如果发生上述2种情况,数据还能保持一致性,那么ZAB协议选举算法必须确保已经提交的proposal(发送过commit消息),在Follow上也必须完成提交;并且丢弃已经被跳过的事务proposal。
通过ZAB协议选举算法选举出来的Leader必须是拥有集群中最高编号(ZXID)proposal的机器,拥有最高编号说明新Leader一定具有所有已提交的提案。更为重要的是,如果让具有最高编号的事务proposal的机器成为Leader,就可以省去Leader服务器检查proposal的提交和丢弃工作的这一步操作了。
ZAB是如何数据同步?
完成Leader选举后(新Leader具有最高编号),在正式开始工作之前(接收事务请求,然后提出新的proposal),Leader服务器会首先确认事务日志中的所有的Proposal是否都已经被集群中过半的提交了。
Leader服务器需要确保所有的Follow服务器能够接收到每一条事务proposal, 并且能将所有已经提交的事务proposal应用到内存数据库中去。等到Follow将所有尚未同步的事务proposal都从Leader服务器上同步过来并应用到内存数据库中去,Leader才会把该Follow加入到真正可用的Follow列表中。
ZAB是如何处理需要丢弃的Proposal?
在ZAB协议的事务编号ZXID设计中,ZXID是一个64位的数字,其中低32位可以看作成一个简单的单调递增计数器了,针对客户端每一个事务请求,Leader在产生新的事务Proposal时,都会对该计数器加1,而高32位则代表了Leader周期的epoch编号(可以理解为选举的届期),每当选举产生一个新的Leader,就会从这个Leader服务器上取出本地事务日志中最大的编号proposal的ZXID,并从ZXID中解析得到对应epoch编号,然后再对其进行加1,之后就以此编号作为新的epoch值,并将地32位置为0开始生成新的ZXID,ZAB协议通过epoch编号来区分Leader变化周期,能够有效的避免了不同的Leader错误的使用了相同的ZXID编号提出了不一样的proposal的异常情况。
基于这样的策略,当一个包含了上一个Leader周期中尚未提交过的事务proposal的服务器启动时,当这台机器加入集群中,以Follow角色连接上Leader服务器后,Leader服务器会根据自己服务器上最后提交的proposal来和Follow服务器的proposal进行比对,比对的结果肯定是Leader要求Follow进行一个回退操作,回退到一个确实已经被集群中过半机器提交的最新proposal。
ZAB协议特性:
1、ZAB协议需要确保那些已经在Leader服务器上提交(commit)的事务最终被所有的服务器提交
2、ZAB协议需要确保丢弃那些只在Leader上被提出的事务(只是被提出还没有被提交)
理解ZAB协议的更多相关文章
- 搞懂分布式技术4:ZAB协议概述与选主流程详解
搞懂分布式技术4:ZAB协议概述与选主流程详解 ZAB协议 ZAB(Zookeeper Atomic Broadcast)协议是专门为zookeeper实现分布式协调功能而设计.zookeeper主要 ...
- zookeeper核心之ZAB协议就这么简单!
背景 我们都知道 Zookeeper 是基于 ZAB 协议实现的,在介绍 ZAB 协议之前,先回顾一下 Zookeeper 的起源与发展. Zookeeper 究竟是在什么样的时代背景下被提出?为了解 ...
- Zookeeper ZAB 协议分析
前言 ZAB 协议是为分布式协调服务 ZooKeeper 专门设计的一种支持崩溃恢复的原子广播协议.在 ZooKeeper 中,主要依赖 ZAB 协议来实现分布式数据一致性,基于该协议,ZooKeep ...
- zookeeper 入门系列-理论基础 – zab 协议
上一章讨论了paxos算法,把paxos推到一个很高的位置.但是,paxos有没有什么问题呢?实际上,paxos还是有其自身的缺点的: 1. 活锁问题.在base-paxos算法中,不存在leader ...
- zookeeper 负载均衡 核心机制-实现原理 包含ZAB协议(滴滴,阿里面试)
面试也经常问kafka的原理,以及zookeeper与kafka原理的区别:kafka 数据一致性-leader,follower机制与zookeeper的区别: zookeeper是如何实现负载均衡 ...
- Zookeeper ZAB 协议分析[转]
写在开始:这是我找到一篇比较好的博客,转载到这来进行备份原文参考: Zookeeper ZAB 协议分析 前言 ZAB 协议是为分布式协调服务 ZooKeeper 专门设计的一种支持崩溃恢复的原子广播 ...
- Zookeeper概念学习系列之zab协议
不多说,直接上干货! 上一章讨论了paxos算法,把paxos推到一个很高的位置. Zookeeper概念学习系列之paxos协议 但是,paxos有没有什么问题呢?实际上,paxos还是有其自身的缺 ...
- Zookeeper——一致性协议:Zab协议
Reference: https://www.jianshu.com/p/2bceacd60b8a 什么是Zab协议 Zab 协议的作用 Zab 协议原理 Zab 协议核心 Zab 协议内容 原子广播 ...
- Zab协议 (史上最全)
文章很长,建议收藏起来,慢慢读! 疯狂创客圈为小伙伴奉上以下珍贵的学习资源: 疯狂创客圈 经典图书 : <Netty Zookeeper Redis 高并发实战> 面试必备 + 大厂必备 ...
随机推荐
- poj 2299 Ultra-QuickSort 归并排序求逆序数对
题目链接: http://poj.org/problem?id=2299 题目描述: 给一个有n(n<=500000)个数的杂乱序列,问:如果用冒泡排序,把这n个数排成升序,需要交换几次? 解题 ...
- Oracle查看所有表空间的数据使用情况
-- 查看所有表空间的数据使用情况 SELECT Upper(F.TABLESPACE_NAME) "表空间名", D.TOT_GROOTTE_MB "表空间大小(M)& ...
- 转 windows10 U盘系统启动盘怎么制作
转 windows10 U盘系统启动盘怎么制作 现将http://jingyan.baidu.com/article/9f7e7ec05e24d56f29155455.html 将dvd 写入 is ...
- 451 Sort Characters By Frequency 根据字符出现频率排序
给定一个字符串,请将字符串里的字符按照出现的频率降序排列.示例 1:输入:"tree"输出:"eert"解释:'e'出现两次,'r'和't'都只出现一次.因此' ...
- Matrix Transformation codechef 数学题
https://www.codechef.com/problems/MTRNSFRM 我只能说codechef的题好劲爆,这题居然是easy的题,太可怕了.而且还有一点就是codechef的题解很难看 ...
- .net 环境下c# 通信
.net环境下通信主要掌握 通信协议(UDP&TCP). 网络抓包工具().:使用方法 点对点通信,IP组播,广播通信 c#中结构体转为字节流方式 c#结构体与c++结构体转换对应关系 开源的 ...
- 安装CentOS--设置网络_2
(1)虽然CentOS 7已经可以联网,但是在日常的运维工作中,我们是需要手动给Linux系统设置IP地址的.输入如下命令. # vi /etc/sysconfig/network-scripts/i ...
- CentOS 7 下用 firewall-cmd / iptables 实现 NAT 转发供内网服务器联网
自从用 HAProxy 对服务器做了负载均衡以后,感觉后端服务器真的没必要再配置并占用公网IP资源. 而且由于托管服务器的公网 IP 资源是固定的,想上 Keepalived 的话,需要挤出来 3 个 ...
- CCF|最小差值|Java
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner in = ...
- 重构31-Replace conditional with Polymorphism(多态代替条件)
多态(Polymorphism)是面向对象编程的基本概念之一.在这里,是指在进行类型检查和执行某些类型操作时,最好将算法封装在类中,并且使用多态来对代码中的调用进行抽象. public class O ...