写点什么

大数据 -29 ZooKeeper 节点 Watcher 原理 实践指南

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

    阅读完需:约 13 分钟

大数据-29 ZooKeeper 节点 Watcher原理 实践指南

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

🚀 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 案例 详解


章节内容

上节我们完成了:


  • ZNode 的基本介绍

  • ZNode 节点类型的介绍

  • 事务 ID 的介绍

  • ZNode 实机测试效果

背景介绍

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


  • 2C4G 编号 h121

  • 2C4G 编号 h122

  • 2C2G 编号 h123


Wacher 机制详解

基本概念

ZooKeeper 使用Watcher机制实现分布式数据的发布/订阅功能。这种机制是 ZooKeeper 实现分布式协调服务的核心组件之一,它允许客户端对 ZooKeeper 节点(znode)的变化进行监听。

发布/订阅模型详解

一个典型的发布/订阅模型定义了一对多的订阅关系,能够让多个订阅者同时监听一个主题对象(在 ZooKeeper 中表现为 znode 节点)。这种模型具有以下特点:


  1. 多客户端监听:多个客户端可以同时注册监听同一个 znode 节点

  2. 事件驱动:当被监听的 znode 节点发生以下变化时,会触发事件通知:

  3. 节点数据变更(DataChanged)

  4. 子节点列表变更(ChildrenChanged)

  5. 节点创建/删除(NodeCreated/NodeDeleted)

  6. 一次性通知:默认情况下,Watcher 是一次性的,事件触发后需要重新注册

工作机制流程

  1. 注册监听:客户端通过调用getData()exists()getChildren()等方法时设置 Watcher

  2. 事件触发:当被监听的 znode 发生相应变化时,ZooKeeper 服务器会生成事件

  3. 通知发送:服务器将事件通过 Watcher 回调通知客户端

  4. 回调处理:客户端接收到事件后执行预定义的处理逻辑

应用场景示例

  1. 配置中心:多个服务监听配置节点,配置变更时所有服务自动更新

  2. 集群管理:监听节点存活状态,实现故障检测和自动恢复

  3. 分布式锁:监听锁节点变化,实现锁释放通知

  4. 领导者选举:监听领导节点变化,实现故障转移

性能特点

  1. 轻量级:通知仅包含事件类型和节点路径,不包含具体数据

  2. 顺序保证:所有 Watcher 通知按事件发生的先后顺序发送

  3. 可靠性:通知能保证被送达,但可能因网络问题延迟 # Wacher 机制详解

基本概念

ZooKeeper 使用Watcher机制实现分布式数据的发布/订阅功能。这种机制是 ZooKeeper 实现分布式协调服务的核心组件之一,它允许客户端对 ZooKeeper 节点(znode)的变化进行监听。

发布/订阅模型详解

一个典型的发布/订阅模型定义了一对多的订阅关系,能够让多个订阅者同时监听一个主题对象(在 ZooKeeper 中表现为 znode 节点)。这种模型具有以下特点:


  1. 多客户端监听:多个客户端可以同时注册监听同一个 znode 节点

  2. 事件驱动:当被监听的 znode 节点发生以下变化时,会触发事件通知:

  3. 节点数据变更(DataChanged)

  4. 子节点列表变更(ChildrenChanged)

  5. 节点创建/删除(NodeCreated/NodeDeleted)

  6. 一次性通知:默认情况下,Watcher 是一次性的,事件触发后需要重新注册

工作机制流程

  1. 注册监听:客户端通过调用getData()exists()getChildren()等方法时设置 Watcher

  2. 事件触发:当被监听的 znode 发生相应变化时,ZooKeeper 服务器会生成事件

  3. 通知发送:服务器将事件通过 Watcher 回调通知客户端

  4. 回调处理:客户端接收到事件后执行预定义的处理逻辑

