写点什么

大数据 -31 ZooKeeper 内部原理 Leader 选举 ZAB 协议

作者:武子康
  • 2025-07-05
    美国
  • 本文字数:3557 字

    阅读完需:约 12 分钟

大数据-31 ZooKeeper 内部原理 Leader选举 ZAB协议

点一下关注吧!!!非常感谢!!持续更新!!!

🚀 AI 篇持续更新中!(长期更新)

AI 炼丹日志-29 - 字节跳动 DeerFlow 深度研究框斜体样式架 私有部署 测试上手 架构研究,持续打造实用 AI 工具指南!📐🤖

💻 Java 篇正式开启!(300 篇)

目前 2025 年 07 月 02 日更新到:Java-61 深入浅出 分布式服务 一致性算法 Raft 多图详解 MyBatis 已完结,Spring 已完结,Nginx 已完结,Tomcat 已完结,分布式服务正在更新!深入浅出助你打牢基础!

📊 大数据板块已完成多项干货更新(300 篇):

包括 Hadoop、Hive、Kafka、Flink、ClickHouse、Elasticsearch 等二十余项核心组件,覆盖离线+实时数仓全栈!大数据-278 Spark MLib - 基础介绍 机器学习算法 梯度提升树 GBDT 案例 详解


章节内容

上一节我们完成了:


  • 新建 Java 的 Maven 工程

  • 使用 Java 调用 ZK 进行操作

  • 创建节点、删除节点、监听节点等操作

背景介绍

这里是三台公网云服务器,每台 2C4G,搭建一个 Hadoop 的学习环境,供我学习。


  • 2C4G 编号 h121

  • 2C4G 编号 h122

  • 2C2G 编号 h123

ZooKeeper 简介

核心特性

  1. 分布式一致性保证

  2. 提供顺序一致性(所有更新请求按顺序执行)

  3. 原子性(更新要么成功要么失败)

  4. 单一系统镜像(无论连接到哪个服务器,客户端看到的数据视图都是一致的)

  5. 可靠性(一旦更新被应用,将保持到被下一次更新覆盖)

  6. 及时性(客户端在一定时间内能看到最新的数据)

  7. 数据模型

  8. 本质上是一个分布式的小文件存储系统,采用类似 Unix 文件系统的树形层次结构(称为 ZNode Tree)

  9. 每个节点(ZNode)可以存储少量数据(默认上限 1MB)

  10. 节点分为持久节点(PERSISTENT)和临时节点(EPHEMERAL),后者在会话结束后自动删除

  11. 监控机制(Watcher)

  12. 客户端可以注册监听特定节点的变化

  13. 当节点数据变更或子节点列表变化时会触发通知

  14. 采用一次触发机制,收到通知后需要重新注册

典型应用场景

  1. 统一命名服务

  2. 如 Dubbo 服务注册中心,服务提供者将服务地址注册到 ZooKeeper

  3. 消费者从 ZooKeeper 获取可用的服务列表

  4. 示例:/dubbo/com.example.Service/providers 目录下存储服务提供者 URL

  5. 分布式配置管理

  6. 如 Solr 集群配置同步,所有节点监听配置节点

  7. 配置变更时,管理员更新 ZooKeeper 上的配置数据

  8. 各节点收到变更通知后自动获取新配置

  9. 示例:/solr/configs/mycore 目录存储核心配置

  10. 分布式消息队列

  11. 实现发布/订阅模式(Pub/Sub)

  12. 生产者创建顺序节点作为消息

  13. 消费者监听父节点获取新消息

  14. 示例:/queue/msg-0000000001,/queue/msg-0000000002

  15. 分布式锁

  16. 实现互斥锁:多个客户端竞争创建同一个临时节点,成功创建的获得锁

  17. 实现共享锁:通过节点顺序特性实现读写锁

  18. 锁释放:会话结束自动删除临时节点或主动删除

  19. 集群管理

  20. 监控集群节点存活状态(通过临时节点)

  21. 选举主节点(通过节点序号最小的成为 Master)

  22. 示例:/cluster/node1(临时节点)自动消失表示节点下线

Leader 选举

