Zookeeper集群ZAB协议

ZAB协议

ZAB 协议全称:Zookeeper Atomic Broadcast(Zookeeper 原子广播协议)。

Zookeeper 是一个为分布式应用提供高效且可靠的分布式协调服务。在解决分布式一致性方面,Zookeeper 并没有使用 Paxos ,而是采用了 ZAB 协议,ZAB是Paxos算法的一种简化实现。

定义

ZAB 协议是为分布式协调服务 Zookeeper 专门设计的一种支持 崩溃恢复原子广播 的协议。整个 Zookeeper 就是在这两个模式之间切换。 即当 Leader 服务可以正常使用,就进入消息广播模式,当 Leader 不可用时,则进入崩溃恢复模式。

基于该协议,Zookeeper 实现了一种 主备模式 的系统架构来保持集群中各个副本之间数据一致性

所有客户端写入数据都是写入到Leader节点,然后,由 Leader 复制到Follower节点中,从而保证数据一致性。

复制过程类似两阶段提交(2PC),ZAB 只需要 Follower(含leader自己的ack) 有一半以上返回 Ack 信息,就可以执行提交,大大减小了同步阻塞,也提高了可用性。

消息广播

ZAB 协议的消息广播过程使用的是一个原子广播协议,类似一个两阶段提交过程。对于客户端发送的写请求,全部由 Leader 接收,Leader 将请求封装成一个事务 Proposal,将其发送给所有 Follwer ,然后,根据所有Follwer 的反馈,如果超过半数(含leader自己)成功响应,则执行 commit 操作。

数据一致性

  • Leader 在收到客户端请求之后,会将这个请求封装成一个事务,并给这个事务分配一个全局递增的唯一 ID,称为事务 ID(ZXID),ZAB 协议需要保证事务的顺序,因此必须将每一个事务按照 ZXID 进行先后排序然后处理,主要通过消息队列实现。
  • 在 Leader 和 Follwer 之间还有一个消息队列,用来解耦他们之间的耦合,解除同步阻塞。
  • zookeeper集群中为保证任何所有进程能够有序的顺序执行,只能是 Leader 服务器接受写请求,即使是Follower 服务器接受到客户端的写请求,也会转发到 Leader 服务器进行处理,Follower只能处理读请求。
  • ZAB协议规定了如果一个事务在一台机器上被处理(commit)成功,那么应该在所有的机器上都被处理成功,哪怕机器出现故障崩溃。

崩溃恢复

指的是在消息广播过程中,Leader 崩溃,如何保证数据一致性,崩溃指的是Leader 失去与过半 Follwer 的联系

崩溃类型

  • Leader 在复制数据给所有 Follwer 之后,还没来得及收到Follower的ack返回就崩溃
  • Leader 在收到 ack 并提交了自己,同时发送了部分 commit 出去之后崩溃

规则定义

针对这些问题,ZAB 定义了 2 个原则

  1. ZAB 协议确保丢弃那些只在 Leader 提出/复制,但没有提交的事务
  2. ZAB 协议确保那些已经在 Leader 提交的事务最终会被所有服务器提交

选举算法

其目的在于能够确保提交已经被 Leader 提交的事务,同时丢弃已经被跳过的事务。

其实现在于让 Leader 选举算法能够保证新选举出来的 Leader 服务器拥有集群中所有机器 ZXID 最大的事务,以此来保证这个新选举出来的 Leader 一定具有所有已经提交的事务数据

这样处理的优点是可以省去 Leader 服务器检查事务的提交和丢弃工作的这一步操作

数据同步

当崩溃恢复之后,需要在正式工作之前(接收客户端请求),Leader 服务器首先确认事务是否都已经被过半的 Follwer 提交了,即是否完成了数据同步,目的是为了保持数据一致。

当 Follwer 服务器成功同步之后,Leader 会将这些服务器加入到可用服务器列表中。

ZXID

Leader 服务器处理或丢弃事务都是依赖着 ZXID 的,在 ZAB 协议的事务编号 ZXID 设计中,ZXID 是一个 64 位的数字。

低 32 位

其中低 32 位可以看作是一个简单的递增的计数器,针对客户端的每一个事务请求,Leader 都会产生一个新的事务 Proposal 并对该计数器进行 + 1 操作。

高 32 位

而高 32 位则代表了 Leader 服务器上取出本地日志中最大事务 Proposal 的 ZXID,并从该 ZXID 中解析出对应的 epoch 值(leader选举周期),当一轮新的选举结束后,会对这个值加一,并且事务id又从0开始自增。

高 32 位代表了每代 Leader 的唯一性,低 32 代表了每代 Leader 中事务的唯一性。同时,也能让 Follwer 通过高 32 位识别不同的Leader。简化了数据恢复流程。

基于这样的策略:当 Follower 连接上 Leader 之后,Leader 服务器会根据自己服务器上最后被提交的 ZXID 和 Follower 上的 ZXID进行比对,比对结果要么回滚,要么和 Leader 同步。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值