ZooKeeper分布式协调服务(节点分类、事件监听、java集成)

素颜马尾好姑娘i 2023-09-24 15:59 75阅读 0赞

文章目录

    • 前言
    • 安装启动
    • 相关概念
      • 操作节点
      • 事件监听
    • java客户端

前言

ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是GoogleChubby一个开源的实现,是HadoopHbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。

安装启动

安装:把zk安装包上传到/opt目录下,并切换到/opt目录下,执行以下指令

  1. # 解压
  2. tar -zxvf zookeeper-3.7.0-bin.tar.gz
  3. # 重命名
  4. mv apache-zookeeper-3.7.0-bin/ zookeeper
  5. # 打开zookeeper根目录
  6. cd /opt/zookeeper
  7. # 创建一个数据目录,备用
  8. mkdir data
  9. # 打开zk的配置目录
  10. cd /opt/zookeeper/conf
  11. # copy配置文件,zk启动时会加载zoo.cfg文件
  12. cp zoo_sample.cfg zoo.cfg
  13. # 编辑配置文件
  14. vim zoo.cfg
  15. # 修改dataDir参数为之前创建的数据目录:/opt/zookeeper/data
  16. # 切换到bin目录
  17. cd /opt/zookeeper/bin
  18. # 启动
  19. ./zkServer.sh start
  20. ./zkServer.sh status # 查看启动状态
  21. ./zkServer.sh stop # 停止
  22. ./zkServer.sh restart # 重启
  23. ./zkCli.sh # 查看zk客户端

如下,说明启动成功:

在这里插入图片描述

相关概念

Zookeeper提供一个多层级的节点命名空间(节点称为znode),每个节点都用一个以斜杠(/)分隔的路径表示,而且每个节点都有父节点(根节点除外),非常类似于文件系统。并且每个节点都是唯一的。

znode节点有四种类型:

  • PERSISTENT:永久节点。客户端与zookeeper断开连接后,该节点依旧存在
  • EPHEMERAL:临时节点。客户端与zookeeper断开连接后,该节点被删除
  • PERSISTENT_SEQUENTIAL:永久节点、序列化。客户端与zookeeper断开连接后,该节点依旧存在,只是Zookeeper给该节点名称进行顺序编号
  • EPHEMERAL_SEQUENTIAL:临时节点、序列化。客户端与zookeeper断开连接后,该节点被删除,只是Zookeeper给该节点名称进行顺序编号

操作节点

创建这四种节点:

  1. [zk: localhost:2181(CONNECTED) 0] create /aa test # 创建持久化节点
  2. Created /aa
  3. [zk: localhost:2181(CONNECTED) 1] create -s /bb test # 创建持久序列化节点
  4. Created /bb0000000001
  5. [zk: localhost:2181(CONNECTED) 2] create -e /cc test # 创建临时节点
  6. Created /cc
  7. [zk: localhost:2181(CONNECTED) 3] create -e -s /dd test # 创建临时序列化节点
  8. Created /dd0000000003
  9. [zk: localhost:2181(CONNECTED) 4] ls / # 查看某个节点下的子节点
  10. [aa, bb0000000001, cc, dd0000000003, zookeeper]
  11. [zk: localhost:2181(CONNECTED) 5] stat / # 查看某个节点的状态
  12. cZxid = 0x0
  13. ctime = Thu Jan 01 08:00:00 CST 1970
  14. mZxid = 0x0
  15. mtime = Thu Jan 01 08:00:00 CST 1970
  16. pZxid = 0x5
  17. cversion = 3
  18. dataVersion = 0
  19. aclVersion = 0
  20. ephemeralOwner = 0x0
  21. dataLength = 0
  22. numChildren = 5
  23. [zk: localhost:2181(CONNECTED) 6] get /aa # 查看某个节点的内容
  24. test
  25. [zk: localhost:2181(CONNECTED) 11] delete /aa # 删除某个节点
  26. [zk: localhost:2181(CONNECTED) 7] ls / # 再次查看
  27. [bb0000000001, cc, dd0000000003, zookeeper]

