zookeeper第一章:集群搭建
zookeeper第二章:API接口
这一次来学习zookeeper的操作接口,期中包括命令行和客户端。

直接启动会发现,我们连接的是本机zookeeper,单机模式的时候这样连接就可以,但当启动集群时,我们希望可以随时连接其客户端。quit退出。

使用-server指定客户端和端口
bin/zkCli.sh -server hadoop102:2181

仍然用本机做示例。

ls -s /

(1)czxid:创建节点的事务 zxid
每次修改 ZooKeeper 状态都会产生一个 ZooKeeper 事务 ID。事务 ID 是 ZooKeeper 中所
有修改总的次序。每次修改都有唯一的 zxid,如果 zxid1 小于 zxid2,那么 zxid1 在 zxid2 之
前发生。
(2)ctime:znode 被创建的毫秒数(从 1970 年开始)
(3)mzxid:znode 最后更新的事务 zxid
(4)mtime:znode 最后修改的毫秒数(从 1970 年开始)
(5)pZxid:znode 最后更新的子节点 zxid
(6)cversion:znode 子节点变化号,znode 子节点修改次数
(7)dataversion:znode 数据变化号
(8)aclVersion:znode 访问控制列表的变化号
(9)ephemeralOwner:如果是临时节点,这个是 znode 拥有者的 session id。如果不是
临时节点则是 0。
(10)dataLength:znode 的数据长度
(11)numChildren:znode 子节点数量
这些概念性的东西,了解即可。
创建节点
节点有两类持久/临时,有序号/无序号,所以共有四种节点。
create /sanguo "diaochan"

2. 永久节点(有序号)

带序号节点

说一下两者区别,带序号可以直接追加,无序号不能。

-临时节点(无序号)
create -e /honglou "jiabaoyv"
create -e -s /shuihu "linchong"

查看一下现有节点,我们退出重进入。

可以看到临时节点已经消失了。

get -s /sanguo

set /sanguo "lvbu"

现在我在104进行监听注册,103进行修改。
get -w /sanguo

我们在103进行数据修改。

在104查看结果

现在我们再次修改

再次查看104

这次并没有变化,这类监听只能进行一次,第二次便需要重新申请。
104操作
ls -w /sanguo

103修改

在104依旧可以监听。


deteall就是递归删除,不管节点下面是否有子节点都可以删除。
这个不演示过程了

可以根据自己需要修改版本。
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.18.0</version>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.7.1</version>
</dependency>
</dependencies>

log4j.rootLogger=INFO, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c]- %m%n
log4j.appender.logfile=org.apache.log4j.FileAppender
log4j.appender.logfile.File=target/spring.log
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern=%d %p [%c]- %m%n

package com.atguigu.zk;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooKeeper;
import org.junit.Test;
import java.io.IOException;
public class zkClient {
//目标客户端
private String connectString="hadoop102:2181,hadoop103:2181,hadoop104:2181";
//超时等待4秒
private int seesionTimeout=4000;
@Test
public void init() throws IOException {
ZooKeeper zooClient = new ZooKeeper(connectString, seesionTimeout, new Watcher() {
@Override
public void process(WatchedEvent watchedEvent) {
}
});
}
}
初始化成功


package com.atguigu.zk;
import org.apache.zookeeper.*;
import org.junit.Before;
import org.junit.Test;
import java.io.IOException;
public class zkClient {
//目标客户端
private String connectString="hadoop102:2181,hadoop103:2181,hadoop104:2181";
//超时等待4秒
private int seesionTimeout=4000;
private ZooKeeper zkClient;
@Before
public void init() throws IOException {
zkClient = new ZooKeeper(connectString, seesionTimeout, new Watcher() {
@Override
public void process(WatchedEvent watchedEvent) {
}
});
}
//添加新节点
@Test
public void create() throws InterruptedException, KeeperException {
String nodeCreated = zkClient.create("/atguigu", "ss.avi".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
}
}

package com.atguigu.zk;
import org.apache.zookeeper.*;
import org.junit.Before;
import org.junit.Test;
import java.io.IOException;
import java.util.List;
public class zkClient {
//目标客户端
private String connectString="hadoop102:2181,hadoop103:2181,hadoop104:2181";
//超时等待4秒
private int seesionTimeout=10000;
private ZooKeeper zkClient;
@Before
public void init() throws IOException {
zkClient = new ZooKeeper(connectString, seesionTimeout, new Watcher() {
@Override
public void process(WatchedEvent watchedEvent) {
System.out.println("---------------------------");
List<String> children = null;
try {
children = zkClient.getChildren("/", true);
for (String child : children) {
System.out.println(child);
}
System.out.println("---------------------------");
} catch (KeeperException e) {
throw new RuntimeException(e);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
});
}
//添加新节点
@Test
public void create() throws InterruptedException, KeeperException {
String nodeCreated = zkClient.create("/atguigu", "ss.avi".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
}
//监听节点
@Test
public void getChildren() throws InterruptedException, KeeperException {
List<String> children = zkClient.getChildren("/", true);
Thread.sleep(Long.MAX_VALUE);
}
}
现在节点是清空的

我们创建一个节点在将其删除。

再次查看控制台。

package com.atguigu.zk;
import org.apache.zookeeper.*;
import org.apache.zookeeper.data.Stat;
import org.junit.Before;
import org.junit.Test;
import java.io.IOException;
import java.util.List;
public class zkClient {
//目标客户端
private String connectString="hadoop102:2181,hadoop103:2181,hadoop104:2181";
//超时等待4秒
private int seesionTimeout=10000;
private ZooKeeper zkClient;
@Before
public void init() throws IOException {
zkClient = new ZooKeeper(connectString, seesionTimeout, new Watcher() {
@Override
public void process(WatchedEvent watchedEvent) {
// System.out.println("---------------------------");
// List children = null;
// try {
// children = zkClient.getChildren("/", true);
// for (String child : children) {
// System.out.println(child);
// }
// System.out.println("---------------------------");
// } catch (KeeperException e) {
// throw new RuntimeException(e);
// } catch (InterruptedException e) {
// throw new RuntimeException(e);
// }
}
});
}
//添加新节点
@Test
public void create() throws InterruptedException, KeeperException {
String nodeCreated = zkClient.create("/atguigu", "ss.avi".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
}
@Test
public void getChildren() throws InterruptedException, KeeperException {
List<String> children = zkClient.getChildren("/", true);
Thread.sleep(Long.MAX_VALUE);
}
@Test
public void exits() throws InterruptedException, KeeperException {
Stat stat = zkClient.exists("/atguigu", false);
System.out.println(stat==null?"not exists":"exists");
}
}

现在我们创建这个节点,然后在运行。


zookeeper第二章API接口部分就到这里。