选举机制

  • 半数机制:集群中半数以上机器存活,集群可用。所以 ZooKeeper 适合奇数台。

  • ZooKeeper 虽然在配置文件中没有指定 Master 和 Slave,但是ZK在工作的时候,会有一个Leader其他的都是Follower

首次启动

假设有五台集群的机器:



  • 服务1启动,此时只有它一台启动了,它发出去的报文没有任何响应,所以一直是LOOKING状态

  • 服务2启动,它最开始启动的服务1进行通信,互相交换自己的选举结果。由于两者都没有历史数据,所以 ID 值较大的服务 2 胜出。但是目前还没有超过半数的服务同意,所以服务1服务2都是LOOKING状态

  • 服务3启动,服务 3 成了 1、2、3 的老大,集群中>=2台选了3,所以服务 3 成了 Leader。

  • 服务4启动,服务 4 应该是 1、2、3 的老大,但是集群已经选了3为老大,所以4只可以做Follower

  • 服务5启动,同 4。

非首次启动

每次选举的时候都会根据自身的事务ID优先选择事务ID大的为 Leader。

ZAB 一致性协议详解

ZAB 协议介绍

ZAB(ZooKeeper Atomic Broadcast)是 Apache ZooKeeper 的核心一致性协议,专门为协调服务设计的一种高效原子广播协议。它既是 ZooKeeper 的使用场景,也是其底层实现机制。


ZooKeeper 作为分布式协调服务的工业级解决方案,其核心要解决的就是分布式一致性问题。在理论基础层面,Paxos 算法被认为是解决分布式一致性问题的经典算法,而 ZAB 则是 Paxos 算法在 ZooKeeper 中的具体实现和优化版本。


ZAB 协议的主要特点包括:


  1. 原子性(Atomic):消息要么被所有节点成功接收,要么全部失败

  2. 顺序性(Sequential):所有消息严格按照全局顺序进行广播和接收

  3. 可靠性(Reliable):确保消息最终会被所有节点接收

  4. 高吞吐(High Throughput):优化了广播过程,提高了系统性能

数据一致性问题详解

分布式数据复制的必要性

在分布式系统中,数据一致性问题产生的根本原因在于数据复制带来的好处与挑战:


  1. 高可用性

  2. 通过将数据复制到多台机器上,可以消除单点故障

  3. 典型场景:当主服务器宕机时,备份服务器可以立即接管服务

  4. 示例:金融系统的交易记录通常会在多个数据中心进行备份

  5. 负载均衡

  6. 地理分布的数据副本可以就近服务用户请求

  7. 提高系统吞吐量和响应速度

  8. 应用场景:CDN 网络中的内容分发就是典型例子

  9. 容灾备份

  10. 多副本可以防止自然灾害导致的数据永久丢失

  11. 实践案例:跨国企业通常会在不同大洲设立数据中心

数据不一致的产生原因

虽然数据复制带来诸多优势,但也引入了数据一致性问题:


  1. 网络延迟

  2. 副本间同步存在网络传输延迟

  3. 示例:跨大西洋的数据同步可能需要数百毫秒

  4. 节点故障

  5. 部分节点可能暂时不可用

  6. 典型情况:服务器维护期间无法接收更新

  7. 并发写入

  8. 多个客户端同时修改不同副本

  9. 场景示例:电商秒杀活动时的库存更新

  10. 时序问题

  11. 操作顺序在不同节点上可能不一致

  12. 典型案例:银行转账的先后顺序影响最终余额


这些因素共同导致了分布式系统中的"CAP 三角"难题,即在一致性(Consistency)、可用性(Availability)和分区容错性(Partition Tolerance)之间必须做出取舍。ZAB 协议正是在这样的背景下被设计出来,在保证分区容错性的前提下,优先确保强一致性。


比如常见于 主从复制的时候


主备模式

ZK 中,所有客户端写入数据都是写入Leader,由Leader复制到Follower中。


广播消息

