• Zookeeper学习(二)


     一、Znode节点属性

    dataVersion 数据版本, 每次当 Znode 中的数据发生变化的时候, dataVersion
    都会自增一下
    cversion 节点版本, 每次当 Znode 的节点发生变化的时候, cversion 都会自增
    aclVersion ACL(Access Control List) 的版本号, 当 Znode 的权限信息发生
    变化的时候aclVersion会自增
    zxid 事务ID
    ctime 创建时间
    mtime 最近一次更新的时间
    ephemeralOwner 如果 Znode 为临时节点, ephemeralOwner 表示与该节点关联
    的 SessionId

    我们通过get 节点的目录,可以得到节点的属性

     

    二、watch机制

    对zookeeper里的某个节点设置个监听,可以知道该节点是否进行了“增加”,“删除”,“修改”

    Watcher 的特点
    一次性触发 一个 Watcher 只会被触发一次, 如果需要继续监听, 则需要再次添加
    Watcher
    事件封装: Watcher 得到的事件是被封装过的, 包括三个内容 keeperState,
    eventType, path

    设置监听机制给/hello节点

    另外再打开Hadoop101,修改/hello里的数据,看能否监听到

     

     证明:可以监听到hello节点的数据改变了

    三、zookeeper的JAVAAPI操作

    这里操作Zookeeper的JavaAPI使用的是一套zookeeper客户端框架 Curator ,解决了很多
    Zookeeper客户端非常底层的细节开发工作 。
    Curator包含了几个包:
    curator-framework:对zookeeper的底层api的一些封装
    curator-recipes:封装了一些高级特性,如:Cache事件监听、选举、分布式锁、分布式
    计数器等

    创建maven工程,导入jar包

     

    创建一个测试类,开始进行zookeeper的javaapi编程

    节点操作

    ①创建永久节点

     @Test
        /*
        创建永久节点
         */
        public void createZnode() throws Exception {
            //1.定制一个重试策略
            /*
            parame1:重试间隔时间
            parame2:重试的最大次数
             */
            RetryPolicy retryPolicy=new ExponentialBackoffRetry(1000,1);
    
            //2.获取一个客户端对象
            /*
            parame1:要连接的zookeeper服务器列表
            parame2:会话的超时时间
            parame3:连接的超时时间
            param4:重试策略
             */
            String connectionStr="192.168.31.101:2181,192.168.31.102:2181,192.168.31.103:2181";
            CuratorFramework client=CuratorFrameworkFactory.newClient(connectionStr,8000,8000,retryPolicy);
            //3.开启客户端
            client.start();
            //4.创建节点
            client.create().creatingParentsIfNeeded().withMode(CreateMode.PERSISTENT).forPath("/hello2","world".getBytes());
            //5.关闭客户端
            client.close();
        }

    运行后,进入linux查看,创建成功

     

    ②创建临时节点

    和创建永久节点的区别是:临时节点是:EPHEMERAL,而且要让他休眠几秒否则Linux看不到,因为是临时的,会话结束就会消失。

     @Test
        /*
        创建临时节点
         */
        public void createTmpZnode() throws Exception {
            //1.定制一个重试策略
            /*
            parame1:重试间隔时间
            parame2:重试的最大次数
             */
            RetryPolicy retryPolicy=new ExponentialBackoffRetry(1000,1);
    
            //2.获取一个客户端对象
            /*
            parame1:要连接的zookeeper服务器列表
            parame2:会话的超时时间
            parame3:连接的超时时间
            param4:重试策略
             */
            String connectionStr="192.168.31.101:2181,192.168.31.102:2181,192.168.31.103:2181";
            CuratorFramework client=CuratorFrameworkFactory.newClient(connectionStr,8000,8000,retryPolicy);
            //3.开启客户端
            client.start();
            //4.创建节点
            client.create().creatingParentsIfNeeded().withMode(CreateMode.EPHEMERAL).forPath("/hello4","world".getBytes());
            Thread.sleep(5000);
            //5.关闭客户端
            client.close();
        }

     这样就看到了,不过等会话结束就没了

    ③修改节点数据

    使用的是:client.setData().forPath(节点路径,要更新的数据(记得转换成byte))

    /*
        修改节点数据
         */
        @Test
        public void setZnodeData() throws Exception {
            RetryPolicy retryPolicy=new ExponentialBackoffRetry(1000,1);
    
            String connectionStr="192.168.31.101:2181,192.168.31.102:2181,192.168.31.103:2181";
            CuratorFramework client=CuratorFrameworkFactory.newClient(connectionStr,8000,8000,retryPolicy);
            client.start();
            client.setData().forPath("/hello","zookeeper".getBytes());
            client.close();
        }

     

    ④获取节点数据

    用byte数组来获取client里的数据

    然后转换成String输出

    /*
        获取节点数据
         */
        @Test
        public void getZnodeData() throws Exception {
            RetryPolicy retryPolicy=new ExponentialBackoffRetry(1000,1);
    
            String connectionStr="192.168.31.101:2181,192.168.31.102:2181,192.168.31.103:2181";
            CuratorFramework client=CuratorFrameworkFactory.newClient(connectionStr,8000,8000,retryPolicy);
            client.start();
            byte[] bytes= client.getData().forPath("/hello");
            System.out.println(new String(bytes));
            client.close();
        }

    在打印处输出:

     

    ⑤设置节点的watch机制

    通过监听hello3节点,对其进行创建,修改,删除

    /*
        节点的watch机制
         */
        @Test
        public void watchZnode() throws Exception {
            RetryPolicy retryPolicy=new ExponentialBackoffRetry(1000,1);
            String connectionStr="192.168.31.101:2181,192.168.31.102:2181,192.168.31.103:2181";
            CuratorFramework client=CuratorFrameworkFactory.newClient(connectionStr,8000,8000,retryPolicy);
            client.start();
            TreeCache treeCache=new TreeCache(client,"/hello3");
            treeCache.getListenable().addListener(new TreeCacheListener() {
                @Override
                public void childEvent(CuratorFramework curatorFramework, TreeCacheEvent treeCacheEvent) throws Exception {
                    ChildData data= treeCacheEvent.getData();
                    if(data!=null){
                        switch (treeCacheEvent.getType()){
                            case NODE_ADDED:
                                System.out.println("监控到有新增节点!");
                                break;
                            case NODE_REMOVED:
                                System.out.println("监控到有节点被移除!");
                                break;
                            case NODE_UPDATED:
                                System.out.println("监控到有节点被更新!");
                                break;
                            default:
                                break;
                        }
                    }
                }
            });
            treeCache.start();
    
            Thread.sleep(100000);
    
        }

     

    打印台输出:

     

  • 相关阅读:
    【转】1.5 万字 CSS 基础拾遗(核心知识、常见需求)
    【转】Git不要只会pull和push,试试这5条提高效率的命令
    【转】响应式布局的常用解决方案对比(媒体查询、百分比、rem和vw/vh)
    【ASP.NET Core】MVC模型绑定——实现同一个API方法兼容JSON和Formdata输入
    【ASP.NET Core】MVC模型绑定:自定义InputFormatter读取CSV内容
    【ASP.NET Core】MVC模型绑定:非规范正文内容的处理
    PHP 跨域
    MAC如何使用Docker 配置PHP + Nginx运行环境
    PHP的http_build_query() 方法,数组里面的bool类型会被转化为 1 和 0.
    Mac环境下RabbitMq安装与测试教程
  • 原文地址:https://www.cnblogs.com/xiaofengzai/p/13472301.html
Copyright © 2020-2023  润新知