ZooKeeper 集群 cli 使用

首先,我们可以是用命令bin/zkCli.sh 进入 ZooKeeper 的命令行客户端,这种是直接连接本机的 ZooKeeper 服务器,还有一种方式,可以连接其他的ZooKeeper 服务器,只需要我们在命令后面接一个参数-server 就可以了。例如:zkCli.sh -server hadoop01:2181进入命令行之后,键入 help 可以查看简易的命令帮助文档,如下图

命令说明

说明 命令
查看 znode 子节点内容 ls /
ls /ZooKeeper
创建 znode 节点 create /zk “myData”
获取 znode 数据 get /ZooKeeper
get /ZooKeeper/node1
设置 znode 数据 set /zk “myData1”
监听 znode 事件 ls /ZooKeeper watch ## 就对一个节点的子节点变化事件注册了监听
get /ZooKeeper watch ## 就对一个节点的数据内容变化事件注册了监听
创建临时 znode 节点 create -e /zk “myData”
创建顺序 znode 节点 create -s /zk “myData”
删除 znode 节点 delete /zk ## 只能删除没有子 znode 的
rmr /zk ## 不管里头有多少 znode,统统删除

znode 数据信息字段解释

说明
mydata 节点数据
cZxid = 0x400000093 节点创建的时候的 zxid
The zxid of the change that caused this znode to be created
ctime = Fri Dec 02 16:41:50 PST 2016 节点创建的时间
The time in milliseconds from epoch when this znode was created.
mZxid = 0x400000093 节点修改的时候的 zxid,与子节点的修改无关
The zxid of the change that last modified this znode.
mtime = Fri Dec 02 16:41:50 PST 2016 节点的修改的时间
The time in milliseconds from epoch when this znode was last modified.
pZxid = 0x400000093 和子节点的创建/删除对应的 zxid,和修改无关,和孙子节点无关
The zxid of the change that last modified children of this znode.
cversion = 0 子节点的更新次数
The number of changes to the children of this znode. dataVersion = 0
dataVersion = 0 节点数据的更新次数
The number of changes to the data of this znode.
aclVersion = 0 节点(ACL)的更新次数
The number of changes to the ACL of this znode.
ephemeralOwner = 0x0 如果该节点为 ephemeral 节点, ephemeralOwner 值表示与该节点绑定的 session id. 如果该节点不是 ephemeral 节点, ephemeralOwner 值为 0
The session id of the owner of this znode if the znode is an ephemeral node. If it is not anephemeral node, it will be zero.
dataLength = 6 节点数据的字节数
The length of the data field of this znode.
numChildren = 0 子节点个数,不包含孙子节点
The number of children of this znode.

ZooKeeper 四字命令:

1
2
3
使用格式:
[root@hadoop02 ~]# echo conf|nc hadoop02 2181
注意:需要安装 nc,不然不能使用
说明
conf 输出相关服务配置的详细信息
cons 列出所有连接到服务器的客户端的完全的连接/会话的详细信息。包括“接受/发送”的包数量、会话 id、操作延迟、最后的操作执行等等信息
dump 列出未经处理的会话和临时节点
envi 输出关于服务环境的详细信息(区别于 conf 命令)
reqs 列出未经处理的请求
ruok 测试服务是否处于正确状态。如果确实如此,那么服务返回“imok ”,否则不做任何相应
stat 输出关于性能和连接的客户端的列表
wchs 列出服务器 watch 的详细信息
wchc 通过 session 列出服务器 watch 的详细信息,它的输出是一个与 watch 相关的会话的列表
wchp 通过路径列出服务器 watch 的详细信息。它输出一个与 session 相关的路径

ZooKeeper 集群 Java API 使用

说明
create (path, data, flags ) 创建一个 znode, path 是其路径,data 是存储在该 ZNode 上的数据,flags 常用的有: PERSISTEN, PERSISTENT_SEQUENTAIL, EPHEMERAL, EPHEMERAL_SEQUENTAILdelete(path, version): 删除一个 ZNode,可以通过 version 删除指定的版本, 如果 version 是-1的话,表示删除所有的版本
exists (path, watch): 判断指定 ZNode 是否存在,并设置是否 Watch 这个 ZNode。这里如果要设置 Watcher 的话,Watcher 是在创建 ZooKeeper 实例时 指定的,如果要设置特定的 Watcher的话,可以调用另一个重载版本的 exists(path, watcher)。以下几个带 watch 参数的 API 也都类似
getData (path, watch): 读取指定 ZNode 上的数据,并设置是否 watch 这个 ZNode
setData (path, watch): 更新指定 ZNode 的数据,并设置是否 Watch 这个 ZNode
getChildren (path, watch): 获取指定 ZNode 的所有子 ZNode 的名字,并设置是否 Watch 这个ZNode
sync (path): 把所有在 sync 之前的更新操作都进行同步,达到每个请求都在半数以上的ZooKeeper Server 上生效。path 参数目前没有用
setAcl (path, acl): 设置指定 ZNode 的 Acl
getAcl (path): 获取指定 ZNode 的 Acl 信息

实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
package com.ghgj.zk;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import org.apache.ZooKeeper.CreateMode;
import org.apache.ZooKeeper.ZooDefs.Ids;
import org.apache.ZooKeeper.ZooKeeper;
import org.apache.ZooKeeper.data.ACL;
import org.apache.ZooKeeper.data.Stat;
public class ZooKeeperDemo {
// 客户端去请求链接的时候的服务器链接地址信息
private static String connectString = "hadoop02:2181,hadoop03:2181,hadoop04:2181";
// 客户端去请求链接的超时时长
private static int sessionTimeout = 4000;
// 节点名称,统一命名
private static String znode = "/zk/huangbo1";
public static void main(String[] args) throws Exception {
// 拿 ZooKeeper 链接
ZooKeeper zk = new ZooKeeper(connectString, sessionTimeout, null);
// 创建 znode
String createdNode = zk.create(znode, "huangbo".getBytes(), Ids.OPEN_ACL_UNSAFE,
CreateMode.PERSISTENT);
System.out.println(createdNode+"节点创建成功");
// 查看节点
byte[] data = zk.getData(znode, null, null);
System.out.println(new String(data));
// 修改节点数据
Stat setData = zk.setData(znode, "huangbo-xifu".getBytes(), -1);
System.out.println(new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(new
Date(setData.getMtime())));
byte[] data1 = zk.getData(znode, null, null);
System.out.println(new String(data1));
// 获取 znode 的权限信息
List<ACL> aclList = zk.getACL(znode, null);
for(ACL acl: aclList){
System.out.println(acl.getPerms());
}
// 判断节点是否存在
Stat exists = zk.exists(znode, null);
System.out.println(null != exists?true:false);
// 获取子节点
List<String> children = zk.getChildren("/", null);
for(String child: children){
System.out.println(child);
}// 删除节点
zk.delete(znode, -1);
Stat exists1 = zk.exists(znode, null);
System.out.println(null == exists1?"删除成功":"删除失败");
zk.close();
}
}