ZAB协议简介
Zookeeper 使用 Zookeeper Atomic Broadcast (ZAB) 协议来保障分布式数据一致性。
ZAB是一种支持崩溃恢复的消息广播协议,采用类似2PC的广播模式保证正常运行时性能,并使用基于 Paxos 的策略保证崩溃恢复时的一致性。
在阅读本文前建议先了解2PC和Paxos
ZAB协议中节点存在四种状态:
- Leading: 当前节点为集群 Leader,负责协调事务
- Following: 当前节点为 Follower 在 Leader 协调下执行事务
- Looking: 集群没有正在运行的 Leader, 正处于选举过程
- Observing: 节点跟随 Leader 保存系统最新的状态提供读服务,但不参与选举和事务投票
因为 Observing 节点不参与事务和选举,因此下文所述节点不包括 Observing 节点
ZAB协议存在两种工作模式:
- 广播模式: 当集群正常运行过程中,Leader 使用广播模式保证各 Follower 节点的一致性
- 恢复模式: 集群启动或 Leader 崩溃时系统进入恢复模式,选举 Leader 并将集群中各节点的数据同步到最新状态
Zookeeper 集群中每个节点都会存储系统数据的完整副本,可以独立处理读请求。
当 Follower 收到写请求时会将其转发给 Leader, Leader 为每个写请求分配唯一的全局有序的事务ID(Zookeeper Transaction Id, ZXID)。
Leader 在广播模式下协调各 Follower 完成事务,并保证集群更新到一致的状态。
一致性保证
ZAB协议保证集群的顺序一致性而不保证强一致性。
即 Leader 依次完成两个事务 A、B 时,不能保证所有 Follower 立即更新到最新状态(不保证强一致性); 只保证所有 Follower 一定时间内会同步到最新状态(保证最终一致性),且任意 Follower 都认为事务A先于事务B完成,不会乱序(保证全局顺序一致性)。
此外,ZAB协议保证来自同一个 Follower 的两个事务 A、B 按照 Follower 发出请求的顺序(而非 Leader 收到请求的顺序)依次执行,不会出现乱序。即保证任意客户端写请求的一致性。
ZXID
ZXID 是 Zookeeper 集群中事务的唯一标识,保证全局有序。
ZXID 是一个 64 位整数, 高32位为周期号(epoch), 每个 Leader 被选举后都会增加 epoch 与上任 Leader 区分。低32位是 Leader 开始事务时分配的递增编号。
ZXID 中的 epoch 可以保证 Leader 崩溃重新选举后被丢弃的事务不会继续执行。
广播模式
广播模式是一个移除了中断逻辑的2PC协议:
- Leader 收到写请求后为其分配一个 ZXID 并生成提案发送给所有 Follower
- Follower 收到提案后写事务日志但不提交,成功后返回 ACK 告知 Leader 可以进行提交。
- Leader 收到过半 Follower 的 ACK 响应后发出 commit 请求执行提交
- Leader 收到过半 Follower 对 commit 请求的 ACK 响应后便认为事务已完成。剩余的 Follower 则会放弃执行此次事务,进入数据同步阶段,与集群达成一致。
ZAB广播模式相对于完整的2PC移除了中断逻辑, 且只要过半 Follower 完成即可不需要等待全部 Follower。
崩溃或网络超时的 Follower 可以直接抛弃 Leader,并在数据同步阶段与集群达成一致,这种做法提高了集群的性能。
因为无法保证所有 Follower 都完成了提交,所以 Zookeeper 无法保证强一致性。
Leader 为每个 Follower 的写请求维护了一个 FIFO 队列以保证顺序一致性,具体实现方式是根据 TCP 报文的序列号确定请求的先后顺序。
恢复模式
当集群启动或者Leader崩溃时,Zookeeper 集群会进入恢复模式选举新的 Leader 并将集群同步至最新状态。
Leader 与过半的 Follower 无法正常通信即视为崩溃
在崩溃恢复过程中需要保证:
- 已执行的事务不能丢失(Never forget delivered messages)
- 未执行的事务不能继续执行(Let go of messages that are skipped)
若 Leader 在 commit 阶段崩溃,根据已完成的事务不能丢失的原则,这些事务应该继续完成。
因为集群中 ZXID 最大的提案是 Leader 崩溃前发出的最新的提案,所以应选择拥有 ZXID 最大的提案的节点做为新的 Leader。
新 Leader 会将自身日志中所有未提交事务重新生成提案并协调集群将其完成, 保证所有被发送的消息(delivered messages)都被处理。
若 Leader 在 proposal 阶段崩溃,根据未执行的事务不能继续的原则,节点应当丢弃这些事务。
当新 Leader 被选举之后会增加 ZXID 的 epoch 值,因此 epoch 值较小的提案可以直接丢弃。
恢复模式分为两个阶段:选举阶段和恢复阶段。
上文已经说明恢复阶段的任务是 Leader 将未提交事务重新生成提案并协调集群将其完成,不再赘述。
选举过程
选举要保证:
- 集群中有且只有一个节点作为 Leader, 该 Leader 可以与集群中过半节点通信
- 新 Leader 拥有 ZXID 最大的提案
在3.4.0后的Zookeeper的版本只保留了TCP版本的FastLeaderElection选举算法
每张选票包含3条信息:
- vote_sid: 推举的服务器ID
- vote_zxid: 推举的服务器的最大ZXID
- epoch: 投票的轮数
发起选举的节点会向所有可通信节点发送第一张选票,推举自己作为 Leader。
收到选票的服务器根据下列规则决定自己的投票:
- 若 epoch 大于自身 epoch 说明上一轮投票已结束,更新自身 epoch 值加入新一轮投票,并清除已结束轮次的数据。
- 选择自身已知 拥有最大ZXID 的服务器作为 Leader。即服务器本地保存(vote_sid, vote_zxid)并初始化为自身(sid, zxid), 若收到的选票中 vote_zxid 更大就更新本地数据,并根据最新数据投出选票。
- 若存在 zxid 相同则选择 sid 最大的服务器(作者认为选择sid最小的也可以)。
若在某轮投票中某个节点收到过半数的相同选票,那么认为该服务器为新的 Leader 投票结束。
因为选举阶段要求服务器收到过半选票才能成为新 Leader, 因此不可能出现集群中存在两个 Leader 的现象。
选举过程是比较典型的 Paxos 算法过程,选举过程中不会产生新的 ZXID, 因此不会出现 Paxos 算法中活锁的现象。
关于ZAB协议的详细内容可以阅读官方论文ZooKeeper’s atomic broadcast protocol: Theory and practice。
ZAB协议简介的更多相关文章
- 分布式协调组件Zookeeper之 选举机制与ZAB协议
Zookeeper简介: Zookeeper是什么: Zookeeper 是⼀个分布式协调服务的开源框架. 主要⽤来解决分布式集群中应⽤系统的⼀致性问题, 例如怎样避免同时操作同⼀数据造成脏读的问题. ...
- Fiddler--一、HTTP协议简介
在学习Fiddler之前,最好先学习一下HTTP协议. HTTP协议简介 什么是HTTP协议 超文本传输协议(HTTP)是一种通信协议,它允许将超文本标记语言(HTML)文档从Web服务器传送到客户端 ...
- MODBUS-RTU通讯协议简介
MODBUS-RTU通讯协议简介 什么是MODBUS? MODBUS 是MODICON公司最先倡导的一种软的通讯规约,经过大多数公司 的实际应用,逐渐被认可,成为一种标准的通讯规约,只要按照这种规 ...
- JavaWeb:Web与HTTP协议简介
JavaWeb:Web与HTTP协议简介 Web的概念 什么是Web: Web是网络上使用最广泛的分布式应用架构. 旨在共享分布在网络上的各个Web服务器中的所有互相连接的信息. 三个特征: 用HTM ...
- ZooKeeper之ZAB协议
ZooKeeper为高可用的一致性协调框架,自然的ZooKeeper也有着一致性算法的实现,ZooKeeper使用的是ZAB协议作为数据一致性的算法,ZAB(ZooKeeper Atomic Broa ...
- 第三章 深入 ZAB 协议
上一节介绍了ZAB协议的内容,本节将从系统模型.问题描述.算法描述和运行分析四方面来深入了解 ZAB 协议. 系统模型 在一个由一组进程 n ={P1,P2,...Pn}组成的分布式系统中,每一个进程 ...
- 第二章 ZAB协议介绍
ZAB ( ZooKeeper Atomic Broadcast , ZooKeeper 原子消息广播协议)是zookeeper数据一致性的核心算法. ZAB 协议并不像 Paxos 算法那样,是一种 ...
- CC2540开发板学习笔记(九)—— BLE协议简介
一.BLE协议简介 1.协议是什么? 协议是一系列的通信标准,双方需要共同按照这进行正常数据 协议是一系列的通信标准,双方需要共同按照这进行正常数据发射和 接收.协议栈是的具体实现形式,通俗点来理解就 ...
- ZAB协议(转)
转自:http://www.cnblogs.com/sunddenly/articles/4073157.html Zab协议 一.ZooKeeper概述 ZooKeeper内部有一个in-mem ...
随机推荐
- Java List中迭代器遍历
在java中,List接口从Collection接口中继承了 iterator()函数,返回值是一个T类型的迭代器(泛型),T是List中元素的类型 public class TestListAndI ...
- 快速入门Vue
前端技术发展很快,近日一个项目中想用Vue框架,对此对Vue基础进行了一些学习整理 何为Vue,官网 解释Vue.js(读音 /vjuː/,类似于 view) 是一套构建用户界面的渐进式框架 这里记录 ...
- kvm-qcow2派生镜像的远程备份的方法!
在虚拟化环境中,关于虚拟机的远程备份是一个比较重要的环节,这个是有关于整个机房挂掉之后,仍然可以恢复的最后一招. 在kvm中这种情况可以通过直接备份虚拟机的镜像文件(qcow2)到远端存储解决. 但有 ...
- 用JavaScript制作简单的计算器
<html > <head> <title>简单计算器</title> <style type="text/css"> ...
- noip第25课资料
- 网络操作系统 第七章 管理TCP/IP网络
本章小结 本章介绍了TCP/IP的相关概念,并且在此处基础上,介绍了Windows Server 2008中使用TCP/IP网络配置工具实现网络连接和管理的方法,在Linux系统中,讲解了是如何使用图 ...
- Mapreduce操作HBase
这个操作和普通的Mapreduce还不太一样,比如普通的Mapreduce输入可以是txt文件等,Mapreduce可以直接读取Hive中的表的数据(能够看见是以类似txt文件形式),但Mapredu ...
- PMP:6.项目进度管理
项目管理包括为项目管理项目按时完成所需的各个过程:
- Java编程题(1):n个数里出现次数大于等于n/2的数
题目描述:输入n个整数,输出出现次数大于等于数组长度一半的数. 输入描述:每个测试输入包含 n个空格分割的n个整数,n不超过100,其中有一个整数出现次数大于等于n/2. 输出描述:输出出现次数大于等 ...
- 学习C++后感
c++是一门系统级语言,记得大一是要学习这门课时还上网找过学习方法.但网上很多学习方法看的我都头晕,都说学习C++很难,有的说学C++前最好先学C语言,有的说学C++最好不要学C语言,当翻了C++课本 ...