前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Zookeeper 操作练习

Zookeeper 操作练习

作者头像
名字是乱打的
发布2021-12-22 16:15:25
2960
发布2021-12-22 16:15:25
举报
文章被收录于专栏:软件工程软件工程
ZooKeeper API的基础知识

与ZooKeeper集合进行交互的应用程序称为 ZooKeeper客户端或简称客户端。 Znode是ZooKeeper集合的核心组件,ZooKeeper API提供了一小组方法使用ZooKeeper集合来操纵znode的所有细节。

客户端应该遵循以步骤,与ZooKeeper集合进行清晰和干净的交互。
  • 连接到ZooKeeper集合。ZooKeeper集合为客户端分配会话ID
  • 定期向服务器发送心跳。否则,ZooKeeper集合将过期会话ID,客户端需要重新连接。
  • 只要会话ID处于活动状态,就可以获取/设置znode。
  • 所有任务完成后,断开与ZooKeeper集合的连接。如果客户端长时间不活动,则ZooKeeper集合将自动断开客户端。
ZooKeeper API的核心部分ZooKeeper类

本章中最重要的一组ZooKeeper API。ZooKeeper API的核心部分是ZooKeeper类。它提供了在其构造函数中连接ZooKeeper集合的选项,并具有以下方法:

  • connect - 连接到ZooKeeper集合
  • create- 创建znode
  • exists- 检查znode是否存在及其信息
  • getData - 从特定的znode获取数据
  • setData - 在特定的znode中设置数据
  • getChildren - 获取特定znode中的所有子节点
  • delete - 删除特定的znode及其所有子项
  • close - 关闭连接
maven引一下
代码语言:javascript
复制
 <dependencies>
        <!-- https://mvnrepository.com/artifact/org.apache.zookeeper/zookeeper -->
        <dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
            <version>3.4.14</version>
            <type>pom</type>
        </dependency>

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.apache.curator/curator-framework -->
        <!--<dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-framework</artifactId>
            <version>4.2.0</version>
        </dependency>
-->
  
    </dependencies>
1.构造创发建立连接

ZooKeeper类通过其多种构造函数提供connect功能。如下 : ZooKeeper(String connectionString, int sessionTimeout, Watcher watcher)

  • connectionString - ZooKeeper集合主机,多个主机之间以逗号进行分割eg:"ip1:2181,ip2:2181,ip3:2181"。
  • sessionTimeout - 会话超时(以毫秒为单位)。
  • watcher - 实现“监视器”界面的对象。ZooKeeper集合通过监视器对象返回连接状态。

这里用watcher结合countDownLatch做了一个计数,阻塞主线程直至连接上并减计数器countDownLatch,当连接建立成功后才进行打印当前连接状态.

