Zookeeper基本使用

命令行操作
API使用
ZkClient使用
获取文章代码

命令行操作

首先进入zookeeper客户端

cd /bin
./zkCli.sh
  • ./zkClis.sh 指连接本地的zookeeper服务器
  • ./zkCli.sh -server ip:port 指连接指定的服务器

创建节点

命令介绍
create -s -e path data acl

-s 指顺序节点
-e 指临时节点 
path 指路径,以/开头
data 指数据内容
acl 指进行权限控制

创建持久性顺序节点

create -s /zk_test 123

创建持久性节点

create /zk_test 123

创建临时顺序节点

create -s -e /zk_test 123456

Zookeeper基本使用_第1张图片
因为zk_test00006是临时节点,可以通过 quit 结束当前会话后,再次进入,查看验证
在这里插入图片描述


读取节点

命令介绍
ls path 为查看指定路径下的下一级节点->并非所有节点
如图:ls / 只能查看到 /b和/c 查看不到 /b1和/b2
Zookeeper基本使用_第2张图片
get path可以获取指定节点下的数据内容
在这里插入图片描述
stat path可以查看指定节点的状态信息
Zookeeper基本使用_第3张图片

  • cZxid 指节点被创建时的事务ID
  • ctime 指创建节点的时间
  • mZxid 指节点最后一次被修改时的事务ID
  • mtime 指节点最后一次被修改的时间
  • pZxid 表示该节点的子节点列表最后一次被修改时的事务ID.只有子节点列表更新才会更新pZid,子节点内容更新不会更新.
  • cversion 指子节点的版本号
  • dataVersion 指内容版本号
  • aclVersion 指acl版本
  • ephemeralOwner 指创建该临时节点时的会话 sessionId,如果持久性节点name值为0
  • dataLength 指数据长度
  • numChildren直系子节点个数

更新节点

命令介绍
set path data [version]

path 节点路径
data 更新内容
version 非必填 版本号

Zookeeper基本使用_第4张图片


删除节点

delete paht 删除指定路径的节点,如果该节点下存在子节点,将无法删除,需要先将子节点删除后才能够删除
Zookeeper基本使用_第5张图片


API使用

导入jar,版本和zookeeper一致

<dependency>
    <groupId>org.apache.zookeepergroupId>
    <artifactId>zookeeperartifactId>
    <version>3.7.1version>
dependency>
创建会话
/**
 * @Author ziye
 * @Date 2022/7/28
 * @Describe 创建会话
 */
public class CreateSession implements Watcher {

    private static CountDownLatch countDownLatch = new CountDownLatch(1);

    public static void main(String[] args) throws IOException, InterruptedException {

        /*
         * new Zookeeper(connectString,sessionTimeOut,Wather)
         * connectString: 连接地址 -> ip:端口
         * sessionTimeOut: 会话超时时间 -> 毫秒
         * Wather: 监听器(当特定事件触发监听时,zookeeper会通过watcher通知到客户端)
         */

        String ipAndPort = "192.168.171.128:2181";

        ZooKeeper zooKeeper = new ZooKeeper(ipAndPort, 5000, new CreateSession());
        System.out.println(zooKeeper.getState());

        //计数工具类,不让main方法结束,让线程处于阻塞状态
        countDownLatch.await();
        System.out.println("连接成功...");
    }

    /*
     * 回调方法 -> 处理来自服务器端的watcher通知
     */
    @Override
    public void process(WatchedEvent event) {
        if (event.getState() == Event.KeeperState.SyncConnected) {
            System.out.println("调用...");
            countDownLatch.countDown();
        }
    }
}

Zookeeper基本使用_第6张图片


创建节点
/*
 * path :节点创建的路径
 * data[] :节点创建要保存的数据,是个byte类型的
 * acl :节点创建的权限信息(4种类型)
 *   ANYONE_ID_UNSAFE : 表示任何⼈
 *   AUTH_IDS :此ID仅可⽤于设置ACL。它将被客户机验证的ID替换。
 *   OPEN_ACL_UNSAFE :这是⼀个完全开放的ACL(常⽤)--> world:anyone
 *   CREATOR_ALL_ACL :此ACL授予创建者身份验证ID的所有权限
 * createMode :创建节点的类型(4种类型)
 *   PERSISTENT:持久节点
 *   PERSISTENT_SEQUENTIAL:持久顺序节点
 *   EPHEMERAL:临时节点
 *   EPHEMERAL_SEQUENTIAL:临时顺序节点
 * 返回值为该节点名称
 */