应用场景示例

  1. 配置中心:多个服务监听配置节点,配置变更时所有服务自动更新

  2. 集群管理:监听节点存活状态,实现故障检测和自动恢复

  3. 分布式锁:监听锁节点变化,实现锁释放通知

  4. 领导者选举:监听领导节点变化,实现故障转移

性能特点

  1. 轻量级:通知仅包含事件类型和节点路径,不包含具体数据

  2. 顺序保证:所有 Watcher 通知按事件发生的先后顺序发送

  3. 可靠性:通知能保证被送达,但可能因网络问题延迟


ZooKeeper 的 Watcher 机制主要包括:


  • 客户端线程

  • 客户端 Watcher Manager

  • ZooKeeper 服务器

Watcher 机制的工作原理

注册节点

客户端可以在读取或获取某个节点的数据时,选择注册一个 Watcher 来监听节点的变化。ZooKeeper 提供了多种 API 方法来注册 Watcher:


  1. getData(path, watch) - 监听指定节点的数据变更

  2. getChildren(path, watch) - 监听指定节点的子节点变更

  3. exists(path, watch) - 监听指定节点的创建/删除事件


注册 Watcher 的具体流程如下:


  1. 客户端调用上述方法时,如果 watch 参数设为 true,会向 ZooKeeper 服务器发送一个注册请求

  2. 服务器收到请求后,会将这个 Watcher 记录在相应节点的 Watcher 列表中

  3. 服务器会为每个 Watcher 维护一个会话 ID,确保只有注册该 Watcher 的客户端才能收到通知


例如,在分布式配置系统中,客户端可以使用 getData("/config", true) 来注册一个 Watcher,以便在配置变更时及时获取最新配置。

触发节点

当被监听的节点发生以下变化时,ZooKeeper 服务器会触发相应节点上的 Watcher:


  1. 数据变更:节点数据被修改(setData)

  2. 节点创建:指定路径的节点被创建

  3. 节点删除:指定路径的节点被删除

  4. 子节点变更:节点的子节点数量发生变化(新增或删除)


需要注意的重要特性:


  • Watcher 触发是一次性的,触发后即失效

  • 如果客户端需要继续监听,必须在收到通知后重新注册

  • 多个客户端可以同时注册同一个节点的 Watcher

  • Watcher 触发是有序的,确保客户端看到的状态变化是有序的


在实际应用中,这种一次性机制可以防止因大量事件通知导致的网络拥塞,同时也要求客户端正确处理重新注册的逻辑。

进行通知

当 Watcher 被触发后,ZooKeeper 会向客户端发送一个 WatchedEvent 通知,通知包含以下关键信息:


  1. 事件类型:

  2. NodeCreated (节点创建)

  3. NodeDeleted (节点删除)

  4. NodeDataChanged (数据变更)

  5. NodeChildrenChanged (子节点变更)

  6. 节点路径:发生变化的节点完整路径


客户端处理流程通常包括:


  1. 接收事件通知,解析事件类型和节点路径

  2. 根据业务需求采取相应行动,例如:

  3. 重新获取节点数据

  4. 重建监听

  5. 更新本地缓存

  6. 触发后续业务流程

  7. 如果需要继续监听,重新调用 getData/getChildren/exists 方法注册新的 Watcher


典型应用场景:


  • 配置中心:配置变更时通知所有客户端

  • 集群管理:节点上下线时通知管理节点

  • 分布式锁:锁释放时通知等待的客户端

  • 服务发现:服务注册信息变更时通知消费者 ## 注册节点


客户端可以在读取或获取某个节点的数据时,选择注册一个 Watcher 来监听节点的变化。ZooKeeper 提供了多种 API 方法来注册 Watcher:


  1. getData(path, watch) - 监听指定节点的数据变更

  2. getChildren(path, watch) - 监听指定节点的子节点变更

  3. exists(path, watch) - 监听指定节点的创建/删除事件