代码语言:javascript
复制
private static void getZkConection() {
        CountDownLatch countDownLatch=new CountDownLatch(1);
        String connection="ip:port";
        try {
           zooKeeper=new ZooKeeper(connection, 4000, new Watcher() {
                @Override
                public void process(WatchedEvent watchedEvent) {
                    if (watchedEvent.getState()==Event.KeeperState.SyncConnected){
                        countDownLatch.countDown();
                    }
                }
            });

        } catch (IOException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    public static void closeZkConnection(){
        try {
            zooKeeper.close();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

Zookeeper的增删改查

1.create--创建Znode

ZooKeeper类提供了在ZooKeeper集合中创建一个新的znode的create方法。 create 方法的签名如下: create(String path, byte[] data, List<ACL> acl, CreateMode createMode)

  • path - Znode路径。例如,/myapp1,/myapp2,/myapp1/mydata1
  • data - 要存储在指定znode路径中的数据
  • acl - 要创建的节点的访问控制列表。ZooKeeper API提供了一个静态接口 ZooDefs.Ids 来获取一些基本的acl列表。例如,ZooDefs.Ids.OPEN_ACL_UNSAFE返回打开znode的acl列表。
  • createMode - 节点的类型,即临时,顺序,持久等。这是一个枚举。
代码语言:javascript
复制
private static void createZkMode() {
        try {
            zooKeeper.create("/test2", "JavaApiTest".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE,CreateMode.PERSISTENT);
        } catch (KeeperException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

结果

2 . Exists-- 检查Znode的存在返回一个结点信息stat

ZooKeeper类提供了 exists 方法来检查znode的存在。如果指定的znode存在,则返回一个znode的元数据。exists方法的签名如下: exists(String path, boolean watcher)

  • path- Znode路径
  • exists(String path, boolean watcher) watcher - 布尔值,用于指定是否监视指定的znode
代码语言:javascript
复制
  private static void checkZnode(String s) {
        try {
            Stat stat = zooKeeper.exists(s, true);
            if (stat==null){
                System.out.println("结点为空");
            }else {
                System.out.println("结点存在,且当前结点的版本为:"+stat.getVersion()+"创建时间为:"+stat.getCtime());
            }
        } catch (KeeperException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

结果

3 . getData方法--获取数据值以及结点信息stat

ooKeeper类提供 getData 方法来获取附加在指定znode中的数据及其状态。 getData 方法的签名如下: getData(String path, Watcher watcher, Stat stat)

  • path - Znode路径。
  • watcher - 监视器类型的回调函数。当指定的znode的数据改变时,ZooKeeper集合将通过监视器回调进行通知。这是一次性通知。[可Null]
  • stat - 返回znode的元数据。[可Null]
代码语言:javascript
复制
 private static void getZnodeData(String path) {
        try {
            byte[] data = zooKeeper.getData(path, null, null);
            System.out.print("该结点值为"+new String(data));
        } catch (KeeperException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
setData-- 更改结点值

ZooKeeper类提供 setData 方法来修改指定znode中附加的数据,并且也可以返回一个修改后的stat值。 setData 方法的签名如下: setData(String path, byte[] data, int version)

  • path- Znode路径
  • data - 要存储在指定znode路径中的数据。
  • version- znode的当前版本。每当数据更改时,ZooKeeper会更新znode的版本号。
代码语言:javascript
复制
private static void setZnode(String path) {
        try {
            Stat stat = zooKeeper.exists(path, false);
            if (stat==null){
                System.out.println("Znode does not exist");
            }else {
                System.out.println("老版本为"+stat.getVersion());
                Stat newStat = zooKeeper.setData(path, "newValue".getBytes(), stat.getVersion());
                System.out.println("新版本为"+newStat.getVersion());
                getZnodeData(path);
            }
        } catch (KeeperException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
delete -- 删除Znode

delete(String path, int version)

  • path - Znode路径。
  • version - znode的当前版本
代码语言:javascript
复制
private static void deleteZnode(String path)
    {
        try {
        Stat stat = zooKeeper.exists(path, false);
        if (stat==null){
            System.out.println("Znode does not exist");
        }else {
            zooKeeper.delete(path,stat.getVersion());
        }
    } catch (KeeperException e) {
        e.printStackTrace();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    }

传的path为"test2,已经没了"

getChildren 获取特定znode的所有子节点

ZooKeeper类提供 getChildren 方法来获取特定znode的所有子节点。 getChildren 方法的签名如下: getChildren(String path, Watcher watcher)

  • path - Znode路径。
  • watcher - 监视器类型的回调函数。当指定的znode被删除或znode下的子节点被创建/删除时,ZooKeeper集合将进行通知。这是一次性通知。[可null]
代码语言:javascript
复制
 private static void getZnodeChild(String path) throws KeeperException, InterruptedException {
        Stat stat = zooKeeper.exists(path, null);
        if (stat==null){
            System.out.println("Znode does not exist");
        }else {
        List<String> list = zooKeeper.getChildren(path, null);
            for(int i=0;i<list.size();i++){
                System.out.println(list.get(i));
            }
        }

    }
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/10/26 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • ZooKeeper API的基础知识
  • ZooKeeper API的核心部分ZooKeeper类
    • maven引一下
    • 1.构造创发建立连接
    • Zookeeper的增删改查
      • 1.create--创建Znode
        • 2 . Exists-- 检查Znode的存在返回一个结点信息stat
          • 3 . getData方法--获取数据值以及结点信息stat
            • setData-- 更改结点值
              • delete -- 删除Znode
                • getChildren 获取特定znode的所有子节点
                相关产品与服务
                数据库一体机 TData
                数据库一体机 TData 是融合了高性能计算、热插拔闪存、Infiniband 网络、RDMA 远程直接存取数据的数据库解决方案,为用户提供高可用、易扩展、高性能的数据库服务,适用于 OLAP、 OLTP 以及混合负载等各种应用场景下的极限性能需求,支持 Oracle、SQL Server、MySQL 和 PostgreSQL 等各种主流数据库。
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档