String nodeNamePersistent = zooKeeper.create("/zy_persistent", "持久节点".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
String nodeNamePersistentSequential = zooKeeper.create("/zy_persistent_sequential", "持久顺序节点".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT_SEQUENTIAL);
String nodeNameEphemeral = zooKeeper.create("/zy_ephemeral", "临时节点".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);
System.out.println("持久节点 " + nodeNamePersistent);
System.out.println("持久顺序节点 " + nodeNamePersistentSequential);
System.out.println("临时节点 " + nodeNameEphemeral);

在这里插入图片描述


获取节点数据
/*
 * path : 获取数据的路径
 * watch : 是否开启监听
 * stat : 节点状态信息 -> null: 表示获取最新版本的数据
 * zk.getData(path, watch, stat);
 */
byte[] data = zooKeeper.getData("/zy_persistent", false, null);
System.out.println(new String(data));

Zookeeper基本使用_第7张图片


获取某个节点的子节点
 /*
   path:路径
   watch:是否要启动监听,当⼦节点列表发⽣变化,会触发监听
   zooKeeper.getChildren(path, watch);
   */
List<String> children = zooKeeper.getChildren("/", true);
System.out.println(children);

Zookeeper基本使用_第8张图片


更新某个节点的内容
        byte[] data = zooKeeper.getData("/zy_test01", false, null);
        System.out.println("修改前的节点内容: " + new String(data));
        /*
         * path:路径
         * data:要修改的内容 byte[]
         * version:为-1,表示对最新版本的数据进⾏修改
         * zooKeeper.setData(path, data,version);
         */
        zooKeeper.setData("/zy_test01", "修改内容111".getBytes(), -1);
        byte[] data1 = zooKeeper.getData("/zy_test01", false, null);
        System.out.println("修改后的节点内容: " + new String(data1));

Zookeeper基本使用_第9张图片


删除节点
        /*
         * zooKeeper.exists(path,watch) :判断节点是否存在,是否监听
         * zookeeper.delete(path,version) : 删除节点
         */
        String nodeName = "/zy_test01";
        if (zooKeeper.exists(nodeName, false) != null) {
            System.out.println("删除节点前: " + zooKeeper.getChildren("/", false));
            zooKeeper.delete(nodeName, -1);
            System.out.println("删除 " + nodeName + " 节点成功!");
            System.out.println("删除节点后: " + zooKeeper.getChildren("/", false));
        } else {
            System.out.println(nodeName + " 节点不存在!");
        }

在这里插入图片描述


ZkClient使用

ZkClient创建会话并递归创建节点
ZkClient client = new ZkClient("192.168.171.128:2181");
System.out.println("已经创建会话..........");
/*
 * path: 路径
 * createParents: 是否进行递归创建
 */
client.createPersistent("/zy_father/zy_son", true);
System.out.println("节点创建完成...");

Zookeeper基本使用_第10张图片


递归删除节点
/*
 * 递归删除节点
 */
client.deleteRecursive("/zy_father");
System.out.println("节点递归删除完成...");

Zookeeper基本使用_第11张图片


获取子节点,并对节点进行监听
//获取子节点列表
List<String> children = client.getChildren("/zy_father");
System.out.println("children = " + children);
//注册监听事件
//客户端可以对一个不存在的节点进行监听,该节点的子节点发生变化或该节点被创建或删除都会触发监听
String path = "/zy_mother";
client.subscribeChildChanges(path, new IZkChildListener() {
    @Override
    public void handleChildChange(String parentPath, List<String> currentChilds) throws Exception {
        System.out.println(path + " 节点发生了变化,变化后子节点为: " + currentChilds);
    }
});
client.createPersistent(path);
Thread.sleep(1000);
client.createPersistent(path + "/zy_daughter");
Thread.sleep(1000);

Zookeeper基本使用_第12张图片


判断节点是否存在;读取节点内容;更新节点内容;对指定节点及内容进行监听
//判断该节点是否存在
String path = "/zy_children";
boolean exists = client.exists(path);
if (!exists) {
    //创建临时节点
    System.out.println(path + " 节点不存在,进行节点创建...");
    client.createEphemeral(path, "boy");
}
//获取节点内容
Object data = client.readData(path);
System.out.println(path + " 内容 = " + data);
//对指定节点内容进行监听
client.subscribeDataChanges(path, new IZkDataListener() {
    /*
     * 指定节点被更新后,该方法被执行
     * dataPath: 节点路径
     * data: 更新后的内容
     */
    @Override
    public void handleDataChange(String dataPath, Object data) throws Exception {
        System.out.println(dataPath + " 节点被更新了,更新后的内容为: " + data);
    }
    //指定节点被删除后调用该方法
    @Override
    public void handleDataDeleted(String dataPath) throws Exception {
        System.out.println(dataPath + " 节点被删除了...");
    }
});
//更新节点
client.writeData(path, "girl");
Thread.sleep(1000);
//删除节点
client.deleteRecursive(path);
Thread.sleep(1000);

Zookeeper基本使用_第13张图片


点击获取文章代码

其他章节 -> 跳转

end...

你可能感兴趣的:(zookeeper,java,linux,java-zookeeper,zookeeper,服务器)