1. zookeeper的Watch机制
一个zk的节点可以被监控,包括这个目录中存储的数据的修改,子节点目录的变化,一旦变化可以通知设置监控的客户端,这个功能是zookeeper对于应用最重要的特性,通过这个特性可以实现的功能包括配置的集中管理,集群管理,分布式锁等等。
watch机制官方说明:一个Watch事件是一个一次性的触发器,当被设置了Watch的数据发生了改变的时候,则服务器将这个改变发送给设置了Watch的客户端,以便通知它们。
2. zookeeper机制的特点
1) 一次性的触发器(one-time trigger)
当数据改变的时候,那么一个Watch事件会产生并且被发送到客户端中。但是客户端只会收到一次这样的通知,如果以后这个数据再次发生改变的时候,之前设置Watch的客户端将不会再次收到改变的通知,因为Watch机制规定了它是一个一次性的触发器。
当设置监视的数据发生改变时,该监视事件会被发送到客户端,例如,如果客户端调用了 getData("/znode1", true) 并且稍后 /znode1 节点上的数据发生了改变或者被删除了,客户端将会获取到 /znode1 发生变化的监视事件,而如果 /znode1 再一次发生了变化,除非客户端再次对 /znode1 设置监视,否则客户端不会收到事件通知。
2)发送给客户端(Sent to the client)
这个表明了Watch的通知事件是从服务器发送给客户端的,是异步的,这就表明不同的客户端收到的Watch的时间可能不同,但是ZooKeeper有保证:当一个客户端在看到Watch事件之前是不会看到结点数据的变化的。例如:A=3,此时在上面设置了一次Watch,如果A突然变成4了,那么客户端会先收到Watch事件的通知,然后才会看到A=4。
Zookeeper 客户端和服务端是通过 Socket 进行通信的,由于网络存在故障,所以监视事件很有可能不会成功地到达客户端,监视事件是异步发送至监视者的,Zookeeper 本身提供了保序性(ordering guarantee):即客户端只有首先看到了监视事件后,才会感知到它所设置监视的 znode 发生了变化(a client will never see a change for which it has set a watch until it first sees the watch event). 网络延迟或者其他因素可能导致不同的客户端在不同的时刻感知某一监视事件,但是不同的客户端所看到的一切具有一致的顺序。
3)被设置Watch的数据(The data for which the watch was set)
这意味着 znode 节点本身具有不同的改变方式。你也可以想象 Zookeeper 维护了两条监视链表:
数据监视和子节点监视(data watches and child watches)
getData() and exists() 设置数据监视,getChildren() 设置子节点监视。 或者,你也可以想象 Zookeeper 设置的不同监视返回不同的数据,getData() 和 exists() 返回 znode 节点的相关信息,而 getChildren() 返回子节点列表。
因此, setData() 会触发设置在某一节点上所设置的数据监视(假定数据设置成功),而一次成功的 create() 操作则会出发当前节点上所设置的数据监视以及父节点的子节点监视。一次成功的 delete() 操作将会触发当前节点的数据监视和子节点监视事件,同时也会触发该节点父节点的child watch。
3.各种watch触发的情况总结
可以注册watcher的方法:getData、exists、getChildren。
可以触发watcher的方法:create、delete、setData。连接断开的情况下触发的watcher会丢失。
一个Watcher实例是一个回调函数,被回调一次后就被移除了。如果还需要关注数据的变化,需要再次注册watcher。
New ZooKeeper时注册的watcher叫default watcher,它不是一次性的,只对client的连接状态变化作出反应。
什么样的操作会产生什么类型的事件:
event For “/path” | event For “/path/child” | |
create(“/path”) | EventType.NodeCreated | 无 |
delete(“/path”) | EventType.NodeDeleted | 无 |
setData(“/path”) | EventType.NodeDataChanged | 无 |
create(“/path/child”) | EventType.NodeChildrenChanged(getChild) | EventType.NodeCreated |
delete(“/path/child”) | EventType.NodeChildrenChanged(getChild) | EventType.NodeDeleted |
setData(“/path/child”) | 无 | EventType.NodeDataChanged |
事件类型与watcher的对应关系:
event For “/path” |
Default Watcher |
exists(“/path”) |
getData(“/path”) |
getChildren(“/path”) |
EventType.None | √ | √ | √ | √ |
EventType.NodeCreated | √ | √ | ||
EventType.NodeDeleted | √ | √ | ||
EventType.NodeDataChanged | √ | √ | ||
EventType.NodeChildrenChanged | √ |
本表总结:exits和getData设置数据监视,而getChildren设置子节点监视
操作与watcher的对应关系:
exits("/path") | getData(“/path”) | getChildren(“/path”) | exits("/path/child") | getData(“/path/child”) | getChildren(“/path/child”) | |
create(“/path”) | √ | √ | 会报错 | |||
delete(“/path”) | √ | √ | √(这个要注意) | |||
setData(“/path”) | √ | √ | ||||
create(“/path/child”) | √ | √ | √ | |||
delete(“/path/child”) | √ | √ | √ | √ | ||
setData(“/path/child”) | √ | √ | ||||
值得注意的是:getChildren("/path")监视/path的子节点,如果(/path)自己删了,也会触发NodeDeleted事件。
4.实现永久监听
由于zookeeper是一次性监听,所以我们必须在wather的process方法里面再设置监听。一个方法如下:
以下逻辑是实现的是生产者和消费者模型,消费者监听某一路径下面子节点的变化,当生产者有消息发送过来的时候,在该节点下面创建一个子节点,然后把消息放到该子节点里面,这会触发消费者的process方法被调用,然后消费者取到该节点下面的子节点(顺便设置一个再监听该节点的子节点),然后取出子节点的内容,做处理,然后删除该子节点。
public void process(WatchedEvent event) { // TODO Auto-generated method stub if (event.getState() == KeeperState.SyncConnected) { System.out.println("watcher received event"); countDownLatch.countDown(); } System.out.println("回调watcher1实例: 路径" + event.getPath() + " 类型:"+ event.getType()); // 事件类型,状态,和检测的路径 EventType eventType = event.getType(); KeeperState state = event.getState(); String watchPath = event.getPath(); switch (eventType) { case NodeCreated: break; case NodeDataChanged: break; case NodeChildrenChanged: try { //处理收到的消息 handleMessage(watchPath); } catch (UnsupportedEncodingException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (KeeperException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } break; default: break; } } public void handleMessage(String watchPath) throws KeeperException,InterruptedException, UnsupportedEncodingException { System.out.println("收到消息"); //再监听该子节点 List<String> Children = this.getChildren(watchPath); for (String a : Children) { String childrenpath = watchPath + "/" + a; byte[] recivedata = this.getData(childrenpath); String recString = new String(recivedata, "UTF-8"); System.out.println("receive the path:" + childrenpath + ":data:"+ recString); //做完了之后,删除该节点 this.deletNode(childrenpath, -1); } } public List<String> getChildren(String path) throws KeeperException,InterruptedException { //监听该节点子节点的变化情况 return this.zooKeeper.getChildren(path, this); } public Stat setData(String path, byte[] data, int version)throws KeeperException, InterruptedException { return this.zooKeeper.setData(path, data, version); }
相关推荐
《Paxos到Zookeeper——分布式一致性原理与实践》是一本深入探讨分布式一致性问题的书籍,对于理解并应用Zookeeper这一关键的分布式协调系统具有重要价值。本书旨在帮助读者掌握分布式环境中的数据一致性原理,并...
《从Paxos到Zookeeper分布式一致性原理与实践》与《ZooKeeper-分布式过程协同技术详解》这两本书深入探讨了分布式系统中的一个重要概念——一致性,以及如何通过ZooKeeper这一工具来实现高效的分布式协同。...
##### 3.2 Zookeeper核心功能 1. **数据同步**:通过复制机制实现多副本的数据存储,保证数据的一致性和可靠性。 2. **故障恢复**:当某个节点发生故障时,能够自动切换到备用节点继续提供服务。 3. **负载均衡**:...
《从PAXOS到ZOOKEEPER分布式一致性原理与实践》这本书深入探讨了分布式系统中的一个重要议题——一致性。一致性是确保分布式系统中各个节点数据同步的关键,它在高可用、高性能的分布式服务中扮演着核心角色。PAXOS...
《从Paxos到Zookeeper:分布式一致性原理与实践》这本书深入浅出地探讨了分布式系统中的一个重要概念——一致性,以及如何在实际操作中通过Paxos算法和Zookeeper实现这一概念。分布式一致性是分布式系统设计的核心,...
《Java面试——Zookeeper面试专题》 Zookeeper是Apache Hadoop项目下的一个分布式协调服务,它为分布式应用程序提供了高效且可靠的分布式同步、配置管理以及命名服务。在Java面试中,Zookeeper是一个重要的考察点,...
3. **构建脚本**:如`build.xml`,用于编译和打包Zookeeper,便于开发者构建自己的版本。 4. **配置文件**:如`conf/zoo.cfg`,是Zookeeper服务器的基本配置文件,包括数据存储路径、端口设置等关键信息。 5. **bin...
一、Zookeeper核心概念 1. **节点(ZNode)**:Zookeeper的数据存储是以节点形式存在的,每个节点都有一个唯一的路径。节点分为持久节点和临时节点,前者即使客户端断开连接也会保留,后者则会在客户端断开时自动...
ZooKeeper基于PAXOS算法的简化版本——ZAB(ZooKeeper Atomic Broadcast)协议,实现了高可用性和一致性。ZAB协议保证了在领导者选举、数据同步等操作中的原子广播,确保所有副本节点状态的一致性。 在ZooKeeper中...
第二部分“ZooKeeper核心机制”是书中的核心,包括第三章至第七章。这一部分详细讲解了Zookeeper的数据模型(如ZNode、路径、数据版本等)、会话与 watches、原子操作、领导者选举以及数据同步等关键机制。读者将...
《从Paxos到Zookeeper:分布式一致性原理与实践》这本书深入探讨了分布式系统中的一致性问题,作者倪超以其丰富的经验,为我们揭示了如何在大规模分布式环境中实现可靠的数据同步和协调。这本书的核心主题围绕着...
在给定的压缩包“zookeeper-3.3.6”中,包含了Dubbo框架中的核心组件——Zookeeper作为注册中心的相关资源。这个版本可能包含源码、文档、配置文件和其他用于部署和理解Zookeeper如何与Dubbo集成的必要内容。 在...
《ZooKeeper——分布式过程协同技术详解》是一本深度探讨分布式协调服务ZooKeeper的书籍。ZooKeeper是由Apache软件基金会开发的一个开源项目,旨在为分布式应用提供高效、可靠的协调服务,解决分布式环境中的命名、...
《从PAXOS到ZOOKEEPER分布式一致性原理与实践》这本书深入探讨了分布式系统中的核心议题——一致性。一致性是确保网络中多个节点对数据视图保持同步的关键,它是构建可靠分布式服务的基础。在此,我们将重点围绕...
《Zookeeper源码解析——基于3.5.4版本》 Apache ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,它是集群的管理者,监视着集群中各个节点的状态根据节点提交的反馈进行下一步合理操作。最终将简单...
在这个系列的第一部分,我们将重点关注Zookeeper——一个广泛使用的分布式协调服务。Zookeeper由Apache软件基金会开发,旨在解决分布式环境中的数据管理、服务发现、配置管理等问题。 Zookeeper的核心概念包括节点...
### ZooKeeper的基本原理 - **数据存储**:每个服务器节点在其内存中都存储了一份数据副本。 - **Leader选举**:Zookeeper启动时,采用Paxos协议来选出一个领导者(Leader)。Leader负责处理数据更新等关键操作。 -...