今天在统计页面上发现有个节点丢失了,经过仔细分析后,发现同一个节点上的二个应用(同时监控zk)其中一个丢失了一个event,检查zk cluster没有发现异常。。。
通过网络搜寻,出现miss event的情况说的都是监听前已经有node,删除后才register,所以这属于正常现象。
排除网络问题,因为我相信zk在notified event时如果不通是有异常提示的。
cat /path/to/log/file | grep NodeChildrenChanged
2013-05-31 02:30:23,120 [main-EventThread] (ZookeeperMonitor.java:158) WARN xxx.ZookeeperMonitor - NodeChildrenChanged,reloading data with event:WatchedEvent state:SyncConnected type:NodeChildrenChanged path:/node/svr
2013-05-31 02:30:23,906 [main-EventThread] (ZookeeperMonitor.java:158) WARN xxx.ZookeeperMonitor - NodeChildrenChanged,reloading data with event:WatchedEvent state:SyncConnected type:NodeChildrenChanged path:/node/svr
2013-05-31 02:30:50,179 [main-EventThread] (ZookeeperMonitor.java:158) WARN xxx.ZookeeperMonitor - NodeChildrenChanged,reloading data with event:WatchedEvent state:SyncConnected type:NodeChildrenChanged path:/node/svr
比较其它正常应用,最后一个缺少了event。
迫于无耐还是硬着头皮再找了下,发现了答案如下:
------------
-------------
所 有的Zookeeper读操作,包括getData()、getChildren()和exists(),都有一个开关,可以在操作的同时再设置一个 watch。在ZooKeeper中,Watch是一个一次性触发器,会在被设置watch的数据发生变化的时候,发送给设置watch的客户端。 watch的定义中有三个关键点:
-
一次性触发器
一 个watch事件将会在数据发生变更时发送给客户端。例如,如果客户端执行操作getData(“/znode1″, true),而后 /znode1 发生变更或是删除了,客户端都会得到一个 /znode1 的watch事件。如果 /znode1 再次发生变更,则在客户端没有设置新的watch的情况下,是不会再给这个客户端发送watch事件的。
-
发送给客户端
这 就是说,一个事件会发送向客户端,但可能在在操作成功的返回值到达发起变动的客户端之前,这个事件还没有送达watch的客户端。Watch是异步发送 的。但ZooKeeper保证了一个顺序:一个客户端在收到watch事件之前,一定不会看到它设置过watch的值的变动。网络时延和其他因素可能会导 致不同的客户端看到watch和更新返回值的时间不同。但关键点是,每个客户端所看到的每件事都是有顺序的。
-
被设置了watch的数据
这 是指节点发生变动的不同方式。你可以认为ZooKeeper维护了两个watch列表:data watch和child watch。getData()和exists()设置data watch,而getChildren()设置child watch。或者,可以认为watch是根据返回值设置的。getData()和exists()返回节点本身的信息,而getChildren()返回 子节点的列表。因此,setData()会触发znode上设置的data watch(如果set成功的话)。一个成功的 create() 操作会触发被创建的znode上的数据watch,以及其父节点上的child watch。而一个成功的 delete()操作将会同时触发一个znode的data watch和child watch(因为这样就没有子节点了),同时也会触发其父节点的child watch。
Watch 由client连接上的ZooKeeper服务器在本地维护。这样可以减小设置、维护和分发watch的开销。当一个客户端连接到一个新的服务器上 时,watch将会被以任意会话事件触发。当与一个服务器失去连接的时候,是无法接收到watch的。而当client重新连接时,如果需要的话,所有先 前注册过的watch,都会被重新注册。通常这是完全透明的。只有在一个特殊情况下,watch可能会丢失:对于一个未创建的znode的exist watch,如果在客户端断开连接期间被创建了,并且随后在客户端连接上之前又删除了,这种情况下,这个watch事件可能会被丢失。
ZooKeeper对Watch提供了什么保障
对于watch,ZooKeeper提供了这些保障:
关于Watch的一些值得注意的事情
-
因 为watch是一次性触发器,而获得事件再发送一个新的设置watch的请求这一过程会有延时,所以你无法确保你看到了所有发生在ZooKeeper上的 一个节点上的事件。所以请处理好在这个时间窗口中可能会发生多次znode变更的这种情况。(你可以不处理,但至少请认识到这一点)。//也就是说,在process()中如果处理得慢而没有注册new watch时,在这期间有其它事件出现时是不会通知!!之前可能就是没有意识到这点所以才引出本话题***********
--------------
Ref:
分享到:
相关推荐
实现zookeeper搭建单机集群,分机器搭建也可以。只要更改这个配置文件就可以了 start(){ sh /Users/mac/linuxsoft/zk-cluster/zookeeper-3.4.6/bin/zkServer.sh start /Users/mac/linuxsoft/zk-cluster/zookeeper...
zookeeper的docker镜像, wurstmeister/zookeeper,有一段时间镜像拉取老是超时,故存储镜像资源以备不时之需
CentOS 8 安装 ZooKeeper 3.8.0 详细步骤 ZooKeeper 是一个分布式应用程序协调服务,提供了配置管理、名称服务、分布式同步和提供组服务等功能。下面是 CentOS 8 安装 ZooKeeper 3.8.0 的详细步骤。 1. 下载安装包...
### Zookeeper 集群升级方案详解 #### 一、需求背景 随着业务的发展和技术的进步,现有的Zookeeper集群系统版本过低(当前版本为3.3.4),导致某些功能特性无法得到支持或表现不佳,这直接影响到了业务的正常运行...
Zookeeper 分布式服务框架是 Apache Hadoop 的一个子项目,它主要是用来解决分布式应用中经常遇到的一些数据管理问题,如:统一命名服务、状态同步服务、集群管理、分布式应用配置项的管理等。
【作品名称】:基于zookeeper+quartz/spring task的分布式任务调度组件,非常小巧,无需任何修改就可以使spring task具备分布式特性,确保所有任务在集群中不重复,不遗漏的执行。 【适用人群】:适用于希望学习...
这个只是其中一个版本的包,详细的可以在http://maven.outofmemory.cn/org.apache.zookeeper/zookeeper/里面找到更多的
使用Zookeeper作为注册中心 Dubbo官方文档Dubbo Dubbo SPI扩展 引入RocketMQ功能 方法级别的消息消费功能 RocketMQTemplate模板多种方法发送消息 RocketMQTransactionTemplate模板发送事务消息,基本实现弱分布式...
### CentOS 7.0 下 Zookeeper 的安装与配置详解 #### 一、Zookeeper简介 Zookeeper 是一个分布式的协调服务框架,它提供了一种高效、可靠的机制来维护集群中的分布式进程之间的协调工作,比如命名服务、配置管理、...
### Zookeeper 集群安装部署详解 #### 一、Zookeeper简介 Zookeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,它是集群的管理者,监视着集群中各个节点的状态根据节点...
zookeeper-3.4.14-1.x86_64.rpm centos7 Default locations binaries: /opt/zookeeper data: /var/lib/zookeeper logs: /var/log/zookeeper configs: /etc/zookeeper, /etc/sysconfig/zookeeper
ZooKeeper 增加权限登录验证 ZooKeeper 是一个广泛使用的分布式协调服务,它提供了许多有用的功能,如配置管理、名字服务、分布式锁等。然而,在 ZooKeeper 中存在一些安全漏洞,例如未经授权的访问、数据泄露等。...
### Zookeeper在CentOS7上的安装与配置 #### 一、概述 Zookeeper是一个开源的分布式协调服务,用于解决分布式应用程序中的常见问题,例如命名服务、配置管理、集群同步等。它提供了一种简单的方式来维护和管理...
大家都知道在Hadoop集群开启/关闭Zookeeper集群的时候,需要到不同的节点ZK的bin目录下执行对应的启动/关闭脚本,十分的麻烦。所以就有了以下脚本的产生~ 一键开启Zookeeper vim /export/servers/zookeeper-3.4.5...
**Zookeeper:分布式协调服务详解** Zookeeper是一个高性能、分布式的开源协调服务,它主要用来解决分布式环境中的数据一致性问题。在大型分布式系统中,Zookeeper被广泛用于配置管理、命名服务、分布式锁、集群...
### Zookeeper伪集群安装流程详解 #### 一、概述 Zookeeper是一款开源的分布式协调服务,主要用于解决分布式系统中常见的协调问题,如命名服务、配置管理、集群管理和分布式锁等。伪集群是一种特殊的集群模式,它...
这个Docker Compose 文件定义了一个包含Zookeeper和三个Kafka节点的服务集群。通过指定镜像、端口映射、环境变量和依赖关系等配置,实现了Zookeeper和Kafka的快速部署和集成。同时,在定义了一个名为"mynetwork"的...
### Zookeeper安装手册(Linux) #### 一、概述 Zookeeper是一个分布式的、开放源码的协调服务,用于管理和协调大型分布式系统中的进程。本文档旨在详细介绍如何在Linux环境下安装和配置Zookeeper。 #### 二、...