ZAB 协议的消息广播过程采用了一种优化的二阶段提交机制,包含以下详细步骤:


  1. 提案阶段(Proposal Phase)

  2. 当客户端发起写请求时,Leader 节点会为这个请求分配一个全局唯一的 ZXID(事务 ID)

  3. Leader 将请求封装成一个事务 Proposal,包含以下内容:

  4. 事务操作内容

  5. 事务 ID(ZXID)

  6. 时间戳

  7. 通过 FIFO 通道将 Proposal 发送给所有 Follower 节点

  8. 确认阶段(Acknowledge Phase)

  9. 每个 Follower 接收到 Proposal 后:

  10. 先写入本地事务日志

  11. 然后向 Leader 发送 ACK 响应

  12. Leader 需要等待集群中超过半数节点(包括自己)的 ACK 响应

  13. 例如在 5 节点集群中需要至少 3 个 ACK

  14. 提交阶段(Commit Phase)

  15. 当获得足够 ACK 后,Leader 会:

  16. 首先在本地执行 Commit 操作,将提案应用到状态机

  17. 然后向所有 Follower 发送 Commit 消息

  18. Follower 收到 Commit 消息后:

  19. 将提案正式应用到本地状态机

  20. 向客户端返回响应


这种设计确保了:


  • 数据一致性:只有多数节点确认的提案才会被提交

  • 高可用性:即使少数节点故障,集群仍可正常工作

  • 顺序性:通过 ZXID 保证所有节点的执行顺序一致


与经典二阶段提交的区别在于:


  • 不需要等待所有节点响应,只需多数派

  • 引入了事务 ID 机制保证顺序

  • Leader 有最终决定权,避免阻塞


发送Proposal到Follower



Leader接收Follower的ACK



超过半数ACK则进行Commit


Leader 宕机处理机制

当 ZooKeeper 集群中的 Leader 节点发生故障时,整个系统会进入异常状态。ZAB(ZooKeeper Atomic Broadcast)协议专门设计了应对这种情况的机制,确保集群能够快速恢复并保持数据一致性。

Leader 宕机的影响

  1. 服务中断:在 Leader 选举完成前,集群将暂时无法处理写请求

  2. 客户端连接:客户端会收到"ConnectionLoss"异常,需要重试或等待

  3. 事务处理:正在进行的事务可能会被中断

ZAB 协议的恢复机制

ZAB 协议通过以下方式保证数据一致性:

1. 已提交事务的保证

  • 对于已经被 Leader 提交的事务(即获得集群多数节点 ACK 确认的事务)

  • 新选举出的 Leader 会确保这些事务最终在所有 Follower 节点上提交

  • 实现方式:通过事务 ID(ZXID)比对和事务日志同步


示例流程


  1. 新 Leader 选举成功后,会检查自己的事务日志

  2. 与其他 Follower 节点对比 ZXID,确定最新已提交的事务

  3. 通过广播方式让所有节点同步缺失的事务

2. 未完成事务的处理

  • 对于只在 Leader 节点提交/复制但未获得多数确认的事务

  • 这些事务会被新 Leader 主动丢弃

  • 实现原理:遵循"超过半数"原则,确保数据一致性


典型场景:假设集群有 5 个节点(A 为 Leader),当 A 在处理事务 T 时:


  • 若 A 只将 T 同步给了 B 然后就宕机了(仅 2/5 节点知道 T)

  • 新 Leader 选举时会发现 T 未获得多数确认

  • T 将被视为无效事务而丢弃

Leader 选举过程

ZAB 协议采用以下选举算法:


  1. 选举触发:节点发现与 Leader 失去连接时会发起选举

  2. 投票机制:每个节点投票给 ZXID 最大的节点

  3. 选举完成:当某个节点获得多数票时成为新 Leader

  4. 数据同步:新 Leader 会与其他节点同步数据状态


选举通常能在 200-400ms 内完成,确保快速恢复服务。

发布于: 刚刚阅读数: 4
用户头像

武子康

关注

永远好奇 无限进步 2019-04-14 加入

Hi, I'm Zikang,好奇心驱动的探索者 | INTJ / INFJ 我热爱探索一切值得深究的事物。对技术、成长、效率、认知、人生有着持续的好奇心和行动力。 坚信「飞轮效应」,相信每一次微小的积累,终将带来深远的改变。

评论

发布
暂无评论
大数据-31 ZooKeeper 内部原理 Leader选举 ZAB协议_Java_武子康_InfoQ写作社区