• zookeeper 笔记


    NodeCache: 监视当前节点的增删改, 并将节点数据缓存到本地PathChildrenCache: 监视一个路劲下孩子节点的创建, 删除,修改TreeCache : PathChildrenChache+NodeCahce的合体, 监视路径下创建,删除,修改, 并缓存路径下所有孩子节点的数据.

    zookeeper 的视图结构

    和标准的文件系统非常类似,每一个节点称之为 ZNode,是 zookeeper 的最小单元。每个 znode上都可以保存数据以及挂载子节点。构成一个层次化的树形结构
    持久节点(PERSISTENT)创建后会一直存在 zookeeper 服务器上,直到主动删除
    持久有序节点(PERSISTENT_SEQUENTIAL)每个节点都会为它的一级子节点维护一个顺序
    临时节点(EPHEMERAL)临时节点的生命周期和客户端的会话绑定在一起,当客户端会话失效该节点自动清理
    CONTAINER 当子节点都被删除后,Container 也随即删除PERSISTENT_WITH_TTL 超过 TTL 未被修改,且没有子节点
    PERSISTENT_SEQUENTIAL_WITH_TTL 客户端断开连接后不会自动删除 Znode,如果该 Znode 没有子 Znode 且在给定 TTL 时间内无修改,该 Znode 将会被删除;TTL 单位是毫秒,必须大于0 且小于或等于 EphemeralType.MAX_TTL


    Stat 状态信息

    每个节点除了存储数据内容以外,还存储了数据节点本身的一些状态信息,通过 get 命令可以获得状态信息的详细内容

    其中version,cversion,aversion保证数据的一致性. 其使用的是乐观锁.


    Watcher

    zookeeper 提供了分布式数据的发布/订阅功能,zookeeper 允许客户端向服务端注册一个 watcher 监听,当服务端的一 些指定事件触发了 watcher,那么服务端就会向客户端发送一个事件通知。

    值得注意的是,Watcher 通知是一次性的,即一旦触发一次 通知后,该 Watcher 就失效了,因此客户端需要反复注册 Watcher,即程序中在 process 里面又注册了 Watcher,否则, 将无法获取 c3 节点的创建而导致子节点变化的事件。


    JAVA 访问zookeeper

    推荐使用Curator

            <dependency>
                <groupId>org.apache.curator</groupId>
                <artifactId>curator-framework</artifactId>
                <version>2.10.0</version>
            </dependency>

    代码演示如下:

    public class CuratorDemo {
        private static String Connect_string = "x.x.x.x:2181";
    
        private static String strPath = "/data1";
    
        public static void main(String[] args) throws Exception {
            CuratorFramework curatorFramework = CuratorFrameworkFactory.builder().connectString(Connect_string).sessionTimeoutMs(5000).retryPolicy(new ExponentialBackoffRetry(1000, 3)).build();
            curatorFramework.start();
    //
    //        curatorFramework.start();
    //        ACTTest(curatorFramework);
            WatchDemo(curatorFramework);
    //        WatchCacheDemo(curatorFramework);
    
            System.in.read();
        }
    
        private static void create_node(CuratorFramework curatorFramework) throws Exception {
            curatorFramework.create().creatingParentsIfNeeded().withMode(CreateMode.PERSISTENT).
                    forPath("/data/program", "test".getBytes());
        }
    
        private static void update_node(CuratorFramework curatorFramework) throws Exception {
            curatorFramework.setData().forPath(strPath, "2".getBytes());
        }
    
        private static void delete_node(CuratorFramework curatorFramework) throws Exception {
            Stat stat = new Stat();
            String val = new String(curatorFramework.getData().storingStatIn(stat).forPath(strPath));
            curatorFramework.delete().withVersion(stat.getVersion()).forPath(strPath);
        }
    
        private static void ACTTest(CuratorFramework curatorFramework) throws Exception {
            List<ACL> acls = new ArrayList<ACL>();
            ACL ac = new ACL(ZooDefs.Perms.READ | ZooDefs.Perms.WRITE,
                    new Id("digest", DigestAuthenticationProvider.generateDigest("admin:admin")));
    
            acls.add(ac);
            curatorFramework.create().creatingParentsIfNeeded().withMode(CreateMode.PERSISTENT).withACL(acls).forPath("/authNoPassword");
        }
    
        private static void WatchDemo(CuratorFramework curatorFramework) throws Exception {
            TreeCache treeCache = new TreeCache(curatorFramework, "/watch");
            TreeCacheListener treeCacheListener = new TreeCacheListener() {
                @Override
                public void childEvent(CuratorFramework curatorFramework, TreeCacheEvent treeCacheEvent) throws Exception {
                    System.out.println(treeCacheEvent.getType() + "-> " + treeCacheEvent.getData());
                }
            };
            treeCache.getListenable().addListener(treeCacheListener);
            treeCache.start();
        }
    
        private static void WatchCacheDemo(CuratorFramework curatorFramework) throws Exception {
            final NodeCache nodeCache = new NodeCache(curatorFramework, "/node", false);
            NodeCacheListener nodeCacheListener = new NodeCacheListener() {
                @Override
                public void nodeChanged() throws Exception {
                    System.out.println(new String(nodeCache.getCurrentData().getData()));
                }
            };
            nodeCache.getListenable().addListener(nodeCacheListener);
            nodeCache.start();
        }
    }

    Curator 内部实现的几种重试策略:

    • ExponentialBackoffRetry:重试指定的次数, 且每一次重试之 间停顿的时间逐渐增加.

    • RetryNTimes:指定最大重试次数的重试策略

    • RetryOneTime:仅重试一次

    • RetryUntilElapsed:一直重试直到达到规定的时间

    权限模式

    IP:  针对地址颗粒进行控制: 如: ip:192.168.0.1/24
    Digest: 常用控制,类似username:pwd , 设置的时候需要加密DigestAuthenticationProvider.generateDigest()
    world: 最开放式的控制方式, 访问规则对所有用户开放

    super:超级用户模式 Demo: Id ipId1 = new Id("ip", "192.168.190.1"); Id ANYONE_ID_UNSAFE = new Id("world", "anyone");

    ZK事件包括:

    EventType.NodeCreated 当 node-x 这个节点被创建时,该事件被触发 
    EventType.NodeChildrenChanged 当 node-x 这个节点的直接子节点被创建、被删除、子节点数据发生变更时,该事件被触发。
    EventType.NodeDataChanged 当 node-x 这个节点的数据发生变更时,该事件被触发
    EventType.NodeDeleted 当 node-x 这个节点被删除时,该事件被触发。
    EventType.None 当 zookeeper 客户端的连接状态发生变更时,即 KeeperState.Expired、KeeperState.Disconnected、 KeeperState.SyncConnected、KeeperState.Aut

    事件监听机制推荐使用curator-recipes

        <dependency>
                <groupId>org.apache.curator</groupId>
                <artifactId>curator-recipes</artifactId>
                <version>2.10.0</version>
         </dependency>

    监听节点分类, demo参照上面代码

    NodeCache: 监视当前节点的增删改, 并将节点数据缓存到本地
    PathChildrenCache: 监视一个路劲下孩子节点的创建, 删除,修改
    TreeCache : PathChildrenChache+NodeCahce的合体, 监视路径下创建,删除,修改, 并缓存路径下所有孩子节点的数据.
  • 相关阅读:
    POJ 2065 高斯消元求解问题
    HDU1045-Fire Net
    HDU1863-畅通工程
    POJ2524-Ubiquitous Religions
    POJ1064-Cable master
    POJ2456-Aggressive cows
    HDU1272-小希迷宫
    POJ1611-The Suspects
    HDU4496-D-City
    HDU1232-畅通工程
  • 原文地址:https://www.cnblogs.com/snow-man/p/11197467.html
Copyright © 2020-2023  润新知