事件监听

在读取数据时,我们可以同时对节点设置事件监听,当节点数据或结构变化时,zookeeper会通知客户端。当前zookeeper针对节点的监听有如下四种事件:

  1. 节点创建:stat -w /xx

    当/xx节点创建时:NodeCreated

  2. 节点删除:stat -w /xx

    当/xx节点删除时:NodeDeleted

  3. 节点数据修改:get -w /xx

    当/xx节点数据发生变化时:NodeDataChanged

  4. 子节点变更:ls -w /xx

    当/xx节点的子节点创建或者删除时:NodeChildChanged

java客户端

ZooKeeperjava客户端有:原生客户端、ZkClientCurator框架(类似于redisson,有很多功能性封装)。

  1. 引入依赖


    org.apache.zookeeper
    zookeeper
    3.7.0
  2. 常用api及其方法

    public class ZkTest {

  1. public static void main(String[] args) throws KeeperException, InterruptedException {
  2. // 获取zookeeper链接
  3. CountDownLatch countDownLatch = new CountDownLatch(1);
  4. ZooKeeper zooKeeper = null;
  5. try {
  6. zooKeeper = new ZooKeeper("172.16.116.100:2181", 30000, new Watcher() {
  7. @Override
  8. public void process(WatchedEvent event) {
  9. if (Event.KeeperState.SyncConnected.equals(event.getState())
  10. && Event.EventType.None.equals(event.getType())) {
  11. System.out.println("获取链接成功。。。。。。" + event);
  12. countDownLatch.countDown();
  13. }
  14. }
  15. });
  16. countDownLatch.await();
  17. } catch (Exception e) {
  18. e.printStackTrace();
  19. }
  20. // 创建一个节点,1-节点路径 2-节点内容 3-节点的访问权限 4-节点类型
  21. // OPEN_ACL_UNSAFE:任何人可以操作该节点
  22. // CREATOR_ALL_ACL:创建者拥有所有访问权限
  23. // READ_ACL_UNSAFE: 任何人都可以读取该节点
  24. // zooKeeper.create("/zktest/aa", "haha~~".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
  25. zooKeeper.create("/test", "haha~~".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);
  26. // zooKeeper.create("/zktest/cc", "haha~~".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT_SEQUENTIAL);
  27. // zooKeeper.create("/zktest/dd", "haha~~".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL);
  28. // zooKeeper.create("/zktest/dd", "haha~~".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL);
  29. // zooKeeper.create("/zktest/dd", "haha~~".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL);
  30. // 判断节点是否存在
  31. Stat stat = zooKeeper.exists("/test", true);
  32. if (stat != null){
  33. System.out.println("当前节点存在!" + stat.getVersion());
  34. } else {
  35. System.out.println("当前节点不存在!");
  36. }
  37. // 判断节点是否存在,同时添加监听
  38. zooKeeper.exists("/test", event -> {
  39. });
  40. // 获取一个节点的数据
  41. byte[] data = zooKeeper.getData("/zktest/ss0000000001", false, null);
  42. System.out.println(new String(data));
  43. // 查询一个节点的所有子节点
  44. List<String> children = zooKeeper.getChildren("/test", false);
  45. System.out.println(children);
  46. // 更新
  47. zooKeeper.setData("/test", "wawa...".getBytes(), stat.getVersion());
  48. // 删除一个节点
  49. //zooKeeper.delete("/test", -1);
  50. if (zooKeeper != null){
  51. zooKeeper.close();
  52. }
  53. }
  54. }

发表评论

表情:
评论列表 (有 0 条评论,75人围观)

还没有评论,来说两句吧...

相关阅读

    相关 分布式协调服务Zookeeper

    分布式系统介绍 分布式系统的定义 《分布式系统原理和范型》一书中定义:分布式系统是若干独立计算机的集合,这些计算机对于用户来说就像是单个相关系统。 从进程角度看,两