watcher监听

什么是watcher接口

同一个事件类型在不同的通知状态中代表的含义有所不同,下图列举了常见的通知状态和事件类型。

Watcher通知状态与事件类型一览

上图列举了ZooKeeper中最常见的几个通知状态和事件类型。
回调方法process()
process方法是Watcher接口中的一个回调方法,当ZooKeeper向客户端发送一个Watcher事件通知时,客户端就会对相应的process方法进行回调,从而实现对事件的处理。process方法的定义如下:
abstract public void process(WatchedEvent event);
这个回调方法的定义非常简单,我们重点看下方法的参数定义:WatchedEvent。
WatchedEvent包含了每一个事件的三个基本属性:通知状态(keeperState),事件类型(EventType)和节点路径(path),其数据结构如图7-5所示。ZooKeeper使用WatchedEvent对象来封装服务端事件并传递给Watcher,从而方便回调方法process对服务端事件进行处理。
提到WatchedEvent,不得不讲下WatcherEvent实体。笼统地讲,两者表示的是同一个事物,都是对一个服务端事件的封装。不同的是,WatchedEvent是一个逻辑事件,用于服务端和客户端程序执行过程中所需的逻辑对象,而WatcherEvent因为实现了序列化接口,因此可以用于网络传输。
服务端在生成WatchedEvent事件之后,会调用getWrapper方法将自己包装成一个可序列化的WatcherEvent事件,以便通过网络传输到客户端。客户端在接收到服务端的这个事件对象后,首先会将WatcherEvent还原成一个WatchedEvent事件,并传递给process方法处理,回调方法process根据入参就能够解析出完整的服务端事件了。
需要注意的一点是,无论是WatchedEvent还是WatcherEvent,其对ZooKeeper服务端事件的封装都是机及其简单的。举个例子来说,当/zk-book这个节点的数据发生变更时,服务端会发送给客户端一个“ZNode数据内容变更”事件,客户端只能够接收到信息。

代码

