大数据修炼之路(一): ZooKeeper学习
一、 核心基石:从 Paxos 到 ZAB 的演进
ZooKeeper 的核心是保证分布式环境下的数据一致性,其理论基石是 Paxos 算法,但真正落地使用的是 ZAB 协议。
1. Paxos 算法(理论奠基)
Paxos 解决了分布式系统中“如何在网络不可靠、节点可能宕机的情况下,对某个值达成一致”的问题。
- 核心角色:
- 提议者(Proposer):也叫协调者,负责接受客户端请求并发起提案(包含提案编号 Proposal ID + 提议的值 Value)。
- 接受者(Acceptor):也叫投票员,负责对提案进行投票,需超过半数(Quorum 法定人数)同意才能通过,并记住自己的投票历史。
- 学习者(Learner):不参与投票,只负责学习已被选定的值。
- 核心机制:
- 过半原则:超过一半的 Acceptor 同意,提案才能生效。
- 提案编号:保证唯一且递增,编号大的提案会覆盖编号小的提案(解决活锁问题)。
- 单点故障与脑裂:传统 Paxos 可能产生“多主(脑裂)”或“主节点单点故障”,因此工程落地需要改进。
2. ZAB 协议(工程落地)
ZooKeeper 基于 Paxos 的思想,专门为“主备复制”场景定制了 ZAB(ZooKeeper Atomic Broadcast)协议。它强调全局有序,并引入了主节点(Leader)概念。
- Paxos 与 ZAB 的区别:
- Paxos 是乱序的(值达成一致即可),ZAB 是全局有序的(保证所有节点按相同顺序执行)。
- ZAB 强制要求存在 Leader,所有写请求必须由 Leader 发起,彻底避免了 Paxos 的多主冲突。
- 核心概念对应(你笔记中的精华):
- 事务编号(ZXID) = 你的“会议ID”。相当于 Paxos 的 Proposal ID,是 64 位整数(高 32 位是 Epoch,低 32 位是递增计数器)。ZXID 越大,说明数据越新。
- 数字编号(myid) = 你的“议员ID”。服务器在集群中的唯一标识(1~255)。
- Epoch(纪元/朝代编号) = 全局单调递增的整数。每选举出一个新主就生成一个新 Epoch,用来标识当前主的执政周期,避免旧主/旧提案干扰当前共识流程。
二、 ZAB 协议的运行机制(崩溃恢复与原子广播)
ZAB 协议包含两种模式:崩溃恢复(选主)和原子广播(数据同步)。
1. 崩溃恢复(选主过程)
当集群启动或 Leader 宕机时,进入 LOOKING 状态,开始选主:
- 投票规则(非常关键):议员会把票投给“事务编号(ZXID)和数字编号(myid)都大于自己”的议员。
- 比较顺序:先比较 ZXID,如果 ZXID 相同,再比较 myid。这样既能保证选出的 Leader 数据最全(ZXID最大),又能在数据相同时快速选出结果(myid最大)。
- 过半原则:获得超过半数(Quorum)选票的节点才能当选 Leader。
2. 原子广播(提议流程)
选主成功后,进入原子广播模式,采用两阶段协议:
- 第一阶段(广播):Leader 收到写请求,生成 Proposal,广播给所有 Follower。
- 第二阶段(提交):Follower 收到 Proposal 后,写入本地日志并返回 ACK。当 Leader 收到过半 ACK 后,发送 Commit 消息,所有节点执行该请求。
- 数据同步:Follower 只需从 Leader 同步数据。
三、 集群角色与状态
1. 三种角色
| 角色 | 核心职责 | 是否参与投票(选主/提案) | 是否处理写请求 | 是否处理读请求 |
|---|---|---|---|---|
| Leader | 事务请求的唯一调度者和处理者,保证集群事务处理的顺序性 | ✅ 发起投票 | ✅ 接收写请求 | ✅ |
| Follower | 处理客户端非事务请求,转发事务请求给Leader | ✅ 参与投票 | ❌(转发给Leader) | ✅ |
| Observer | 只提供非事务服务(查询),不影响集群事务处理能力 | ❌ 不参与投票 | ❌ | ✅ |
2. 三种状态
- LOOKING:选举状态,初始状态都是 LOOKING。
- FOLLOWER:Follower 和 Leader 保持同步时的状态。
- LEADING:Leader 作为主进程领导者的状态。
Follower 和 Observer 区别?为什么要有 Observer?
- 区别:Observer 不参与任何投票(不参与选主,也不参与提案投票)。
- 为什么要有它? “节点越多业务能力越强,但是选举速度也会越慢。”
- 如果单纯增加 Follower 来提升读吞吐量,会导致投票人数增加,选举变慢、写性能下降(过半机制需要更多节点响应)。
- 引入 Observer 后,可以在不增加选举和投票压力的情况下,无限横向扩展读性能(因为 Observer 不投票,只是旁听和同步数据)。这完美解决了“读多写少”场景下的集群扩展问题。
四、 文件系统与监听机制
1. ZNode(文件系统)
- 树状结构,类似 Linux 目录,但每个节点可以存少量数据(默认 1MB)。
- 节点类型:持久节点、临时节点、顺序节点、临时顺序节点。
- 核心特性:临时节点(-e)在客户端会话断开后自动删除;顺序节点(-s)会自动在名字后加递增序号(如
/java0000000001)。
2. Watcher(监听通知机制)
- 特点:一次性触发(触发后失效,需重新注册)、异步通知、轻量级(只告诉变了,不告诉具体值)。
- 应用:配置中心动态更新、服务上下线感知、分布式锁竞争。
五、 面试题精讲(附带标准答案)
- ZooKeeper 集群中有哪些角色,分别有什么作用?
- 答:Leader(处理写请求+发起投票)、Follower(处理读请求+参与投票+转发写请求)、Observer(处理读请求,不参与投票,用于扩展读性能)。
- 说说 ZooKeeper Znode 的特点?
- 答:树状结构,存少量数据(默认 1MB);支持持久、临时、顺序、临时顺序四种节点类型;临时节点在会话断开后自动删除;顺序节点自动添加递增序号。
- 说说 ZooKeeper 的监听通知机制?
- 答:Watcher 机制,客户端注册监听,服务端数据变化时异步通知。特点是一次性触发(触发后失效需重新注册)、轻量级、保证顺序。
- 说一下 CAP 原则以及如何选择?
- 答:C(consistency)、A(availability)、P(partition tolerance)。分布式系统必须满足 P,然后在 C 和 A 之间取舍。ZooKeeper 选择的是 CP(保证强一致性,牺牲部分可用性,当集群过半节点不可用时,整个集群不可用)。
- ZooKeeper 的选主过程?
- 答:进入 LOOKING 状态,各节点发起投票。投票规则:先比较 ZXID,ZXID 大的优先;ZXID 相同,再比较 myid,myid 大的优先。获得超过半数选票的节点当选 Leader。
- ZooKeeper 如何帮助其他组件选主?(大数据面试核心考点)
- 答:ZooKeeper 利用临时顺序节点和Watcher 机制。各组件节点抢占创建临时顺序节点,序号最小的节点成为主节点(如 Hadoop HA 的 Active NameNode、Kafka 的 Controller)。主节点宕机后临时节点消失,触发 Watcher 重新选主。
总结一句话:
ZooKeeper 本质是一个 分布式协调软件。它通过 ZAB 协议 保证强一致性,利用 ZNode + Watcher 提供协调服务,帮助 Hadoop、Kafka 等大数据组件解决选主、配置同步、分布式锁等核心问题。
: ZooKeeper学习&spm=1001.2101.3001.5002&articleId=165001094&d=1&t=3&u=3a1c6a97efde4e9abbf4b69ad0860ad9)
1679

被折叠的 条评论
为什么被折叠?



