大数据 -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 节点)。这种模型具有以下特点:
多客户端监听:多个客户端可以同时注册监听同一个 znode 节点
事件驱动:当被监听的 znode 节点发生以下变化时,会触发事件通知:
节点数据变更(DataChanged)
子节点列表变更(ChildrenChanged)
节点创建/删除(NodeCreated/NodeDeleted)
一次性通知:默认情况下,Watcher 是一次性的,事件触发后需要重新注册
工作机制流程
注册监听:客户端通过调用
getData()
、exists()
或getChildren()
等方法时设置 Watcher事件触发:当被监听的 znode 发生相应变化时,ZooKeeper 服务器会生成事件
通知发送:服务器将事件通过 Watcher 回调通知客户端
回调处理:客户端接收到事件后执行预定义的处理逻辑
应用场景示例
配置中心:多个服务监听配置节点,配置变更时所有服务自动更新
集群管理:监听节点存活状态,实现故障检测和自动恢复
分布式锁:监听锁节点变化,实现锁释放通知
领导者选举:监听领导节点变化,实现故障转移
性能特点
轻量级:通知仅包含事件类型和节点路径,不包含具体数据
顺序保证:所有 Watcher 通知按事件发生的先后顺序发送
可靠性:通知能保证被送达,但可能因网络问题延迟 # Wacher 机制详解
基本概念
ZooKeeper
使用Watcher机制
实现分布式
数据的发布/订阅
功能。这种机制是 ZooKeeper 实现分布式协调服务的核心组件之一,它允许客户端对 ZooKeeper 节点(znode)的变化进行监听。
发布/订阅模型详解
一个典型的发布/订阅
模型定义了一对多
的订阅关系,能够让多个订阅者
同时监听
某一个主题
对象(在 ZooKeeper 中表现为 znode 节点)。这种模型具有以下特点:
多客户端监听:多个客户端可以同时注册监听同一个 znode 节点
事件驱动:当被监听的 znode 节点发生以下变化时,会触发事件通知:
节点数据变更(DataChanged)
子节点列表变更(ChildrenChanged)
节点创建/删除(NodeCreated/NodeDeleted)
一次性通知:默认情况下,Watcher 是一次性的,事件触发后需要重新注册
工作机制流程
注册监听:客户端通过调用
getData()
、exists()
或getChildren()
等方法时设置 Watcher事件触发:当被监听的 znode 发生相应变化时,ZooKeeper 服务器会生成事件
通知发送:服务器将事件通过 Watcher 回调通知客户端
回调处理:客户端接收到事件后执行预定义的处理逻辑
应用场景示例
配置中心:多个服务监听配置节点,配置变更时所有服务自动更新
集群管理:监听节点存活状态,实现故障检测和自动恢复
分布式锁:监听锁节点变化,实现锁释放通知
领导者选举:监听领导节点变化,实现故障转移
性能特点
轻量级:通知仅包含事件类型和节点路径,不包含具体数据
顺序保证:所有 Watcher 通知按事件发生的先后顺序发送
可靠性:通知能保证被送达,但可能因网络问题延迟
ZooKeeper 的 Watcher 机制主要包括:
客户端线程
客户端 Watcher Manager
ZooKeeper 服务器
Watcher 机制的工作原理
注册节点
客户端可以在读取或获取某个节点的数据时,选择注册一个 Watcher 来监听节点的变化。ZooKeeper 提供了多种 API 方法来注册 Watcher:
getData(path, watch)
- 监听指定节点的数据变更getChildren(path, watch)
- 监听指定节点的子节点变更exists(path, watch)
- 监听指定节点的创建/删除事件
注册 Watcher 的具体流程如下:
客户端调用上述方法时,如果 watch 参数设为 true,会向 ZooKeeper 服务器发送一个注册请求
服务器收到请求后,会将这个 Watcher 记录在相应节点的 Watcher 列表中
服务器会为每个 Watcher 维护一个会话 ID,确保只有注册该 Watcher 的客户端才能收到通知
例如,在分布式配置系统中,客户端可以使用 getData("/config", true)
来注册一个 Watcher,以便在配置变更时及时获取最新配置。
触发节点
当被监听的节点发生以下变化时,ZooKeeper 服务器会触发相应节点上的 Watcher:
数据变更:节点数据被修改(setData)
节点创建:指定路径的节点被创建
节点删除:指定路径的节点被删除
子节点变更:节点的子节点数量发生变化(新增或删除)
需要注意的重要特性:
Watcher 触发是一次性的,触发后即失效
如果客户端需要继续监听,必须在收到通知后重新注册
多个客户端可以同时注册同一个节点的 Watcher
Watcher 触发是有序的,确保客户端看到的状态变化是有序的
在实际应用中,这种一次性机制可以防止因大量事件通知导致的网络拥塞,同时也要求客户端正确处理重新注册的逻辑。
进行通知
当 Watcher 被触发后,ZooKeeper 会向客户端发送一个 WatchedEvent 通知,通知包含以下关键信息:
事件类型:
NodeCreated (节点创建)
NodeDeleted (节点删除)
NodeDataChanged (数据变更)
NodeChildrenChanged (子节点变更)
节点路径:发生变化的节点完整路径
客户端处理流程通常包括:
接收事件通知,解析事件类型和节点路径
根据业务需求采取相应行动,例如:
重新获取节点数据
重建监听
更新本地缓存
触发后续业务流程
如果需要继续监听,重新调用 getData/getChildren/exists 方法注册新的 Watcher
典型应用场景:
配置中心:配置变更时通知所有客户端
集群管理:节点上下线时通知管理节点
分布式锁:锁释放时通知等待的客户端
服务发现:服务注册信息变更时通知消费者 ## 注册节点
客户端可以在读取或获取某个节点的数据时,选择注册一个 Watcher 来监听节点的变化。ZooKeeper 提供了多种 API 方法来注册 Watcher:
getData(path, watch)
- 监听指定节点的数据变更getChildren(path, watch)
- 监听指定节点的子节点变更exists(path, watch)
- 监听指定节点的创建/删除事件
注册 Watcher 的具体流程如下:
客户端调用上述方法时,如果 watch 参数设为 true,会向 ZooKeeper 服务器发送一个注册请求
服务器收到请求后,会将这个 Watcher 记录在相应节点的 Watcher 列表中
服务器会为每个 Watcher 维护一个会话 ID,确保只有注册该 Watcher 的客户端才能收到通知
例如,在分布式配置系统中,客户端可以使用 getData("/config", true)
来注册一个 Watcher,以便在配置变更时及时获取最新配置。
触发节点
当被监听的节点发生以下变化时,ZooKeeper 服务器会触发相应节点上的 Watcher:
数据变更:节点数据被修改(setData)
节点创建:指定路径的节点被创建
节点删除:指定路径的节点被删除
子节点变更:节点的子节点数量发生变化(新增或删除)
需要注意的重要特性:
Watcher 触发是一次性的,触发后即失效
如果客户端需要继续监听,必须在收到通知后重新注册
多个客户端可以同时注册同一个节点的 Watcher
Watcher 触发是有序的,确保客户端看到的状态变化是有序的
在实际应用中,这种一次性机制可以防止因大量事件通知导致的网络拥塞,同时也要求客户端正确处理重新注册的逻辑。
进行通知
当 Watcher 被触发后,ZooKeeper 会向客户端发送一个 WatchedEvent 通知,通知包含以下关键信息:
事件类型:
NodeCreated (节点创建)
NodeDeleted (节点删除)
NodeDataChanged (数据变更)
NodeChildrenChanged (子节点变更)
节点路径:发生变化的节点完整路径
客户端处理流程通常包括:
接收事件通知,解析事件类型和节点路径
根据业务需求采取相应行动,例如:
重新获取节点数据
重建监听
更新本地缓存
触发后续业务流程
如果需要继续监听,重新调用 getData/getChildren/exists 方法注册新的 Watcher
典型应用场景:
配置中心:配置变更时通知所有客户端
集群管理:节点上下线时通知管理节点
分布式锁:锁释放时通知等待的客户端
服务发现:服务注册信息变更时通知消费者
Watcher 特点
一次性
:Watcher 机制是一次性的,客户端需要在每次事件发生后重新注册 Watcher 以继续监视节点。异步通知
:Watcher 事件是异步通知的,这意味着客户端注册 Watcher 后不会阻塞等待事件的发生,而是通过事件通知机制处理事件。轻量级
:Watcher 是轻量级的,不会对 ZooKeeper 服务器带来显著的性能负担。
Watcher 使用场景
配置管理
:在分布式系统中,多个服务可能依赖同一个配置。通过 Watcher 机制,可以实现配置的动态更新,当配置变更时,所有依赖该配置的服务都能及时收到通知并进行更新。服务发现
:在服务发现机制中,客户端可以通过 Watcher 监视服务节点的变化,当有新服务加入或服务下线时,客户端能够及时感知并更新服务列表。分布式锁
:在实现分布式锁时,可以使用 Watcher 机制监控锁节点的状态,当锁被释放时,等待的客户端可以收到通知并尝试获取锁。
创建节点
永久节点
顺序节点
临时节点

读取节点
列出节点
查看数据

更新节点
删除节点

版权声明: 本文为 InfoQ 作者【武子康】的原创文章。
原文链接:【http://xie.infoq.cn/article/cdc319d4368ba7a8370e6842a】。文章转载请联系作者。
评论