一文讲透 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岁程序员。如果你喜欢我的文章,欢迎关注我的微信公众号"软件求生",获取更多技术干货!

相关推荐
m0_607076609 小时前
CSS3 转换,快手前端面试经验,隔壁都馋哭了
前端·面试·css3
青云计划10 小时前
知光项目知文发布模块
java·后端·spring·mybatis
Victor35610 小时前
MongoDB(9)什么是MongoDB的副本集(Replica Set)?
后端
NEXT0610 小时前
二叉搜索树(BST)
前端·数据结构·面试
Victor35610 小时前
MongoDB(8)什么是聚合(Aggregation)?
后端
NEXT0610 小时前
JavaScript进阶:深度剖析函数柯里化及其在面试中的底层逻辑
前端·javascript·面试
yeyeye11111 小时前
Spring Cloud Data Flow 简介
后端·spring·spring cloud
Tony Bai12 小时前
告别 Flaky Tests:Go 官方拟引入 testing/nettest,重塑内存网络测试标准
开发语言·网络·后端·golang·php
+VX:Fegn089512 小时前
计算机毕业设计|基于springboot + vue鲜花商城系统(源码+数据库+文档)
数据库·vue.js·spring boot·后端·课程设计
程序猿阿伟12 小时前
《GraphQL批处理与全局缓存共享的底层逻辑》
后端·缓存·graphql