Zookeeper ZAB协议

  运维必备技能, 原理
内容纲要

概要描述

ZAB 协议的全称是 Zookeeper Atomic Broadcase,原子广播协议。
ZAB是为了保证Zookeeper数据一致性而产生的算法(指的是Zookeeper集群模式)。它不仅能解决正常情况下的数据一致性问题,还可以保证主节点发生宕机后的数据一致性问题。
通过这个 ZAB 协议可以进行集群间主备节点的数据同步,保证数据的一致性。


详细说明

在讲解 ZAB 协议之前,我们必须要了解 Zookeeper 的各节点的角色。

1.Zookeeper 各节点的角色

Leader
负责处理客户端发送的读、写事务请求
。这里的事务请求可以理解这个请求具有事务的 ACID 特性。
同步写事务请求
给其他节点,且需要保证事务的顺序性。
状态为 LEADING。
Follower
负责处理客户端发送的读请求
转发写事务请求给 Leader。
参与 Leader 的选举。
状态为 FOLLOWING。
FOLLOWING 已经存在leader,当前服务器为跟随者
Observer
和 Follower 一样,唯一不同的是,不参与 Leader 的选举,且状态为 OBSERING。
除非zookeeper集群很大,否则一般没有observer

还有一个特殊状态LOOKING :当前集群没有leader,准备选举

2.投票的依据

投票的依据就是下面的两个id,投票即是给所有服务器发送 (myid,zxid) 信息。
myid:用户在配置文件中自己配置,每个节点都要配置的一个唯一值,从1开始往后累加。

file

file

file

zxid:zxid有64位,分成两部分:
高32位是Leader的epoch:选举时钟,每次选出新的Leader,epoch累加1
低32位是在这轮epoch内的事务id:对于用户的每一次更新操作集群都会累加1。

file

选举优先级:>选举优先级: epoch > counter > myid

Zxid查看方法:echo twzkstat | nc IP 2181

file

Zxid(Transaction id)类似于 RDBMS 中的事务 ID,用于标识一次更新操作的 Proposal(提议)ID。为了保证顺序性,该 zkid 必须单调递增。
注意:zk把epoch和事务id合在一起,每次epoch变化,都将低32位的序号重置,这样做是为了方便对比出最新的数据,保证了zxid的全局递增性

3.关于选举轮次
由于所有有效的投票都必须在同一轮次中。每开始新一轮投票自身的logicClock自增1。
接收到的logicClock大于自己的。说明自己落后了,更新logicClock后正常。 接收到的logicClock小于自己的。忽略该票。 接收到的logickClock与自己的相等,正常判断。
4.关于选票判断
对比自身的和接收到的(myid,zxid)
首先对比zxid高32位的选举时钟epoch 一致则对比zxid低32的事务id 仍然一致则对比用户自己配置的myid 
选完后广播选出的(myid,zxid)
5.关于选举结束
过半服务器选了同一个,则投票结束,根据投票结果更新自身状态为leader或者follower

这篇文章对您有帮助吗?

平均评分 0 / 5. 次数: 0

尚无评价,您可以第一个评哦!

非常抱歉,这篇文章对您没有帮助.

烦请您告诉我们您的建议与意见,以便我们改进,谢谢您。