Zookeeper应用
2020-05-01 本文已影响0人
剑道_7ffc
名词复盘
集群角色

数据模型
树形结构,由节点组成,叶子结点由key-value组成,容器节点由key-value和子节点组成。
会话

Stat 状态信息

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

Watcher
通过发布-订阅来实现watcher机制。
Zookeeper 基于 Java 访问
连接报错
错误信息: KeeperErrorCode=ConnectionLoss
原因:阿里云的服务器的防火墙把2181给拦截的,把2181的端口暴露出来就可以了

依赖 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();
}