一、Znode节点属性

dataVersion 数据版本, 每次当 Znode 中的数据发生变化的时候, dataVersion
都会自增一下
cversion 节点版本, 每次当 Znode 的节点发生变化的时候, cversion 都会自增
aclVersion ACL(Access Control List) 的版本号, 当 Znode 的权限信息发生
变化的时候aclVersion会自增
zxid 事务ID
ctime 创建时间
mtime 最近一次更新的时间
ephemeralOwner 如果 Znode 为临时节点, ephemeralOwner 表示与该节点关联
的 SessionId

我们通过get 节点的目录,可以得到节点的属性

二、watch机制

对zookeeper里的某个节点设置个监听,可以知道该节点是否进行了“增加”,“删除”,“修改”

Watcher 的特点
一次性触发 一个 Watcher 只会被触发一次, 如果需要继续监听, 则需要再次添加
Watcher
事件封装: Watcher 得到的事件是被封装过的, 包括三个内容 keeperState,
eventType, path

设置监听机制给/hello节点

另外再打开Hadoop101,修改/hello里的数据,看能否监听到

证明:可以监听到hello节点的数据改变了

三、zookeeper的JAVAAPI操作

这里操作Zookeeper的JavaAPI使用的是一套zookeeper客户端框架 Curator ,解决了很多
Zookeeper客户端非常底层的细节开发工作 。
Curator包含了几个包:
curator-framework:对zookeeper的底层api的一些封装
curator-recipes:封装了一些高级特性,如:Cache事件监听、选举、分布式锁、分布式
计数器等

创建maven工程,导入jar包

创建一个测试类,开始进行zookeeper的javaapi编程

节点操作

①创建永久节点

 @Test
/*
创建永久节点
*/
public void createZnode() throws Exception {
//1.定制一个重试策略
/*
parame1:重试间隔时间
parame2:重试的最大次数
*/
RetryPolicy retryPolicy=new ExponentialBackoffRetry(1000,1); //2.获取一个客户端对象
/*
parame1:要连接的zookeeper服务器列表
parame2:会话的超时时间
parame3:连接的超时时间
param4:重试策略
*/
String connectionStr="192.168.31.101:2181,192.168.31.102:2181,192.168.31.103:2181";
CuratorFramework client=CuratorFrameworkFactory.newClient(connectionStr,8000,8000,retryPolicy);
//3.开启客户端
client.start();
//4.创建节点
client.create().creatingParentsIfNeeded().withMode(CreateMode.PERSISTENT).forPath("/hello2","world".getBytes());
//5.关闭客户端
client.close();
}

运行后,进入linux查看,创建成功

②创建临时节点

和创建永久节点的区别是:临时节点是:EPHEMERAL,而且要让他休眠几秒否则Linux看不到,因为是临时的,会话结束就会消失。

 @Test
/*
创建临时节点
*/
public void createTmpZnode() throws Exception {
//1.定制一个重试策略
/*
parame1:重试间隔时间
parame2:重试的最大次数
*/
RetryPolicy retryPolicy=new ExponentialBackoffRetry(1000,1); //2.获取一个客户端对象
/*
parame1:要连接的zookeeper服务器列表
parame2:会话的超时时间
parame3:连接的超时时间
param4:重试策略
*/
String connectionStr="192.168.31.101:2181,192.168.31.102:2181,192.168.31.103:2181";
CuratorFramework client=CuratorFrameworkFactory.newClient(connectionStr,8000,8000,retryPolicy);
//3.开启客户端
client.start();
//4.创建节点
client.create().creatingParentsIfNeeded().withMode(CreateMode.EPHEMERAL).forPath("/hello4","world".getBytes());
Thread.sleep(5000);
//5.关闭客户端
client.close();
}

这样就看到了,不过等会话结束就没了

③修改节点数据

使用的是:client.setData().forPath(节点路径,要更新的数据(记得转换成byte))

/*
修改节点数据
*/
@Test
public void setZnodeData() throws Exception {
RetryPolicy retryPolicy=new ExponentialBackoffRetry(1000,1); String connectionStr="192.168.31.101:2181,192.168.31.102:2181,192.168.31.103:2181";
CuratorFramework client=CuratorFrameworkFactory.newClient(connectionStr,8000,8000,retryPolicy);
client.start();
client.setData().forPath("/hello","zookeeper".getBytes());
client.close();
}

④获取节点数据

用byte数组来获取client里的数据

然后转换成String输出

/*
获取节点数据
*/
@Test
public void getZnodeData() throws Exception {
RetryPolicy retryPolicy=new ExponentialBackoffRetry(1000,1); String connectionStr="192.168.31.101:2181,192.168.31.102:2181,192.168.31.103:2181";
CuratorFramework client=CuratorFrameworkFactory.newClient(connectionStr,8000,8000,retryPolicy);
client.start();
byte[] bytes= client.getData().forPath("/hello");
System.out.println(new String(bytes));
client.close();
}

在打印处输出:

⑤设置节点的watch机制

通过监听hello3节点,对其进行创建,修改,删除

/*
节点的watch机制
*/
@Test
public void watchZnode() throws Exception {
RetryPolicy retryPolicy=new ExponentialBackoffRetry(1000,1);
String connectionStr="192.168.31.101:2181,192.168.31.102:2181,192.168.31.103:2181";
CuratorFramework client=CuratorFrameworkFactory.newClient(connectionStr,8000,8000,retryPolicy);
client.start();
TreeCache treeCache=new TreeCache(client,"/hello3");
treeCache.getListenable().addListener(new TreeCacheListener() {
@Override
public void childEvent(CuratorFramework curatorFramework, TreeCacheEvent treeCacheEvent) throws Exception {
ChildData data= treeCacheEvent.getData();
if(data!=null){
switch (treeCacheEvent.getType()){
case NODE_ADDED:
System.out.println("监控到有新增节点!");
break;
case NODE_REMOVED:
System.out.println("监控到有节点被移除!");
break;
case NODE_UPDATED:
System.out.println("监控到有节点被更新!");
break;
default:
break;
}
}
}
});
treeCache.start(); Thread.sleep(100000); }

