一、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节点的数据改变了
三、Zoopkeeper的JAVAAPI操作
这里操作Zookeeper的JavaAPI使用的是一套zookeeper客户端框架 Curator ,解决了很多Zookeeper客户端非常底层的细节开发工作 。
Curator包含了几个包:
curator-framework:对zookeeper的底层api的一些封装
curator-recipes:封装了一些高级特性,如:Cache事件监听、选举、分布式锁、分布式计数器等
1、创建maven工程,导入jar包
创建一个测试类,开始进行zookeeper的javaapi编程
2、创建永久节点
//创建永久节点 @Test public void createZnode() throws Exception { /* 定制一个重试策略 param1:重试的时间间隔 param2:重试的最大次数 */ RetryPolicy retryPolicy=new ExponentialBackoffRetry(1000,1); /* 获取客户端对象 param1:要连接的zookeeper服务器列表 param2:会话的超时时间 param3:链接超时时间 param4:重试策略 */ String connectionStr="192.168.88.100,192.168.88.120,192.168.88.120"; CuratorFramework client=CuratorFrameworkFactory.newClient(connectionStr,3000,8000,retryPolicy); //打开客户端 client.start(); //创建节点 client.create().creatingParentsIfNeeded().withMode(CreateMode.PERSISTENT).forPath("/hello2","world".getBytes()); //关闭客户端 client.close(); }
运行后,进入linux查看,创建成功
3、创建临时节点
//创建临时节点 @Test public void createTmpZnode() throws Exception { /* 定制一个重试策略 param1:重试的时间间隔 param2:重试的最大次数 */ RetryPolicy retryPolicy=new ExponentialBackoffRetry(1000,1); /* 获取客户端对象 param1:要连接的zookeeper服务器列表 param2:会话的超时时间 param3:链接超时时间 param4:重试策略 */ String connectionStr="192.168.88.100,192.168.88.120,192.168.88.120"; CuratorFramework client=CuratorFrameworkFactory.newClient(connectionStr,3000,8000,retryPolicy); //打开客户端 client.start(); //创建节点 client.create().creatingParentsIfNeeded().withMode(CreateMode.EPHEMERAL).forPath("/hello3","world".getBytes()); //关闭客户端 Thread.sleep(10000); client.close(); }
和创建永久节点的区别是:临时节点是:EPHEMERAL,而且要让他休眠几秒否则Linux看不到,因为是临时的,会话结束就会消失。
4、修改节点数据
使用的是:client.setData().forPath(节点路径,要更新的数据(记得转换成byte))
//设置节点数据 @Test public void setZnodeData() throws Exception { /* 定制一个重试策略 param1:重试的时间间隔 param2:重试的最大次数 */ RetryPolicy retryPolicy=new ExponentialBackoffRetry(1000,1); /* 获取客户端对象 param1:要连接的zookeeper服务器列表 param2:会话的超时时间 param3:链接超时时间 param4:重试策略 */ String connectionStr="node01:2181,node02:2181,node03:2181"; CuratorFramework client=CuratorFrameworkFactory.newClient(connectionStr,3000,8000,retryPolicy); //打开客户端 client.start(); //修改节点数据 client.setData().forPath("/hello2","zookeeper".getBytes()); //关闭客户端 client.close(); }
5、获取节点数据
用byte数组来获取client里的数据然后转换成String输出
//获取节点数据 @Test public void getZnodeData() throws Exception { /* 定制一个重试策略 param1:重试的时间间隔 param2:重试的最大次数 */ RetryPolicy retryPolicy=new ExponentialBackoffRetry(1000,1); /* 获取客户端对象 param1:要连接的zookeeper服务器列表 param2:会话的超时时间 param3:链接超时时间 param4:重试策略 */ String connectionStr="node01:2181,node02:2181,node03:2181"; CuratorFramework client=CuratorFrameworkFactory.newClient(connectionStr,3000,8000,retryPolicy); //打开客户端 client.start(); //修改节点数据 byte[] bytes=client.getData().forPath("/hello2"); System.out.println(new String(bytes)); //关闭客户端 client.close(); }
在打印处输出:
6、设置节点的watch机制
通过监听hello3节点,对其进行创建,修改,删除
//节点的watch机制 @Test public void watchZnode() throws Exception { /* 1、定制一个重试策略 param1:重试的时间间隔 param2:重试的最大次数 */ RetryPolicy retryPolicy=new ExponentialBackoffRetry(1000,1); /* 2、获取客户端对象 param1:要连接的zookeeper服务器列表 param2:会话的超时时间 param3:链接超时时间 param4:重试策略 */ String connectionStr="node01:2181,node02:2181,node03:2181"; CuratorFramework client=CuratorFrameworkFactory.newClient(connectionStr,3000,8000,retryPolicy); //3、打开客户端 client.start(); //4、创建一个TreeCache对象,指定要监控的节点路径 final TreeCache treeCache=new TreeCache(client,"/hello3"); //5、自定义一个监听器 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; } } } }); //6、开始监听 treeCache.start(); Thread.sleep(100000); //7、关闭客户端 client.close(); }
打印台输出: