`
m635674608
  • 浏览: 5031302 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

Zookeeper Watch机制

 
阅读更多

Znode发生变化(Znode本身的增加,删除,修改,以及子Znode的变化)可以通过Watch机制通知到客户端。那么要实现Watch,就必须实现org.apache.zookeeper.Watcher接口,并且将实现类的对象传入到可以Watch的方法中。Zookeeper中所有读操作(getData(),getChildren(),exists())都可以设置Watch选项。Watch事件具有one-time trigger(一次性触发)的特性,如果Watch监视的Znode有变化,那么就会通知设置该Watch的客户端。

 

Zookeeper Watch

在上述说道的所有读操作中,如果需要Watcher,我们可以自定义Watcher,如果是Boolean型变量,当为true时,则使用系统默认的Watcher,系统默认的Watcher是在Zookeeper的构造函数中定义的Watcher。参数中Watcher为空或者false,表示不启用Wather。

一,一次性触发器

客户端在Znode设置了Watch时,如果Znode内容发生改变,那么客户端就会获得Watch事件。例如:客户端设置getData("/znode1", true)后,如果/znode1发生改变或者删除,那么客户端就会得到一个/znode1的Watch事件,但是/znode1再次发生变化,那客户端是无法收到Watch事件的,除非客户端设置了新的Watch。

二,发送至客户端

Watch事件是异步发送到Client。Zookeeper可以保证客户端发送过去的更新顺序是有序的。例如:某个Znode没有设置watcher,那么客户端对这个Znode设置Watcher发送到集群之前,该客户端是感知不到该Znode任何的改变情况的。换个角度来解释:由于Watch有一次性触发的特点,所以在服务器端没有Watcher的情况下,Znode的任何变更就不会通知到客户端。不过,即使某个Znode设置了Watcher,且在Znode有变化的情况下通知到了客户端,但是在客户端接收到这个变化事件,但是还没有再次设置Watcher之前,如果其他客户端对该Znode做了修改,这种情况下,Znode第二次的变化客户端是无法收到通知的。这可能是由于网络延迟或者是其他因素导致,所以我们使用Zookeeper不能期望能够监控到节点每次的变化。Zookeeper只能保证最终的一致性,而无法保证强一致性。

三,设置watch的数据内容

Znode改变有很多种方式,例如:节点创建,节点删除,节点改变,子节点改变等等。Zookeeper维护了两个Watch列表,一个节点数据Watch列表,另一个是子节点Watch列表。getData()和exists()设置数据Watch,getChildren()设置子节点Watch。两者选其一,可以让我们根据不同的返回结果选择不同的Watch方式,getData()和exists()返回节点的内容,getChildren()返回子节点列表。因此,setData()触发内容Watch,create()触发当前节点的内容Watch或者是其父节点的子节点Watch。delete()同时触发父节点的子节点Watch和内容Watch,以及子节点的内容Watch。

 

Zookeeper Watcher的运行机制

1,Watch是轻量级的,其实就是本地JVM的Callback,服务器端只是存了是否有设置了Watcher的布尔类型。(源码见:org.apache.zookeeper.server.FinalRequestProcessor)
2,在服务端,在FinalRequestProcessor处理对应的Znode操作时,会根据客户端传递的watcher变量,添加到对应的ZKDatabase(org.apache.zookeeper.server.ZKDatabase)中进行持久化存储,同时将自己NIOServerCnxn做为一个Watcher callback,监听服务端事件变化
3,Leader通过投票通过了某次Znode变化的请求后,然后通知对应的Follower,Follower根据自己内存中的zkDataBase信息,发送notification信息给zookeeper客户端。
4,Zookeeper客户端接收到notification信息后,找到对应变化path的watcher列表,挨个进行触发回调。

流程图

 

Zookeeper事件

Zookeeper状态/事件对应关系图:

ZooKeeper中Watch事件(见:org.apache.zookeeper.Watcher.EventType):

None                在客户端与Zookeeper集群中的服务器断开连接的时候,客户端会收到这个事件。
NodeCreated                 Znode创建事件
NodeDeleted                 Znode删除事件
NodeDataChanged                 Znode数据内容更新事件。其实本质上该事件只关注dataVersion版本号,但是只要调用了更新接口dataVersion就会有变更。
NodeChildrenChanged                 Znode子节点改变事件,只关注子节点的个数变更,子节点内容有变更是不会通知的。

 

在事件发生时,ZooKeeper的状态(见:org.apache.zookeeper.Watcher.KeeperState):

Disconnected(0)                  客户端处于断开连接的状态,并且没有和Zookeeper集群中任何服务器连接。

SyncConnected(3)                客户端处于连接的状态,也就是说客户端连接到了一台server

AuthFailed(4)               验证失败的状态

ConnectedReadOnly(5)              客户端连接到一个只读Server的状态。

SaslAuthenticated(6)             用于通知客户端他们是SASL认证,以至于他们能够SASL认证的权限通过操作Zookeeper。

Expired(-112)            会话超时状态

 

http://blog.csdn.net/moon_yang_bj/article/details/53290747

分享到:
评论

相关推荐

    zookeeper watch机制的理解

    ZooKeeper Watch机制的理解 在 ZooKeeper 中,Watch 机制是一种异步非阻塞的主动通知模式,用于实现分布式进程之间的实时高效的状态共享。Watch 机制是 ZooKeeper 的核心机制之一,它使得分布式进程之间的“共享...

    zookeeperMaster选举以及数据同步代码

    当一个Znode的数据发生变化时,Zookeeper会通过Watch机制通知已订阅该节点的客户端,实现了数据的实时同步。在这个项目中,Zookeeper可能被用来作为MySQL数据同步的状态协调器,记录每个节点的同步进度,确保在...

    zookeeper-3.4.14.zip

    选举过程通过Zookeeper的Watch机制实时监控节点状态变化,并快速响应。 3. **配置管理**:Kafka的配置信息,如主题的创建、删除、分区数量的调整等,都需要通过Zookeeper进行同步。当这些配置变更发生时,Zookeeper...

    apache zookeeper使用方法实例详解

    DataMonitor 类使用 ZooKeeper 的 Watch 机制来监视 Znode 节点的数据,当 Znode 节点的数据发生变化时,DataMonitor 类会通知 Executor 类,并启动或停止可执行程序。 在 ZooKeeper 的应用程序设计中,开发人员...

    zookeeper3八本

    8. **Watch机制**:Watch是Zookeeper的一种事件监听机制,客户端可以为任何节点设置Watch,当该节点发生变化时,Zookeeper会向设置Watch的客户端发送通知,实现数据变更的实时同步。 9. **安全性**:Zookeeper支持...

    ZooKeeper 客户端的使用(二).

    Watch 是 ZooKeeper 的一个重要特性,它允许客户端设置监听器(Watch)在特定 ZNode 上,当该 ZNode 发生改变(如数据更新、被删除或子节点变更)时,ZooKeeper 会向客户端发送一个事件通知。然而,Watch 是一次性...

    zookeeper-3.4.12.tar.gz.zip

    2. **Watch机制**:Watch是Zookeeper的一个重要特性,允许客户端设置监听某个节点的变化,当节点数据变化或被删除时,Zookeeper会向设置了Watch的客户端发送通知。 3. **原子操作**:所有对Zookeeper的操作都是原子...

    Zookeeper学习笔记.pdf

    此外,Watch机制是Zookeeper的关键特性,客户端可以对节点设置Watch,当节点状态改变时,Zookeeper会向客户端发送一次性通知,从而实现事件驱动的通信。 Zookeeper的时间管理是通过Zxid(事务ID)来实现的,每个...

    ZooKeeper源码阅读

    通过对ZooKeeper客户端初始化过程、与服务器间的交互逻辑、API调用方式、Watch机制以及容错机制的分析,我们可以更深入地理解ZooKeeper的工作原理及其应用场景。这不仅有助于开发者更好地利用ZooKeeper提供的功能,...

    zookeeper源码(注释版)

    3. **Watch机制** Watch是ZooKeeper的一个重要特性,它允许客户端注册监听特定ZNode的变更。一旦ZNode发生变化,ZooKeeper会向注册了Watch的客户端发送事件通知,这种机制使得分布式应用可以实时响应数据变化。 4....

    zookeeper文档

    Zookeeper的关键特性之一是它使用watch机制,允许客户端在监控的znode发生变化时获得通知。 在Zookeeper集群中,有三种角色:Leader、Follower和Observer。集群中只有一个Leader,它负责处理客户端的写请求并同步...

    spring:Spring Cloud演示

    记录一些简单示例和偶尔的思绪 ...思考 Zookeeper Watch 机制,对 cloud 服务进行优化? ps:听说最近 Spring Cloud Alibaba 对 openfeign 和 Dubbo 做了兼容,采用降级调用 openfeign 假装 FeignAutoConfiguration F

    zookeeper源码

    通过对Zookeeper架构、ZAB协议、选举机制、数据模型等核心概念的探究,开发者可以更好地运用Zookeeper解决实际问题,提升系统性能和稳定性。在实际项目中,结合Zookeeper提供的API,我们可以构建出更加健壮、高效的...

    zookeeper3.4.3 下载

    其次,Zookeeper支持Watch机制。Watch是一种一次性触发的事件监听器,当某个ZNode的数据或者状态发生变化时,所有设置了相应Watch的客户端都会收到通知。这种机制使得分布式系统中的节点能够实时感知到系统的变化,...

    Zookeeper程序员指南

    Zookeeper的核心概念包括数据模型、会话、监控(Watches)以及与时间相关的机制。 1、前言 Zookeeper作为一个高可用的服务,为分布式系统提供了统一的命名空间、配置管理、领导者选举等关键功能。它通过提供一种...

    zookeeper中文文档

    Zookeeper的Watch机制能够使客户端在指定的节点发生变化时得到通知。ACL控制则提供了一种安全机制,用于控制对Zookeeper数据的访问权限。 Zookeeper客户端的启动流程涉及Zookeeper类,而Zookeeper服务器的启动流程...

    zookeeper3.5.5.zip

    Zookeeper的C库不仅提供基本的CRUD操作(创建、读取、更新、删除),还支持 watches(观察者)机制,这是Zookeeper的一个重要特性。通过设置watch,客户端可以实时监控Zookeeper中的数据变化,当数据发生变化时,...

    zookeeper的设计与使用(集群部署,dubbo,分布式锁,master选举,负载均衡,watch,权限等)

    在本篇文章中,我们将深入探讨ZooKeeper在分布式环境中的设计与应用,包括集群部署、与Dubbo的整合、分布式锁的实现、主节点选举、负载均衡以及Watch机制和权限管理。 首先,**集群部署**是ZooKeeper的基础,它采用...

    dubbo和zookeeper的关系.docx

    Dubbo通过Zookeeper实现了服务的自动注册与发现,简化了服务调用的过程,同时利用Zookeeper的Watch机制和一致性服务,保证了服务的动态调整和高可用性。这种组合在分布式系统中广泛应用,为构建大规模、复杂的企业级...

    Linux版zookeeper-3.4.5.tar.gz

    此外,ZooKeeper支持Watch机制,允许客户端对特定的数据节点设置监听,一旦数据发生变化,ZooKeeper会立即通知客户端。这种机制对于实现分布式锁、选举算法和分布式队列等高级功能至关重要。 总之,Linux版的...

Global site tag (gtag.js) - Google Analytics