注册 Watcher 的具体流程如下:


  1. 客户端调用上述方法时,如果 watch 参数设为 true,会向 ZooKeeper 服务器发送一个注册请求

  2. 服务器收到请求后,会将这个 Watcher 记录在相应节点的 Watcher 列表中

  3. 服务器会为每个 Watcher 维护一个会话 ID,确保只有注册该 Watcher 的客户端才能收到通知


例如,在分布式配置系统中,客户端可以使用 getData("/config", true) 来注册一个 Watcher,以便在配置变更时及时获取最新配置。

触发节点

当被监听的节点发生以下变化时,ZooKeeper 服务器会触发相应节点上的 Watcher:


  1. 数据变更:节点数据被修改(setData)

  2. 节点创建:指定路径的节点被创建

  3. 节点删除:指定路径的节点被删除

  4. 子节点变更:节点的子节点数量发生变化(新增或删除)


需要注意的重要特性:


  • Watcher 触发是一次性的,触发后即失效

  • 如果客户端需要继续监听,必须在收到通知后重新注册

  • 多个客户端可以同时注册同一个节点的 Watcher

  • Watcher 触发是有序的,确保客户端看到的状态变化是有序的


在实际应用中,这种一次性机制可以防止因大量事件通知导致的网络拥塞,同时也要求客户端正确处理重新注册的逻辑。

进行通知

当 Watcher 被触发后,ZooKeeper 会向客户端发送一个 WatchedEvent 通知,通知包含以下关键信息:


  1. 事件类型:

  2. NodeCreated (节点创建)

  3. NodeDeleted (节点删除)

  4. NodeDataChanged (数据变更)

  5. NodeChildrenChanged (子节点变更)

  6. 节点路径:发生变化的节点完整路径


客户端处理流程通常包括:


  1. 接收事件通知,解析事件类型和节点路径

  2. 根据业务需求采取相应行动,例如:

  3. 重新获取节点数据

  4. 重建监听

  5. 更新本地缓存

  6. 触发后续业务流程

  7. 如果需要继续监听,重新调用 getData/getChildren/exists 方法注册新的 Watcher


典型应用场景:


  • 配置中心:配置变更时通知所有客户端

  • 集群管理:节点上下线时通知管理节点

  • 分布式锁:锁释放时通知等待的客户端

  • 服务发现:服务注册信息变更时通知消费者

Watcher 特点

  • 一次性:Watcher 机制是一次性的,客户端需要在每次事件发生后重新注册 Watcher 以继续监视节点。

  • 异步通知:Watcher 事件是异步通知的,这意味着客户端注册 Watcher 后不会阻塞等待事件的发生,而是通过事件通知机制处理事件。

  • 轻量级:Watcher 是轻量级的,不会对 ZooKeeper 服务器带来显著的性能负担。

Watcher 使用场景

  • 配置管理:在分布式系统中,多个服务可能依赖同一个配置。通过 Watcher 机制,可以实现配置的动态更新,当配置变更时,所有依赖该配置的服务都能及时收到通知并进行更新。

  • 服务发现:在服务发现机制中,客户端可以通过 Watcher 监视服务节点的变化,当有新服务加入或服务下线时,客户端能够及时感知并更新服务列表。

  • 分布式锁:在实现分布式锁时,可以使用 Watcher 机制监控锁节点的状态,当锁被释放时,等待的客户端可以收到通知并尝试获取锁。

创建节点

永久节点

create /wzk 123456
复制代码

顺序节点

create -s /wzk-order 654321
复制代码

临时节点

create -e /wzk-temp 123123
复制代码


读取节点

列出节点

ls /
复制代码

查看数据

get /wzk
复制代码


更新节点

set /wzk-temp 111222
复制代码

删除节点

delete /wzk-temp
复制代码



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

武子康

关注

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

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

评论

发布
暂无评论
大数据-29 ZooKeeper 节点 Watcher原理 实践指南_Java_武子康_InfoQ写作社区