zookeeper监控的原理和使用(代码片段)

xiaoliuliu2050 xiaoliuliu2050     2023-04-02     580

关键词:

1、Watcher 机制:

  Zookeeper 允许客户端向服务端的某个 Znode 注册一个 Watcher 监听,当服务端的一些指定事件触发了这个 Watcher,服务端会向指定客户端发送一个事件通知来实现分布式的通知功能,然后客户端根据 Watcher 通知状态和事件类型做出业务上的改变。

工作机制:(1)客户端注册 watcher(2)服务端处理 watcher(3)客户端回调 watcher

2、Watcher 特性:

(1)一次性无论是服务端还是客户端,一旦一个 Watcher 被 触 发 ,Zookeeper 都会将其从相应的存储中移除。这样的设计有效的减轻了服务端的压力,不然对于更新非常频繁的节点,服务端会不断的向客户端发送事件通知,无论对于网络还是服务端的压力都非常大。

(2)客户端串行执行客户端 Watcher 回调的过程是一个串行同步的过程。

(3)轻量

  3.1、Watcher 通知非常简单,只会告诉客户端发生了事件,而不会说明事件的具体内容。

  3.2、客户端向服务端注册 Watcher 的时候,并不会把客户端真实的 Watcher 对象实体传递到服务端,仅仅是在客户端请求中使用 boolean 类型属性进行了标记。

(4)watcher event 异步发送 watcher 的通知事件从 server 发送到 client 是异步的,这就存在一个问题,不同的客户端和服务器之间通过 socket 进行通信,由于网络延迟或其他因素导致客户端在不通的时刻监听到事件,由于 Zookeeper 本身提供了 ordering guarantee,即客户端监听事件后,才会感知它所监视 znode发生了变化。所以我们使用 Zookeeper 不能期望能够监控到节点每次的变化。Zookeeper 只能保证最终的一致性,而无法保证强一致性。

(5)注册 watcher getData、exists、getChildren

(6)触发 watcher create、delete、setData

(7)当一个客户端连接到一个新的服务器上时,watch 将会被以任意会话事件触发。当与一个服务器失去连接的时候,是无法接收到 watch 的。而当 client 重新连接时,如果需要的话,所有先前注册过的 watch,都会被重新注册。通常这是完全透明的。只有在一个特殊情况下,watch 可能会丢失:对于一个未创建的 znode的 exist watch,如果在客户端断开连接期间被创建了,并且随后在客户端连接上之前又删除了,这种情况下,这个 watch 事件可能会被丢失。

3、客户端注册 Watcher 实现

(1)调用 getData()/getChildren()/exist()三个 API,传入 Watcher 对象

(2)标记请求 request,封装 Watcher 到 WatchRegistration

(3)封装成 Packet 对象,发服务端发送 request

(4)收到服务端响应后,将 Watcher 注册到 ZKWatcherManager 中进行管理

(5)请求返回,完成注册。

4. 服务端处理 Watcher 实现

(1)服务端接收 Watcher 并存储接收到客户端请求,处理请求判断是否需要注册 Watcher,需要的话将数据节点的节点路径和 ServerCnxn(ServerCnxn 代表一个客户端和服务端的连接,实现了 Watcher 的 process 接口,此时可以看成一个 Watcher 对象)存储在WatcherManager 的 WatchTable 和 watch2Paths 中去。

(2)Watcher 触发以服务端接收到 setData() 事务请求触发 NodeDataChanged 事件为例:

  2.1 封装 WatchedEvent将通知状态(SyncConnected)、事件类型(NodeDataChanged)以及节点路径封装成一个 WatchedEvent 对象

  2.2 查询 Watcher从 WatchTable 中根据节点路径查找 Watcher

  2.3 没找到;说明没有客户端在该数据节点上注册过 Watcher2.4 找到;提取并从 WatchTable 和 Watch2Paths 中删除对应 Watcher(从这里可以看出 Watcher 在服务端是一次性的,触发一次就失效了)

(3)调用 process 方法来触发 Watcher这里 process 主要就是通过 ServerCnxn 对应的 TCP 连接发送 Watcher 事件通知。

