Zookeeper应用

2020-05-01  本文已影响0人  剑道_7ffc

名词复盘

集群角色

image.png

数据模型

树形结构,由节点组成,叶子结点由key-value组成,容器节点由key-value和子节点组成。

会话

image.png

Stat 状态信息

image.png

版本-保证分布式数据原子性

image.png

Watcher

通过发布-订阅来实现watcher机制。

Zookeeper 基于 Java 访问

连接报错

错误信息: KeeperErrorCode=ConnectionLoss
原因:阿里云的服务器的防火墙把2181给拦截的,把2181的端口暴露出来就可以了


image.png

依赖 jar 包

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

建立连接

CuratorFramework curatorFramework=CuratorFrameworkFactory.builder().
                connectString(CONNECTION_STR).sessionTimeoutMs(2000).
                namespace("data").retryPolicy(new ExponentialBackoffRetry(1000,3)).build();
curatorFramework.start();
重试策略

ExponentialBackoffRetry:重试指定的次数, 且每一次重试之间停顿的时间逐渐增加. RetryNTimes:指定最大重试次数的重试策略
RetryOneTime:仅重试一次
RetryUntilElapsed:一直重试直到达到规定的时间

namespace

下面的所有操作都是在该会话的命名空间下

增删改查

新增
private static void createData(CuratorFramework curatorFramework) throws Exception {        
  curatorFramework.create().creatingParentsIfNeeded().withMode(CreateMode.PERSISTENT).forPath("/program","test".getBytes());
    }
修改
    private static void updateData(CuratorFramework curatorFramework) throws Exception {
        curatorFramework.setData().forPath("/program","up".getBytes());
    }
查询
    private static void getData(CuratorFramework curatorFramework) throws Exception{
        Stat stat=new Stat();
        String value = new String(curatorFramework.getData().storingStatIn(stat).forPath("/program"));
        System.out.println(value);
    }
删除
    private static void deleteData(CuratorFramework curatorFramework) throws Exception {
        Stat stat=new Stat();
        curatorFramework.getData().storingStatIn(stat).forPath("/program");
      curatorFramework.delete().withVersion(stat.getVersion()).forPath("/program");
    }

节点权限设置

权限模式

IP:通过ip地址进行权限控制

Id ipId1 = new Id("ip", "192.168.190.1");

Digest(摘要):最常用的控制模式,类似于 username:password ;设 置 的 时 候 需 要DigestAuthenticationProvider.generateDigest() SHA- 加 密和 base64 编码

new Id("digest", DigestAuthenticationProvider.generateDigest("admin:admin"))

World:对所有用户开放,world:anyone

Id ANYONE_ID_UNSAFE = new Id("world", "anyone");

Super:超级用户,可以对节点做任何操作

代码示例
        List<ACL> list=new ArrayList<>();
        ACL acl=new ACL(ZooDefs.Perms.READ | ZooDefs.Perms.WRITE,
                new Id("digest", DigestAuthenticationProvider.generateDigest("admin:admin")));
        list.add(acl);
     curatorFramework.create().withMode(CreateMode.PERSISTENT).withACL(list).forPath("/auth");

节点事件监听

对节点进行watch监听

Curator

PathChildCache:监听孩子节点的创建,更新和删除
NodeCache:监听当前节点的创建,更新和删除
TreeCache:PathChildCache+NodeCache

    private static void addListenerWithNode(CuratorFramework curatorFramework) throws Exception {
        NodeCache nodeCache=new NodeCache(curatorFramework,"/watch",false);
        NodeCacheListener nodeCacheListener= () -> {
            System.out.println("receive Node Changed");
            System.out.println(nodeCache.getCurrentData().getPath()+"---"+new String(nodeCache.getCurrentData().getData()));
        };
        nodeCache.getListenable().addListener(nodeCacheListener);
        nodeCache.start();
    }
上一篇 下一篇

猜你喜欢

热点阅读