Zookeeper学习(二)
一、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学习(二)的更多相关文章
- ZooKeeper学习笔记(二)——内部原理
zookeeper学习笔记(二)--内部原理 1. zookeeper的节点的类型 总的来说可以分为持久型和短暂型,主要区别如下: 持久:客户端与服务器端断开连接的以后,创建的节点不会被删除: 持久化 ...
- ZooKeeper学习笔记二:API基本使用
Grey ZooKeeper学习笔记二:API基本使用 准备工作 搭建一个zk集群,参考ZooKeeper学习笔记一:集群搭建. 确保项目可以访问集群的每个节点 新建一个基于jdk1.8的maven项 ...
- Hbase深入学习(二) 安装hbase
Hbase深入学习(二) 安装hbase This guidedescribes setup of a standalone hbase instance that uses the local fi ...
- SpringCloud学习(二):微服务入门实战项目搭建
一.开始使用Spring Cloud实战微服务 1.SpringCloud是什么? 云计算的解决方案?不是 SpringCloud是一个在SpringBoot的基础上构建的一个快速构建分布式系统的工具 ...
- [转]ZooKeeper学习第一期---Zookeeper简单介绍
ZooKeeper学习第一期---Zookeeper简单介绍 http://www.cnblogs.com/sunddenly/p/4033574.html 一.分布式协调技术 在给大家介绍ZooKe ...
- emberjs学习二(ember-data和localstorage_adapter)
emberjs学习二(ember-data和localstorage_adapter) 准备工作 首先我们加入ember-data和ember-localstorage-adapter两个依赖项,使用 ...
- ReactJS入门学习二
ReactJS入门学习二 阅读目录 React的背景和基本原理 理解React.render() 什么是JSX? 为什么要使用JSX? JSX的语法 如何在JSX中如何使用事件 如何在JSX中如何使用 ...
- TweenMax动画库学习(二)
目录 TweenMax动画库学习(一) TweenMax动画库学习(二) TweenMax动画库学习(三) Tw ...
- 分布式助手Zookeeper(二)
分布式助手Zookeeper(二)博客分类: Zookeeper zookeeperzookeeper的安装和配置观察者observer 散仙在上篇文章介绍了,zookeeper的一系列基础知识,如果 ...
- zookeeper学习(上)
zookeeper学习(上) 在前面的文章里我多次提到zookeeper对于分布式系统开发的重要性,因此对zookeeper的学习是非常必要的.本篇博文主要是讲解zookeeper的安装和zookee ...
随机推荐
- js&jsp规范问题
1.js初始化问题 一般与数据库交互的需要进行初始化,固定控件一般不需要初始化.有些需要整体浏览器页面校准的可能需要初始化. //初始化操作按钮 $(function(){ ...
- Ethical Hacking - GAINING ACCESS(23)
CLIENT SIDE ATTACK - BeEF Framework Hooking targets using MITMF Tools: MITMF and BeEF Start BeEF and ...
- 【Docker】Redis 安装使用教程
1.安装 1.1 拉取镜像 docker pull redis redis:4.0 1.2 创建redis容器名"redistest1",并开启持久化 docker run -d ...
- SparkCore
一.概述 1,定义 RDD(Resilient Distributed Dataset)叫做弹性分布式数据集,是Spark中最基本的数据抽象.代码中是一个抽象类,它代表一个不可变.可分区.里面的元素可 ...
- 题解 CF785E 【Anton and Permutation】
考虑用分块解决这个题,一次交换对当前逆序对个数的影响是,加上两倍的在区间\([l+1,r-1]\)中比\(a_r\)小的元素个数,减去两倍的在区间\([l+1,r-1]\)中比\(a_l\)小的元素个 ...
- web自动化 -- HTMLreport(一)测试报告自定义测试用例名,重写ddt
一.需求痛点 1.HTMLreport测试报告的用例名不明确 2.希望可以自定义HTMLreport测试报告的用例名 3.痛点截图 二.解决办法 1.原因分析 HTMLreport测试报告中的用例名是 ...
- 在excel中如何给一列数据批量加上双引号
在实际开发中,会遇到这样的需求,大量的数据,需要从配置文件里读取,客户给到的枚举值是字符串,而配置文件里的数据,是json格式,需要加上双引号,这样就需要使用Excel来批量格式化一下数据. 客户给到 ...
- SELECT within SELECT Tutorial -- SQLZOO
SELECT within SELECT Tutorial 注意:where语句中对表示条件的需要用单引号, 下面的译文使用的是有道翻译如有不正确,请直接投诉有道 01.List each count ...
- Skill 脚本演示
https://www.cnblogs.com/yeungchie/ Schematic ycBusNet.il 用于原理图中按照一定格式,批量创建 Bus . ycNetToPin.il 通过选中一 ...
- Blob分析之board.hdev
* board.hdev: Detection of missing solder* 获取当前系统参数get_system ('clip_region', Information)*设置当前系统参数s ...