`

zookeeper 丢失事件/miss event

 
阅读更多

今天在统计页面上发现有个节点丢失了,经过仔细分析后,发现同一个节点上的二个应用(同时监控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以及异步回复都是有序的。 ZooKeeper客户端库保证所有事件都会按顺序分发。

  • 客户端会保障它在看到相应的znode的新数据之前接收到watch事件。//这保证了在process()再次利用zk client访问时数据是存在的

  • 从ZooKeeper接收到的watch事件顺序一定和ZooKeeper服务所看到的事件顺序是一致的

关于Watch的一些值得注意的事情

  • Watch是一次性触发器,如果你得到了一个watch事件,而你希望在以后发生变更时继续得到通知,你应该再设置一个watch

  • 因 为watch是一次性触发器,而获得事件再发送一个新的设置watch的请求这一过程会有延时,所以你无法确保你看到了所有发生在ZooKeeper上的 一个节点上的事件。所以请处理好在这个时间窗口中可能会发生多次znode变更的这种情况。你可以不处理,但至少请认识到这一点)。//也就是说,在process()中如果处理得慢而没有注册new watch时,在这期间有其它事件出现时是不会通知!!之前可能就是没有意识到这点所以才引出本话题***********

  • 一个watch对象或一个函数/上下文对,为一个事件只会被通知一次。比如,如果同一个watch对象在同一个文件上分别通过exists和getData注册了两次,而这个文件之后被删除了,这时这个watch对象将只会收到一次该文件的deletion通知。//同一个watch注册同一个节点多次只会生成一个event.这里我想到如果一个watch注册不同的node,也应当出现多个event?

  • 当你从一个服务器上断开时(比如服务器出故障了),在再次连接上之前,你将无法获得任何watch。请使用这些会话事件来进入安全模式:在disconnected状态下你将不会收到事件,所以你的程序在此期间应该谨慎行事

--------------
Ref:
 
分享到:
评论

相关推荐

    zookeeper搭建集群

    实现zookeeper搭建单机集群,分机器搭建也可以。只要更改这个配置文件就可以了 start(){ sh /Users/mac/linuxsoft/zk-cluster/zookeeper-3.4.6/bin/zkServer.sh start /Users/mac/linuxsoft/zk-cluster/zookeeper...

    zookeeper(3.3.6/3.4.5/3.4.6)

    Zookeeper 分布式服务框架是 Apache Hadoop 的一个子项目,它主要是用来解决分布式应用中经常遇到的一些数据管理问题,如:统一命名服务、状态同步服务、集群管理、分布式应用配置项的管理等。

    zookeeper单机和集群安装

    Zookeeper 集群中只要有过半的节点是正常的情况下,那么整个集群对外就是可用的。正是基于这个 特性,要将 ZK 集群的节点数量要为奇数(2n+1:如 3、5、7 个节点)较为合适。

    一个springbootmysql数据库/多数据源mongidb数据库/apollo配置中心/zookeeper注册中心/dub

    使用Zookeeper作为注册中心 Dubbo官方文档Dubbo Dubbo SPI扩展 引入RocketMQ功能 方法级别的消息消费功能 RocketMQTemplate模板多种方法发送消息 RocketMQTransactionTemplate模板发送事务消息,基本实现弱分布式...

    zookeeper-3.4.14-1.x86_64.rpm for centos7

    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一键启动/关闭脚本所产生的乌龙事件

    大家都知道在Hadoop集群开启/关闭Zookeeper集群的时候,需要到不同的节点ZK的bin目录下执行对应的启动/关闭脚本,十分的麻烦。所以就有了以下脚本的产生~   一键开启Zookeeper vim /export/servers/zookeeper-3.4.5...

    org.apache.zookeeper/zookeeper的jar包

    这个只是其中一个版本的包,详细的可以在http://maven.outofmemory.cn/org.apache.zookeeper/zookeeper/里面找到更多的

    最新版linux apache-zookeeper-3.7.0-bin.tar.gz

    最新版linux apache-zookeeper-3.7.0-bin.tar.gz最新版linux apache-zookeeper-3.7.0-bin.tar.gz

    dubbo-admin-0.2.0-SNAPSHOT.jar

    admin.registry.address=zookeeper://127.0.0.1:2181 admin.config-center=zookeeper://127.0.0.1:2181 admin.metadata-report.address=zookeeper://127.0.0.1:2181 admin.root.user.name=root admin.root.user....

    ZooKeeper-3.4.6分布式安装指南

    介绍ZooKeeper-3.4.6版本的分布式安装,力求细致,提供精确的安装指导。本文的安装环境是64位的SuSE 10.1 Linux,也适用于ZooKeeper-3.4.8。  ZooKeeper节点间不需要互登录,因此不用配置免密码登录。

    centos7 zookeeper一键安装部署

    该文件为centos7环境下,zookeeper3.4.12一键部署配置脚本。下载该文件,拖到服务器上,$ sh zookeeper.sh 执行该脚本就能自动化下载、安装、远程访问、开机自启动等。 仓库路径:/usr/local/zookeeper/zookeeper-...

    分布式中间件zookeeper源码

    server程序入口(启动类在zookeeper-server/src/main/java文件夹中,org.apache.zookeeper.server.quorum.QuorumPeerMain),program argument为conf/zoo.cfg,将conf/log4j.properties配置拷贝到zookeeper-server/...

    无需操作可以直接下载使用的jar 最新版的dubbo admin 2.7 兼容2.6

    的application.properties中修改自己的zookeeper的ip server.port=9999 # centers in dubbo2.7 admin.registry.address=zookeeper://192.168.0.102:2181 admin.config-center=zookeeper://192.168.0.102:...

    dubbo-admin-2.5.4及dubbo-monitor-2.5.3 安装及配置

    单机zookeeper情况zookeeper://ip:port; 集群zookeeper情况zookeeper://ip:port?backup=ip:port,ip:port; dubbo.admin.root.password dubbo-admin root账号的密码 4.启动tomcat ok dubbo-monitor安装要点: 1....

    zookeeper:动物园管理员锁演示

    zookeeper demo 安装zookeeper:wget http://archive.apache.org/dist/zookeeper/stable/zookeeper-3.4.6.tar.gz 解压文件 tar -zxvf zookeeper-3.4.6.tar.gz -C /usr/local 我是将解压的文件放入 /usr/local/ ...

    zookeeper_3.0:利用zookeeper在死服务器上存活

    zookeeper_3.0 //如果您有任何错误或发现,请随时告诉我。 利用zookeeper在死服务器上存活 启动Zookeeper 1.下载:到以下链接下载。 (下载稳定版,本报告由zookeeper.3.4.6提供) 2.下载后,我们应该配置它。 ...

    zookeeper日志查看工具

    #Zookeeper的日志可以用LogFormatter查看 ##命令方式如下 java -classpath .:slf4j-api-1.7.2.jar:zookeeper-3.4.6.jar org.apache.zookeeper.server.LogFormatter /var/lib/zookeeper/version-2/log.1 ##window...

    Zookeeper修改运行日志zookeeper.out输出路径

    Zookeeper中运行日志 zookeeper.out 文件的输出路径默认为启动脚本的当前路径,导致Zookeeper集群启动失败时总是不记得输出日志在哪儿,不便于查找错误原因,因此很有必要设置固定路径来保存运行日志 在本次实验之前...

    zookeeper安全漏洞修复

    ZooKeeper 未授权访问【原理扫描】,zookeeper安全漏洞修复方法和操作步骤

    zookeeper python接口实例详解

    本文主要讲python支持zookeeper的接口库安装和使用。zk的python接口库有zkpython,还有kazoo,下面是zkpython,是基于zk的C库的python接口。 zkpython安装 前提是zookeeper安装包已经在/usr/local/zookeeper下 cd /...

Global site tag (gtag.js) - Google Analytics