public class ZkWatcher implements Watcher {
//连接地址
private static final String ZK_ADDRESS="0.0.0.0:2181";
//超时时间
private static final Integer ZK_SESSION_TIMEOUT=; private ZooKeeper zooKeeper; public ZkWatcher() {
openConnection(ZK_ADDRESS,ZK_SESSION_TIMEOUT);
} /**
* 回调方法,监听连接,监听增删改节点
* @param event
*/
@Override
public void process(WatchedEvent event) {
//获取当前的状态
Event.KeeperState keeperState = event.getState();
//获取通知类型
Event.EventType eventType = event.getType();
//获取操作节点的路径
String path = event.getPath(); System.out.println("当前状态为:"+keeperState+"\t通知类型为:"+eventType+"\t操作的节点路径:"+path);
//已经成功连接
if(Event.KeeperState.SyncConnected==keeperState){
//连接状态
if(Event.EventType.None==eventType){
System.out.println("========================连接事件回调========================");
}
//创建节点
if (Event.EventType.NodeCreated==eventType){
System.out.println("========================创建节点事件回调========================");
}
//修改节点
if(Event.EventType.NodeDataChanged==eventType){
System.out.println("========================修改节点事件回调========================");
}
//删除节点
if(Event.EventType.NodeDeleted==eventType){
System.out.println("========================删除节点事件回调========================");
}
}
}
/**
* 连接zk方法
*/
public void openConnection(String zk_address,Integer zk_sessionout){
try {
zooKeeper = new ZooKeeper(zk_address, zk_sessionout, this);
System.out.println("!!!!!连接zk成功!!!!!!!");
} catch (IOException e) {
e.printStackTrace();
}
} /**
* 关闭zk连接
*
*/
public void closeConnection(){
try {
if(zooKeeper!=null){
zooKeeper.close();
} } catch (InterruptedException e) {
e.printStackTrace();
}
} /**
* 添加节点
* @param
*/
public void createNode(String path,String data){
try {
//启动监听
zooKeeper.exists(path,true);
String result = zooKeeper.create(path, data.getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
System.out.println("创建节点成功:"+result);
} catch (KeeperException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
} /**
* 修改节点
*/
public void setNode(String path,String data){ try {
//启动监听
zooKeeper.exists(path,true);
zooKeeper.setData(path, data.getBytes(), -);
System.out.println("修改节点成功");
} catch (KeeperException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
} /**
* 删除节点
*/
public void deleteNode(String path){ try {
//启动监听
zooKeeper.exists(path,true);
zooKeeper.delete(path, -);
System.out.println("删除节点成功");
} catch (KeeperException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
ZkWatcher zkWatcher=new ZkWatcher();
//zkWatcher.createNode("/zkNode","zkValue"); zkWatcher.setNode("/zkNode","zkValueSet"); zkWatcher.deleteNode("/zkNode"); zkWatcher.closeConnection();
}
}

leader选举机制

Zookeeper Server三种角色:Leader,Follower,Observer。
Leader是Zookeeper 集群工作机制的核心,主要工作:
1.调度者:集群内部各个服务节点的调度者
2.事务请求:事务请求的唯一调度和处理者,保证集群事务处理的顺序性
Follower主要职责:
1.非事务请求:Follower 直接处理非事务请求,对于事务请求,转发给 Leader
2.Proposal 投票:Leader 上执行事务时,需要 Follower 投票,Leader 才真正执行
3.Leader 选举投票
Observer主要职责:
1.非事务请求:Follower 直接处理非事务请求,对于事务请求,转发给 Leader
Observer 跟 Follower的区别:
1.Follower 参与投票:Leader 选举、Proposal 提议投票(事务执行确认)
2.Observer 不参与投票:只用于提供非事务请求的处理

选择机制中的概念
serverId(服务器ID 既 myid)
比如有三台服务器,编号分别是1,2,3。
编号越大在选择算法中的权重越大。
zxid(最新的事物ID 既 LastLoggedZxid)
服务器中存放的最大数据ID。
ID值越大说明数据越新,在选举算法中数据越新权重越大。
epoch (逻辑时钟 既 PeerEpoch)
每个服务器都会给自己投票,或者叫投票次数,同一轮投票过程中的逻辑时钟值是相同的。
每投完一次票这个数据就会增加,然后与接收到的其它服务器返回的投票信息中的数值相比。
如果收到低于当前轮次的投票结果,该投票无效,需更新到当前轮次和当前的投票结果。

选举状态
LOOKING,竞选状态。
FOLLOWING,随从状态,同步leader状态,参与投票。
OBSERVING,观察状态,同步leader状态,不参与投票。
LEADING,领导者状态。

选举算法
通过 zoo.cfg 配置文件中的 electionAlg 属性指定 (1-3),要理解算法,需要一些paxos算法的理论基础。
1 对应:LeaderElection 算法。
2 对应:AuthFastLeaderElection 算法。
3 对应:FastLeaderElection 默认的算法。

投票内容
选举人ID
选举人数据ID
选举人选举轮数
选举人选举状态
推举人ID
推举人选举轮数

Zookeeper中的watcher监听和leader选举机制的更多相关文章

  1. Zookeeper数据类型、节点类型、角色、watcher监听机制

    1.Zookeeper数据类型:层次化目录结构+少量数据 Zookeeper包含层次化的目录结构,每个Znode都有唯一的路径标识,Znode可以包含数据和子节点. 其中Znode数据可以有多个版本, ...

  2. 8.7.ZooKeeper Watcher监听

    1.ZooKeeper Watcher ZooKeeper 提供了分布式数据发布/订阅功能,一个典型的发布/订阅模型系统定义了一种一对多的订阅关系,能让多个订阅者同时监听某一个主题对象, 当这个主题对 ...

  3. Fragment中的按键监听

    在Fragmentzhong中写按键监听,有两处处需要注意: 1)是否是当前显示的fragment:. 2)在所依托的activity中的onKeyDown方法处理监听事件: 其他地方和普通按键监听一 ...

  4. jQuery中的事件监听方式及异同点

    jQuery中的事件监听方式及异同点 作为全球最知名的js框架之一,jQuery的火热程度堪称无与伦比,简单易学的API再加丰富的插件,几乎是每个前端程序员的必修课.从读<锋利的jQuery&g ...

  5. vue中的数据监听以及数据交互

    现在我们来看一下vue中的数据监听事件$watch, js代码: new Vue({ el:"#div", data:{ arr:[,,] } }).$watch("ar ...

  6. 简单剖析Node中的事件监听机制(一)

    使用js的class类简单的实现一个事件监听机制,不同于浏览器中的时间绑定与监听,类似于node中的时间监听,并且会在接下来的文章中去根据自己的理解去写一下Event模块中的原理. Node.js使用 ...

  7. 在vue中使用watch监听对象或数组

    最近发现在vue中使用watch监听对象或者数组时,当数组或者对象只是单一的值改变时,并不会出发watch中的事件. 在找问题过程中,发现当数组使用push一类的方法时,会触发watch,如果只是单一 ...

  8. Eclipse插件开发中的选择监听机制(Selection Provider-Listener)

    Eclipse插件开发中的选择监听机制(Selection Provider-Listener) 监听机制是eclipse插件开发或rcp应用开发中经常使用的技术,比方点击TableViewer或Tr ...

  9. 面试官:说一说Zookeeper中Leader选举机制

    哈喽!大家好,我是小奇,一位不靠谱的程序员 小奇打算以轻松幽默的对话方式来分享一些技术,如果你觉得通过小奇的文章学到了东西,那就给小奇一个赞吧 文章持续更新 一.前言 今天又是一个阳光明媚的一天,我又 ...

随机推荐

  1. Java开发笔记(一百三十二)Swing的表格

    前面介绍了程序界面上一些简单控件的组合排列,它们用来表达相互之间联系较弱的信息倒还凑合,要是用来表达关联性较强的聚合信息就力不从心了.倘若只是简单信息的罗列,例如商品名称列表.新闻标题列表.学生姓名列 ...

  2. 题解 P3957 【跳房子】

    对于这题有一个不用单调队列并且不是玄学设置区间最大值的做法 这题校内模拟考的时候打二分+枚举,结果写炸了,跑过来看题解发现为什么他们的区间最大值都是 $ 1005 $ ???特别懵,其实我的代码在dp ...

  3. PHP 可变参数

    <?php //php 可变参数 function concatenate( ...$strings): string { $string = ''; //此时的strings 是一个数组 fo ...

  4. Java doc注释

    常用Java注释标签(Java comment tags) @author 作者 适用范围:文件.类.方法 (多个作者使用多个@author标签标识,java doc中显示按输入时间顺序罗列.) 例: ...

  5. Pycharm专业版配置远程服务器并自动同步代码

    一.使用场景 如果每次都在本机上面写代码,然后传到服务器上面,在服务器上面运行就太麻烦了.这样的方式十分繁琐,效率很低. 因此,希望可以像下面一样操作: 可以直接在本机上码代码 自动将代码同步到远程服 ...

  6. 企业级容器管理平台 Rancher 介绍入门及如何备份数据

    企业级容器管理平台 Rancher 介绍入门及如何备份数据 是什么 Rancher 是一个为 DevOps 团队提供的完整的 Kubernetes 与容器管理解决方案的开源的企业级容器管理平台.它解决 ...

  7. 使用springboot实现一个简单的restful crud——02、dao层单元测试,测试从数据库取数据

    接着上一篇,上一篇我们创建了项目.创建了实体类,以及创建了数据库数据.这一篇就写一下Dao层,以及对Dao层进行单元测试,看下能否成功操作数据库数据. Dao EmpDao package com.j ...

  8. python day5 lambda,内置函数,文件操作,冒泡排序以及装饰器

    目录 python day 5 1. 匿名函数lambda 2. python的内置函数 3. python文件操作 4. 递归函数 5. 冒泡排序 6. 装饰器 python day 5 2019/ ...

  9. [AIR] NativeExtension在IOS下的开发实例 --- IOS项目的创建 (一)

    来源:http://bbs.9ria.com/thread-102037-1-1.html 最近看到本版块的很多关于NativeExtension的应用.但是都是在Android下面的应用.也有很多朋 ...

  10. OPENWRT使用华为 E353/E3131的4G转WIFI路由器作为WAN接口上网(笔记)

    参考文档: http://www.yizu.org/archives/721/ 原来使用Hilink模式真的很简单 1.安装一些包: opkg install kmod-usb-net-rndis k ...