一文讲透 Zab 协议:恢复模式 + 广播模式到底是什么



面试官微微一笑:"你说你用过 ZooKeeper,那我问你个简单的ZooKeeper 是怎么保证主从节点状态同步的? "

如果你当时只回答了三句话:

  • "靠 Zab 协议。"
  • "有 Leader、有 Follower。"
  • "广播同步。"

恭喜你,这题你只答对了 30% 。真正能让面试官点头的,是你能不能把 恢复模式、广播模式、原子广播、状态一致性 这一整套逻辑,讲清楚、讲透彻。

来,我今天给你讲个故事。

先讲个故事:古代王朝 + 快递驿站

把 ZooKeeper 想象成一个古代王朝的信息系统

  • Leader:皇帝
  • Follower:地方官
  • Observer:旁听官(不投票)
  • 数据变更请求:圣旨
  • Zab 协议:驿站传令制度

这个王朝有一个铁律 :不管地方官有多少,全国必须对"当前政令"达成一致认知

否则就会出现:

  • 京官说税率是 10%
  • 江南说税率是 8%
  • 西北还停留在去年的政策

这王朝早就乱套了。ZooKeeper 面临的,正是同样的问题

ZooKeeper 的核心武器:原子广播机制(Atomic Broadcast)

ZooKeeper 能保证主从状态同步,靠的不是魔法,而是一句话:ZooKeeper 的核心是原子广播机制(Atomic Broadcast)。

什么叫「原子」?

原子,意味着:

  • 要么所有节点都成功
  • 要么所有节点都失败
  • 不允许「一半知道、一半不知道」

在 ZooKeeper 里,这个机制由一个协议实现:Zab 协议(ZooKeeper Atomic Broadcast)

Zab 协议不是一直工作的,它有两种模式

很多人面试时会漏掉这一点。Zab 不是从头到尾一个模式,而是两个阶段切换的协议。

一句话总结:先对齐状态,再对外广播。

下面,我们一个一个讲。

恢复模式:先把队伍拉齐

1、什么时候会进入恢复模式?

恢复模式并不是天天跑,它只在关键时刻出现:

  • ZooKeeper 集群刚启动
  • Leader 崩溃,需要重新选举
  • 新节点加入集群

换成王朝故事就是:皇帝驾崩了,或者刚刚登基,第一件事不是发圣旨,而是先确认全国的政令版本。

2、恢复模式的核心目标是什么?

一句话:状态同步。

ZooKeeper 要做三件事:

  1. 选出新的 Leader
  2. Leader 与大多数 Follower 对齐数据
  3. 确保系统状态一致

只有当:超过半数的 Server 和 Leader 数据一致, 恢复模式才算完成。

3、Leader 到底在同步什么?

不是简单的"我拷贝你一下"。

ZooKeeper 同步的是:

  • 事务日志(zxid)
  • 最新已提交的事务
  • 未提交但可能已广播的事务

我们用一张表看得更清楚:

zxid 是关键中的关键。

4、zxid:ZooKeeper 的"时间轴"

zxid = epoch + counter

  • epoch:领导者任期
  • counter:该任期内的事务序号

举个例子:

0x00000002_0000000A

表示:

  • 第 2 任 Leader
  • 第 10 条事务

zxid 越大,数据越新。

恢复模式下,Leader 会用 zxid 判断:"谁的数据最新,我以谁为准。"

5、恢复模式结束的条件(面试必考)

面试官经常会追问一句:什么时候恢复模式才算结束?

标准答案是:当 Leader 已经和大多数 Follower 完成状态同步后,恢复模式结束。

不是全部,是大多数(Quorum) 。这也是 ZooKeeper CAP 取舍 的体现。

广播模式:开始正式对外服务

当恢复模式完成后,ZooKeeper 会进入它最常驻的状态:Broadcast(广播模式)

1、广播模式在干什么?

一句话:所有写请求,都由 Leader 发起原子广播。

流程如下:

2、广播流程拆解(面试高分点)

我们一步一步看。

第一步:客户端发请求

无论你连的是 Leader 还是 Follower:最终写请求都会被转发到 Leader

第二步:Leader 提案(Proposal)

Leader 给事务分配 zxid,并生成 Proposal。

第三步:Follower ACK

Follower 收到 Proposal 后:

  • 写入本地日志
  • 返回 ACK

第四步:Leader 提交(Commit)

当 Leader 收到超过半数 ACK

Leader 宣布事务提交,并再次广播 Commit。

第五步:Follower 应用事务

Follower 收到 Commit:

至此,主从状态完全一致

3、为什么一定要"过半确认"?

这是 ZooKeeper 保证一致性的根基。

过半机制 = 一致性的安全底线。

新节点加入,为什么不会把集群搞乱?

这是很多人忽略,但面试官爱问的点。

新节点加入流程:

  1. 新 Server 启动
  2. 发现 Leader
  3. 进入恢复模式
  4. 与 Leader 做状态同步
  5. 同步完成后,进入广播模式

注意:新节点加入,不会打断正在运行的广播模式。 它是"悄悄补课,补完再上岗"。

两种模式对比总结(建议直接背)

一句话终极总结(面试王炸)

如果面试官只给你 10 秒:

ZooKeeper 通过 Zab 协议的原子广播机制,在恢复模式下完成状态对齐,在广播模式下通过过半确认提交事务,从而保证主从节点状态始终一致。

如果你想更狠一点:Zab 的本质,是"先对齐历史,再同步未来"。

唠叨一句

很多人用 ZooKeeper 用了三年:

  • 会配
  • 会用
  • 会改配置

但一问:"主从状态怎么保证一致?"

却只能回答一句:"靠 Zab 协议。"

面试拼的不是"你知道",而是"你能不能讲明白"。

END

希望这篇文章,能让你在下一次面试中【不慌】、【不虚】,还能反问一句:"要不要我把 Zab 的恢复流程画给你看?"

老规矩,点个赞,我们继续把面试官"讲服"。

我是小米,一个喜欢分享技术的31岁程序员。如果你喜欢我的文章,欢迎关注我的微信公众号"软件求生",获取更多技术干货!

相关推荐
长栎4 小时前
写 for 循环写了十年,你却从没用过迭代器模式最狠的那一面
后端
LiaCode5 小时前
Redis 在生产项目的使用
前端·后端
用户559822481225 小时前
Docker Compose Down 导致容器数据误删——ext4 日志恢复全记录
后端
LiaCode5 小时前
一天学完 redis 的爽翻版核心知识总结
前端·后端
大刚测试开发实战5 小时前
如何内网穿透访问本地私有化部署的TestHub
前端·后端·github
xiaodaoluanzha5 小时前
迄今為止,最簡單的編程語言 Nolang
前端·后端
Csvn5 小时前
Docker 容器管理入门 — 从镜像到容器编排
后端
用户762352425915 小时前
ShardingJDBC
后端
行者全栈架构师5 小时前
IDEA 中 Maven 项目的 15 个红色报错快速解决方法
java·后端
假如让我当三天老蒯5 小时前
前端跨域解决方案(学习用)
前端·javascript·面试