总结:zookeeper相当于一个远程平台,我们可以将数据放在上面,他是一个树形结构,每一个节点称为一个Znode
数据模型:每个节点或称为目录,都可以存放数据并且存放节点,有双重功能
重点watch机制:
ZooKeeper 中,引入了 Watcher 机制来实现这种分布式的通知功能 。
总的来说可以概括 Watcher 为以下三个过程:客户端向服务端注册 Watcher、
服务端事件发生触发 Watcher、客户端回调 Watcher 得到触发事件情况
首先在需要搭建一个zookeeper集群,非常简单,只需要修改tar包里面的配置文件的数据存放位置 ,另外在存放数据位置的文件夹下面新建一个myid用户存放编号,在配置文件中配置3个server.1=XXX:2181 即可
好了,步入正题,开始说明zookeer的相关操作
第一部分:linux搭建的zookeeper集群中利用客户端操作CURD
zookeeper安装目录中有一个客户端/export/servers/zookeeper-3.4.5-cdh5.14.0/bin zkCli.sh
启动zkCli.sh 直接输入zkCli.sh即可 ,注意客户端要运行,zookeeper服务器必须运行才可以啊,否则报错
输入help可得到客户端所有的命令
创建节点
create [-s] [-e] path data acl s表示临时 e表示序号递增
查询节点
ls path [watch] 后面可以跟watch监听某个节点
修改节点
set path data [version]
删除节点
delete path [version]
递归删除
rmr path
获取某个节点的详细信息
get path [watch]
第二部分: java代码控制zookeeper的增删改查及watch机制监控
pom.xml文件
引入3个依赖,curator-framework curator-recipes google-collections
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>hadoopdemo</artifactId>
<groupId>cn.itcast.hadoop</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>demo01_zk</artifactId>
<repositories>
<repository>
<id>cloudera</id>
<url>https://repository.cloudera.com/artifactory/cloudera-repos/</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>2.12.0</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>2.12.0</version>
</dependency>
<dependency>
<groupId>com.google.collections</groupId>
<artifactId>google-collections</artifactId>
<version>1.0</version>
</dependency>
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>5.1</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>
</project>
新增操作
/**
* @Description:创建新节点
* @:Param
* @:Return
*/
@Test
public void createNode() throws Exception {
//1 创建客户端
String conneciton="node01:2181,node02:2181,node03:2181";
RetryPolicy retryPolicy = new ExponentialBackoffRetry(3000, 1);
CuratorFramework client = CuratorFrameworkFactory.newClient(conneciton,3000,3000, retryPolicy);
//2 开启客户端
client.start();
//3 创建节点(createMode可以创建多种形式的)
client.create().creatingParentsIfNeeded().withMode(CreateMode.PERSISTENT).forPath("/demo01/world");
client.close();
}
修改操作
/**
* @Description:修改节点数据
* @:Param
* @:Return
*/
@Test
public void updateNode() throws Exception {
//创建对象
String connetion = "node01:2181,node02:2181,node03:2181";
RetryPolicy retryPolicy=new ExponentialBackoffRetry(5000,1);
CuratorFramework client = CuratorFrameworkFactory.newClient(connetion, retryPolicy);
client.start();
//修改
client.setData().forPath("/demo01/world","您好啊".getBytes());
client.close();
}
查询操作
/**
* @Description:查询
* @:Param
* @:Return
*/
@Test
public void selectNode() throws Exception {
//创建对象
String connection ="node01:2181,node02:2181,node03:2181";
RetryPolicy retryPolicy= new ExponentialBackoffRetry(5000,1);
CuratorFramework client = CuratorFrameworkFactory.newClient(connection, retryPolicy);
client.start();
//查询
byte[] bytes = client.getData().forPath("/demo01/world");
System.out.println(new java.lang.String(bytes));
client.close();
}
删除操作
/**
* @Description:删除
* @:Param
* @:Return
*/
@Test
public void deleteNode() throws Exception {
//创建
String connction="node01:2181,node02:2181,node03:2181";
RetryPolicy retryPolicy=new RetryForever(5000);
CuratorFramework client = CuratorFrameworkFactory.newClient(connction, retryPolicy);
client.start();
//删除
client.delete().forPath("/hello5");
client.close();
}
watch机制(重点,跟上面的套路是一样的,获取客户端client再操作)
/**
* @Description: watch机制
* @:Param
* @:Return
*/
@Test
public void watchNode() throws Exception {
String connction="node01:2181,node02:2181,node03:2181";
RetryPolicy retryPolicy= new RetryForever(5000);
CuratorFramework client = CuratorFrameworkFactory.newClient(connction, retryPolicy);
client.start();
//watch
//设置节点cache
TreeCache treeCache = new TreeCache(client,"/");
//设置监听器
treeCache.getListenable().addListener(new TreeCacheListener() {
public void childEvent(CuratorFramework client, TreeCacheEvent event) throws Exception {
ChildData data = event.getData();
if(data!=null){
//switch 判断各种可能性
switch (event.getType()){
case NODE_ADDED:
System.out.println("节点新增:路径:"+data.getPath()+"数据:"+new String(data.getData()));
break;
case NODE_REMOVED:
System.out.println("节点删除,路径:"+data.getPath()+"数据:"+new String(data.getData()));
break;
case NODE_UPDATED:
System.out.println("节点修改,路径:"+data.getPath()+"数据:"+new String(data.getData()));
break;
}
}
}
});
//开始监听
treeCache.start();
//让程序不结束,一直监听
Thread.sleep(900000000);
}
这样如果zookeeper发生增删改操作,那么watch机制就会及时知道,并且打印出结果