5. 客户端回调 Watcher

客户端 SendThread 线程接收事件通知,交由 EventThread 线程回调 Watcher。客户端的 Watcher 机制同样是一次性的,一旦被触发后,该 Watcher 就失效了。

6 代码使用

一、如何注册监听

zookeeper只能通过以下几个API注册监听器:

  • 通过构造器注册默认监听事件(在连接成功后会触发):
CountDownLatch countDownLatch = new CountDownLatch(1);
ZooKeeper zooKeeper = new ZooKeeper("192.168.0.106,192.168.0.108,192.168.0.109",
        5000, new Watcher() 
    @Override
    public void process(WatchedEvent event) 
        System.out.println("全局事件");
        if (Event.KeeperState.SyncConnected.equals(event.getState())) 
            countDownLatch.countDown();
        
    
);
countDownLatch.await();
  • 通过exist()/getData()/getChildren()方法绑定事件,这三个方法可以绑定自定义watcher或者传入true绑定默认的监听器
// 传入true则是再次绑定默认的监听器,所有监听器只会被触发一次,除非再次绑定
Stat stat = zooKeeper.exists(NODE, true);

二、如何触发监听事件

Watcher注册好后,我们要如何去触发呢?也分为下述两种情况:

  • 构造器绑定的默认监听器会在连接成功后触发,通常利用该方式来保证client端在操作节点时zookeeper已经连接成功,即上述实现
  • 通过exists()/getData()/getChildren()绑定的事件,会监听到相应节点的变化事件,即setData()/delete()/create()操作。

三、操作,事件,watcher 的关系

什么样的操作会产生什么类型的事件:

 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设置子节点监视

 

代码示例参考 https://blog.csdn.net/a____a23456/article/details/90447463

 

原理系列之——zookeeper的watch监控机制(代码片段)

在进入今天的正题之前,先来简单介绍下Zookeeper:  Zookeeper是一个分布式应用程序协调服务,保证数据的一致性,其提供的功能包括:配置维护、域名维护、分布式同步、组服务等。  watch监控机制是zookee... 查看详情

使用zkui监控管理zookeeper集群(代码片段)

一、zookeeper集群的按照请参考:便捷高效的搭建zookeeper集群和批量启动脚本 二、ZKUI安装#yum安装mavenyuminstall-ymaven#更换使用阿里云maven源vim/etc/maven/settings.xml<mirrors><mirror><id>nexus-aliyun</id><mirro 查看详情

zabbix3.4监控zookeeper3.4(代码片段)

zabbix3.4监控zookeeperzookeeper监控要点系统监控这个监控linux系统以及修改linux服务器参数即可内存使用量ZooKeeper应当完全运行在内存中,不能使用到SWAP。JavaHeap大小不能超过可用内存。Swap使用量使用Swap会降低ZooKeeper的性能,设置vm.... 查看详情

zookeeper集群以及经典应用场景(代码片段)

ZooKeeper基本原理分析_踩踩踩从踩的博客-CSDN博客前言前篇文章主要针对zk的基本使用,以及特性和基本使用点的分析,本篇文章会继续分析zk的集群 如何搭建一个zk集群部署 以及监控,以及leader选举,协议核心&#x... 查看详情

zookeeper原理一(代码片段)

ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,它包含一个简单的原语集,分布式应用程序可以基于它实现同步服务,配置维护和命名服务等。Zookeeper是hadoop的一个子项目,其发展历程无需赘述。在分布式应用中... 查看详情

使用metricbeat监控zookeeper遇到的问题(代码片段)

...dashboard功能setup.dashboards.enabled:true然后启动metricbeat3.启动zookeeper模块./metricbeatmodulesenablezookeeper会看到目录modules.d下的zookeeper.yml.disabled变成zookeeper.yml4.编辑zookeeper.yml,配置上监听的zookeeper地址-module:zookeepermetricsets:-mntr-serverperiod:10sh... 查看详情

zookeeper的基本原理(zk架构zk存储结构watch机制独立安装zk集群间同步复制)(代码片段)

...ode节点,如果只部署一个,可能造成单点故障,可以依托Zookeeper实现这两种关系主节点的高可用性配置。Zookeeper实现的方法是:部署多个Master或Namenode,并区别为活跃节点和待命节点。当活跃节点发生故障后,待命节点自动提升为... 查看详情

zookeeper简单小节(代码片段)

1.ZooKeeper是什么  ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务。主要用来解决分布式集群中应用系统的一致性问题,它能提供基于类似于文件系统的目录节点树方式的数据存储,但是Zookeeper并不是用来专门存... 查看详情

zookeeper的leader选举原理和底层源码实现超级详解(代码片段)

zookeeper选举详解一,zookeeper选举原理1,源码下载2,zookeeper集群选举流程2.1,zookeeper集群启动以及配置加载2.2,leader选举工作准备开始2.3,leader投票开始(重点)2.4,结点之间的pk(重点)2.5,leader挂了重... 查看详情

使用zkui监控管理zookeeper集群(代码片段)

一、zookeeper集群的按照请参考:便捷高效的搭建zookeeper集群和批量启动脚本 二、ZKUI安装#yum安装mavenyuminstall-ymaven#更换使用阿里云maven源vim/etc/maven/settings.xml<mirrors><mirror><id>nexus-aliyun</id><mirrorOf>central</... 查看详情

grafana+prometheus监控zookeeper(代码片段)

...tps://www.cnblogs.com/zgz21/p/12935636.html  1.下载比较新版本的zookeeper,需要是3.6.0以后的版本,因为在这个版本后zookeeper自身加入了支持Prometheus的监控,比较方便,之前的版本的或许只能使用JMX进行监控了。  2.我下载的是3.6.1windo... 查看详情

浅谈androidmatrix使用原理(代码片段)

前言看了一下关于对Android性能监控框架Matrix的介绍九个模块的内容,已经有jym阐述过,就不对赘述了,找不到的再说.🤣分别为:Matrix介绍内存泄漏监控及原理介绍内存泄漏监控源码分析Hprof文件分析卡顿监控... 查看详情

浅谈androidmatrix使用原理(代码片段)

前言看了一下关于对Android性能监控框架Matrix的介绍九个模块的内容,已经有jym阐述过,就不对赘述了,找不到的再说.🤣分别为:Matrix介绍内存泄漏监控及原理介绍内存泄漏监控源码分析Hprof文件分析卡顿监控... 查看详情

zookeeper使用demo(c#/java)(代码片段)

Zookeeper作为一个分布式的服务框架,主要用来解决分布式集群中应用系统的一致性问题,它能提供基于类似于文件系统的目录节点树方式的数据存储,但是Zookeeper并不是用来专门存储数据的,它的作用主要是用来维护和监控你存... 查看详情

zookeeper-详述(代码片段)

为什么使用Zookeeper?1、大部分分布式应用需要一个主控、协调器或控制器来管理物理分布的子进程(如资源、任务分配等)2、目前,大部分应用需要开发私有的协调程序,缺乏一个通用的机制»协调程序的反复编写浪费,且... 查看详情

storm面试小题(代码片段)

...数据得以实时的被处理和存储。    1)集群是基于zookeeper集群存在的,Nimbus和Supervisor都是依赖于zookeeper建立的    2)主节点和工作节点的具体状态都保存在zookeeper中,主节点通过查看工作节点的状态文件是否... 查看详情

zookeeper原理详解及常用操作(代码片段)

ZooKeeper是什么?ZooKeeper是一个开源的分布式应用程序协调系统。简称ZK,ZK是一个典型的分布式数据一致性解决方案,分布式应用程序可以基于它实现数据的发布/订阅、负载均衡、名称服务、分布式协调/通知、集群管理、Master选... 查看详情

zookeeper与activemq整合(代码片段)

(一)zookeeper与activemq原理使用ZooKeeper实现的Master-Slave实现方式,是对ActiveMQ进行高可用的一种有效的解决方案,高可用的原理:使用ZooKeeper(集群)注册所有的ActiveMQBroker。只有其中的一个Broker可以对外提供服务(也就是Master节... 查看详情