打印台输出:

Zookeeper学习(二)的更多相关文章

  1. ZooKeeper学习笔记(二)——内部原理

    zookeeper学习笔记(二)--内部原理 1. zookeeper的节点的类型 总的来说可以分为持久型和短暂型,主要区别如下: 持久:客户端与服务器端断开连接的以后,创建的节点不会被删除: 持久化 ...

  2. ZooKeeper学习笔记二:API基本使用

    Grey ZooKeeper学习笔记二:API基本使用 准备工作 搭建一个zk集群,参考ZooKeeper学习笔记一:集群搭建. 确保项目可以访问集群的每个节点 新建一个基于jdk1.8的maven项 ...

  3. Hbase深入学习(二) 安装hbase

    Hbase深入学习(二) 安装hbase This guidedescribes setup of a standalone hbase instance that uses the local fi ...

  4. SpringCloud学习(二):微服务入门实战项目搭建

    一.开始使用Spring Cloud实战微服务 1.SpringCloud是什么? 云计算的解决方案?不是 SpringCloud是一个在SpringBoot的基础上构建的一个快速构建分布式系统的工具 ...

  5. [转]ZooKeeper学习第一期---Zookeeper简单介绍

    ZooKeeper学习第一期---Zookeeper简单介绍 http://www.cnblogs.com/sunddenly/p/4033574.html 一.分布式协调技术 在给大家介绍ZooKe ...

  6. emberjs学习二(ember-data和localstorage_adapter)

    emberjs学习二(ember-data和localstorage_adapter) 准备工作 首先我们加入ember-data和ember-localstorage-adapter两个依赖项,使用 ...

  7. ReactJS入门学习二

    ReactJS入门学习二 阅读目录 React的背景和基本原理 理解React.render() 什么是JSX? 为什么要使用JSX? JSX的语法 如何在JSX中如何使用事件 如何在JSX中如何使用 ...

  8. TweenMax动画库学习(二)

    目录            TweenMax动画库学习(一)            TweenMax动画库学习(二)            TweenMax动画库学习(三)            Tw ...

  9. 分布式助手Zookeeper(二)

    分布式助手Zookeeper(二)博客分类: Zookeeper zookeeperzookeeper的安装和配置观察者observer 散仙在上篇文章介绍了,zookeeper的一系列基础知识,如果 ...

  10. zookeeper学习(上)

    zookeeper学习(上) 在前面的文章里我多次提到zookeeper对于分布式系统开发的重要性,因此对zookeeper的学习是非常必要的.本篇博文主要是讲解zookeeper的安装和zookee ...

随机推荐

  1. js 中 attachEvent 简示例

    attachEvent绑定事件,函数的默认this指向为window,要解决问题可以通过call改变方法的指向! var div = document.getElementsByTagName('di ...

  2. Java应用服务器之tomcat基础配置(一)

    前文我们聊到了java相关重要组件和它们之间的关系以及jdk.tomcat部署回顾请参考https://www.cnblogs.com/qiuhom-1874/p/13302938.html:今天我们 ...

  3. html2canvas 实现页面转图片并下载

    一 前言 最近做了一个周报,从不同的数据表抓取数据,然后展示到前端页面显示.这个过程不难,让我烦恼的是:要把周报的数据导出来,然后打印,打印也必须在一张纸上.想到这里,我整理了一下思绪,我要写几个存储 ...

  4. 从0搭建一个基于 ELK 的日志、指标收集与监控系统

    为了使得私有化部署的系统能更健壮,同时不增加额外的部署运维工作量,本文提出了一种基于 ELK 的开箱即用的日志和指标收集方案. 在当前的项目中,我们已经使用了 Elasticsearch 作为业务的数 ...

  5. Python中ftplib模块的使用

    ftplib模块的主要接口 # from ftplib import FTP #加载ftp模块 # ftp=FTP() #设置变量 # ftp.set_debuglevel(2) #打开调试级别2,显 ...

  6. HTTP请求方式及常见问题

    请求方式 当前HTTP一共有八种方式.有三种是有HTTP1.0提供,剩余五种则是有HTTP1.1提供 常见问题 啥是OPTIONS?有啥作用 是浏览器对复杂跨域请求的一种处理方式,在真正发送请求之前, ...

  7. 【Redis学习专题】- Redis主从+哨兵集群部署

    集群版本: redis-4.0.14 集群节点: 节点角色 IP redis-master 10.100.8.21 redis-slave1 10.100.8.22 redis-slave2 10.1 ...

  8. 题解 洛谷 P3726 【[AH2017/HNOI2017]抛硬币】

    可以分别枚举两人正面朝上的次数来统计答案,所求即为 \[\sum_{i=0}^{a}\sum_{j=0}^{b} \binom{a}{i} \binom{b}{j} [i>j] \] 将\(i\ ...

  9. python-在python3中使用容联云通讯发送短信验证码

    容联云通讯是第三方平台,能够提供短信验证码和语音通信等功能,这里只测试使用短信验证码的功能,因此只需完成注册登录(无需实名认证等)即可使用其短信验证码免费测试服务,不过免费测试服务只能给控制台中指定的 ...

  10. B站学习的回顾总结

    视频地址 https://www.bilibili.com/video/av50680998/ 1.MVC 和MVVM有什么区别? MVC 是后端开发的概念: Model   view  contro ...