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的合体, 监视路径下创建,删除,修改, 并缓存路径下所有孩子节点的数据.
原文地址:https://www.cnblogs.com/snow-man/p/11197467.html