文章目录
四、客户端常用命令
命令行基本语法 | 功能描述 |
---|---|
help | 显示所有操作命令 |
ls [-w] [-s] path | 使用 ls 命令来查看znode的子节点, -w 监听子节点变化 -s 附加次级信息 |
create [-s] [-e] node value | 创建节点 -s 带序列的(后面追加系统自增的数字) -e 临时节点,重启或者超时时消失 |
get [-w] [-s] path | 获得节点的值 -w 监听节点内容变化 -s 附加次级信息 |
set | 设置/修改节点的具体值 |
stat | 查看节点状态 |
delete | 删除节点 |
deleteall | 递归删除节点和其子节点 |
五、Zookeeper节点
5.1 节点数据信息
[zk: localhost:2181(CONNECTED) 0] ls -s /
[zookeeper]cZxid = 0x0
ctime = Thu Jan 01 08:00:00 CST 1970
mZxid = 0x0
mtime = Thu Jan 01 08:00:00 CST 1970
pZxid = 0x9
cversion = 1
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 0
numChildren = 1
- czxid: 创建节点的事务 zxid 每次修改 ZooKeeper 状态都会产生一个 ZooKeeper 事务 ID。事务 ID 是 ZooKeeper 中所有修改总的次序。每次修改都有唯一的 zxid,如果 zxid1 小于 zxid2,那么 zxid1 在 zxid2 之前发生。
- ctime: znode 被创建的毫秒数
- mzxid: znode 最后更新的事务 zxid
- mtime: znode 最后修改的毫秒数
- pZxid: znode 最后更新的子节点 zxid
- cversion: znode 子节点变化号,znode 子节点修改次数
- dataversion: znode 数据变化号
- aclVersion: znode 访问控制列表的变化号
- ephemeralOwner: 如果是临时节点,这个是 znode 拥有者的 session id。如果不是临时节点则是 0
- dataLength: znode 的数据长度
- numChildren: znode 子节点数量
5.2 节点类型
5.3 监听器原理
客户端注册监听它关心的目录节点,当目录节点发生变化(数据改变、节点删除、子目录节点增加删除)时,ZooKeeper 会通知客户端
监听机制保证 ZooKeeper 保存的任何的数据的任何改变都能快速的响应到监听了该节点的应用程序
六、服务器动态上下线监听案例
需求:某分布式系统中,主节点可以有多台,可以动态上下线,任意一台客户端都能实时感知到主节点服务器的上下线。
新建Maven项目并导入依赖
<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.14.1</version>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.5.7</version>
</dependency>
</dependencies>
服务端:
/**
* @author Bandit
* @create 2022/2/19 23:06
* 无论是客户端还是服务端,对于zk来说都是客户端,只是操作不同而已
*/
public class DistributeServer {
private final String connectString = "192.168.2.128:2181,192.168.2.128:2182,192.168.2.128:2183";
private static int sessionTimeout = 60000;
private ZooKeeper zkClient = null;
private final String ParentPath = "/servers";
//获取到zookeeper的客户端连接
public void init() throws IOException {
zkClient = new ZooKeeper(connectString,sessionTimeout,watchedEvent -> {
});
}
//注册服务器到zk上
public void registerServer(String hostname) throws KeeperException, InterruptedException {
String created = zkClient.create(ParentPath+"/server", hostname.getBytes(StandardCharsets.UTF_8),
ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL);//模式为 -e -s,暂时的带序号的
System.out.println(hostname+"is online"+created);
}
//业务功能
public void business(String hostname) throws InterruptedException {
System.out.println(hostname+"正在服务。。");
Thread.sleep(Long.MAX_VALUE);
}
public static void main(String[] args) throws IOException, KeeperException, InterruptedException {
DistributeServer server = new DistributeServer();
server.init()