理解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 高并发实战> 面试必备 + 大厂必备 ...
随机推荐
- 【react native】有关入坑3个月RN的心路历程
由于一些原因,笔者最近变更到了RN的团队,回归到了hybrid app的开发的圈子中,固然是有蛮多新鲜感和新机遇的,不过遥想起以前在hybrid中各种view之前跳转的头疼等各种问题,笔者怀着忐忑的心 ...
- Kuskal/Prim POJ 1789 Truck History
题目传送门 题意:给出n个长度为7的字符串,一个字符串到另一个的距离为不同的字符数,问所有连通的最小代价是多少 分析:Kuskal/Prim: 先用并查集做,简单好写,然而效率并不高,稠密图应该用Pr ...
- electron打包整理
最近在折腾把项目打包成桌面应用程序,发现一个工具electron,可以讲项目打包成一个跨平台的应用程序,很方便,来学习一下. 1.先安装electron.electron-packager,安装方法可 ...
- [转]mysql日志详细解析
转自:http://pangge.blog.51cto.com/6013757/1319304 MySQL日志: 主要包含:错误日志.查询日志.慢查询日志.事务日志.二进制日志: 日志是mysql数据 ...
- Abp Framework中文文档上线
感谢 ABP框架中国小组 给我们带来的ABP中文翻译,Web+为方便广大学习爱好者随时查阅,现推出了Gitbook风格的在线阅读文档:http://www.webplus.org.cn/documen ...
- Collection接口框架图
Java集合大致可分为Set.List和Map三种体系,其中Set代表无序.不可重复的集合:List代表有序.重复的集合:而Map则代表具有映射关系的集合.Java 5之后,增加了Queue体系集合, ...
- MySQL学习随笔--通过实例理解merge ,temptable算法的差异
实例1 使用视图的两种算法merge和temptable分别统计 表tb_phone中market_price大于4000的手机,然后查询视图查找出小于6000的手机 简单总结最终获取的结果:查询出m ...
- css选择器的对比样式代码精简
通常就分为这三大类:* 选定所有对象.通配选择符(Universal Selector)通常不建议使用通配选择符,因为它会遍历并命中文档中所有的元素,出于性能考虑,需酌情使用一.标签选择器,以开始标签 ...
- Android嵌入式安卓触摸屏|4418开发板平台
核心板参数 尺寸:50mm*60mm 高度:核心板连接器为1.5mm 4418 CPU:ARM Cortex-A9 四核 S5P4418处理器 1.4GHz 6818 CPU:ARM Cortex-A ...
- IE浏览器样式表限制
原文链接:http://caibaojian.com/ie-stylesheet.html 在开发头条上发现的IE浏览器样式限制,算是一个IE浏览器的一个bug吧.主要有4点限制:· IE9及以下单个 ...