zookeeper基本命令、java应用
基本命令
创建 -e临时节点 -s顺序节点
create (-e -s) path data
查询节点
ls path
更新数据
set path data
查询数据
get -s path
dataversion在数据变化后会+1
查看当前节点的角色是leader\follower
./zkServer.sh status
删除,提供cas删除
delete path [version]
Java客户端
引入依赖
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.5.3-beta</version>
</dependency>
权限ACL
通过ACL可以对节点访问进行权限控制
使用zkCli时,ACL的格式由::三段组成。
schema:可以取下列值:world, auth, digest, host/ip
id: 标识身份,值依赖于schema做解析。
acl:就是权限:cdwra分别表示create, delete,write,read, admin
ZooKeeper zooKeeper = new ZooKeeper("192.168.97.139:2181,192.168.97.123:2181,192.168.97.119",
5000, new Watcher() {
@Override
public void process(WatchedEvent watchedEvent) {
System.out.println("哈哈");
}
});
zooKeeper.addAuthInfo("digest","foo:true".getBytes());
System.out.println(zooKeeper.getState());
String path = zooKeeper.create("/testacl2","hhajava".getBytes(), ZooDefs.Ids.CREATOR_ALL_ACL, CreateMode.PERSISTENT);
连接zookeeper后,通过zookeeper.addAuthInfo给这个客户端加上一个信息。然后创建节点,注意ZooDefs.Ids.CREATOR_ALL_ACL代表是拥有权限才能够访问。
第一次访问该节点报错,通过addauth 加入权限认证,第二次访问就能够获取到数据
// 1、同步创建节点
String path = zooKeeper.create("/java","hhajava".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);//持久化节点
System.out.println(path);
// 2、删除节点 version 对应 get -s path的 dataversion
zooKeeper.delete("/java",1);
部分方法中,可以传入watcher。它提供了一种机制,当watch的节点发生变化,客户端将会收到watch的信息。分布式锁也是基于这种反馈机制。
// 4、获取子节点
List<String> list = zooKeeper.getChildren("/java", new Watcher() {
@Override
public void process(WatchedEvent watchedEvent) {
System.out.println("节点产生变化"+watchedEvent.getPath());
}
});
for (String a :list){
System.out.println(a);
}
// 获取节点数据
byte[] data1 = zooKeeper.getData("/java", new Watcher() {
@Override
public void process(WatchedEvent watchedEvent) {
System.out.println(watchedEvent.getPath()+"数据改变");
}
}, new Stat());
System.out.println(new String(data1));
// // 更新节点数据
zooKeeper.setData("/java","31231".getBytes(),2);
Curator客户端框架
引入依赖
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>4.0.1</version>
</dependency>
<!-- 提供分布式锁实现-->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>4.0.1</version>
</dependency>
// 1、创建节点
CuratorFramework client = CuratorFrameworkFactory.builder()
.connectString("192.168.97.139:2181")
.sessionTimeoutMs(5555)
.retryPolicy(new RetryOneTime(111))
.build();
client.start();
// client.create().forPath("/curator","test".getBytes());
// 全局id
String path = client.create().withMode(CreateMode.PERSISTENT_SEQUENTIAL).forPath("/quanjuid","222".getBytes());
System.out.println(path);
// 2、分布式锁
InterProcessMutex lock = new InterProcessMutex(client,"/lock");
for(int i = 0 ;i <30;i++){
new Thread(new Runnable() {
@Override
public void run() {
try {
lock.acquire();
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("a的值-------------"+a);
a++;
try {
lock.release();
} catch (Exception e) {
e.printStackTrace();
}
}
}).start();
}
全局id 主要利用了顺序节点会自动在创建节点后添加序号
分布式锁只要利用了临时有序节点特性和watch机制。针对读请求,查询之前的节点没有写请求就可以共享。针对写请求,当写请求是第一个节点才会获得锁。每个节点watch前一个节点,避免羊群效应(当锁释放,多个请求同时去争抢创建节点)。因为是临时节点,当客户端占用锁时失去连接也就会删除这个节点释放锁。
上一篇: C#开发环境配置-VS2017安装使用
下一篇: zookeeper常用的基本命令(上篇)