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

0 阅读11分钟

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

🚀 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节点发生以下变化时,会触发事件通知:
    • 节点数据变更(DataChanged)
    • 子节点列表变更(ChildrenChanged)
    • 节点创建/删除(NodeCreated/NodeDeleted)
  3. 一次性通知:默认情况下,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节点发生以下变化时,会触发事件通知:
    • 节点数据变更(DataChanged)
    • 子节点列表变更(ChildrenChanged)
    • 节点创建/删除(NodeCreated/NodeDeleted)
  3. 一次性通知:默认情况下,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. 事件类型:
    • NodeCreated (节点创建)
    • NodeDeleted (节点删除)
    • NodeDataChanged (数据变更)
    • NodeChildrenChanged (子节点变更)
  2. 节点路径:发生变化的节点完整路径

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

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

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

    • 重新获取节点数据
    • 重建监听
    • 更新本地缓存
    • 触发后续业务流程
  3. 如果需要继续监听,重新调用 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. 事件类型:
    • NodeCreated (节点创建)
    • NodeDeleted (节点删除)
    • NodeDataChanged (数据变更)
    • NodeChildrenChanged (子节点变更)
  2. 节点路径:发生变化的节点完整路径

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

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

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

    • 重新获取节点数据
    • 重建监听
    • 更新本地缓存
    • 触发后续业务流程
  3. 如果需要继续监听,重新调用 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

在这里插入图片描述