zookeeper znode的基本操作
zk的客户端api,
// 创建一个给定的目录节点 path, 并给它设置数据,CreateMode 标识有四种形式的目录节点,
// 分别是 PERSISTENT:持久化目录节点,这个目录节点存储的数据不会丢失;
// PERSISTENT_SEQUENTIAL:顺序自动编号的目录节点,这种目录节点会根据当前已近存在的节点数自动加 1,然后返回给客户端已经成功创建的目录节点名;
// EPHEMERAL:临时目录节点,一旦创建这个节点的客户端与服务器端口也就是 session 超时,这种节点会被自动删除;
// EPHEMERAL_SEQUENTIAL:临时自动编号节点
String create(String path, byte data[], List<ACL> acl, CreateMode createMode)
void create(String path, byte data[], List<ACL> acl, CreateMode createMode, StringCallback cb, Object ctx)
// 删除 path 对应的目录节点,version 为 -1 可以匹配任何版本,
// 也就删除了这个目录节点所有数据
void delete(String path, int version)
void delete(String path, int version, VoidCallback cb, Object ctx)
//给 path 设置数据,可以指定这个数据的版本号,如果 version 为 -1 可以匹配任何版本
Stat setData(String path, byte data[], int version)
void setData(String path, byte data[], int version, StatCallback cb, Object ctx)
// 给某个目录节点重新设置访问权限,需要注意的是 Zookeeper 中的目录节点权限不具有传递性,
// 父目录节点的权限不能传递给子目录节点。目录节点 ACL 由两部分组成:perms 和 id。
//Perms 有 ALL、READ、WRITE、CREATE、DELETE、ADMIN 几种
//而 id 标识了访问目录节点的身份列表,默认情况下有以下两种:
//ANYONE_ID_UNSAFE = new Id("world", "anyone") 和 AUTH_IDS = new Id("auth", "")
// 分别表示任何人都可以访问和创建者拥有访问权限。
Stat setACL(String path, List<ACL> acl, int version)
void setACL(String path, List<ACL> acl, int version, StatCallback cb, Object ctx)
// 判断某个 path 是否存在,并设置是否监控这个目录节点,
// 这里的 watcher 是在创建 ZooKeeper 实例时指定的 watcher,exists方法还有一个重载方法,
// 可以指定特定的 watcher
Stat exists(String path, Watcher watcher)
Stat exists(String path, boolean watch)
void exists(String path, Watcher watcher, StatCallback cb, Object ctx)
void exists(String path, boolean watch , StatCallback cb, Object ctx)
// 获取这个 path 对应的目录节点存储的数据,数据的版本等信息可以通过 stat 来指定,
// 同时还可以设置是否监控这个目录节点数据的状态
byte[] getData(String path, Watcher watcher, Stat stat)
byte[] getData(String path, boolean watch , Stat stat)
void getData(String path, Watcher watcher, DataCallback cb, Object ctx)
void getData(String path, boolean watch , DataCallback cb, Object ctx)
// 获取指定 path 下的所有子目录节点,
// 同样 getChildren方法也有一个重载方法可以设置特定的 watcher 监控子节点的状态
List<String> getChildren(String path, Watcher watcher)
List<String> getChildren(String path, boolean watch )
void getChildren(String path, Watcher watcher, ChildrenCallback cb, Object ctx)
void getChildren(String path, boolean watch , ChildrenCallback cb, Object ctx)
List<String> getChildren(String path, Watcher watcher, Stat stat)
List<String> getChildren(String path, boolean watch , Stat stat)
void getChildren(String path, Watcher watcher, Children2Callback cb, Object ctx)
void getChildren(String path, boolean watch , Children2Callback cb, Object ctx)
说明,
每一种按同步还是异步,添加指定watcher还是默认watcher又分为4种。默认watcher可以在ZooKeeper zk = new ZooKeeper(serverList, sessionTimeout, watcher)中进行指定。如果包含boolean watch的读方法传入true则将默认watcher注册为所关注事件的watch。如果传入false则不注册任何watch。
CreateMode主要有几种:
PERSISTENT (持续的,相比于EPHEMERAL,不会随着client session的close/expire而消失)
PERSISTENT_SEQUENTIAL
EPHEMERAL (短暂的,生命周期依赖于client session,对应session close/expire后其znode也会消失)
EPHEMERAL_SEQUENTIAL (SEQUENTIAL意为顺序的)
AsyncCallback异步callback,根据操作类型的不同,也分几类:
StringCallback
VoidCallback
StatCallback
DataCallback (getData请求)
ChildrenCallback
Children2Callback
如下所示,
package com.usfot;
import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooDefs;
import org.apache.zookeeper.ZooKeeper;
import java.io.IOException;
/**
* Created by liyanxin on 2015/3/17.
*/
public class ZookeeperDemo2 {
public static void main(String args[]) throws IOException, KeeperException, InterruptedException {
ZooKeeper zk = new ZooKeeper("127.0.0.1:2181", 300000, new Watcher() {
// 监控所有被触发的事件
public void process(WatchedEvent event) {
System.out.println("状态:" + event.getState() + "|类型:" + event.getType() +
"|Wrapper:" + event.getWrapper() + "|Path:" + event.getPath());
}
});
// 创建一个目录节点
zk.create("/testRootPath", "testRootData".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE,
CreateMode.PERSISTENT);
// 创建一个子目录节点
zk.create("/testRootPath/testChildPathOne", "testChildDataOne".getBytes(),
ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
System.out.println(new String(zk.getData("/testRootPath", false, null)));
// 取出子目录节点列表
System.out.println(zk.getChildren("/testRootPath", true));
// 修改子目录节点数据
zk.setData("/testRootPath/testChildPathOne", "modifyChildDataOne".getBytes(), -1);
System.out.println("目录节点状态:[" + zk.exists("/testRootPath", true) + "]");
// 创建另外一个子目录节点
zk.create("/testRootPath/testChildPathTwo", "testChildDataTwo".getBytes(),
ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
System.out.println(new String(zk.getData("/testRootPath/testChildPathTwo", true, null)));
// 删除子目录节点
zk.delete("/testRootPath/testChildPathTwo", -1);
zk.delete("/testRootPath/testChildPathOne", -1);
// 删除父目录节点
zk.delete("/testRootPath", -1);
// 关闭连接
zk.close();
}
}
启动客户端,如下,
[zk: localhost:2181(CONNECTED) 7] ls /
[testRootPath, mynode, zookeeper, zk_test0000000005, zk_test]
[zk: localhost:2181(CONNECTED) 8] get /testRootPath
testRootData
cZxid = 0x700000033
ctime = Tue Mar 17 15:26:08 CST 2015
mZxid = 0x700000033
mtime = Tue Mar 17 15:26:08 CST 2015
pZxid = 0x700000036
cversion = 2
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 12
numChildren = 2
[zk: localhost:2181(CONNECTED) 10] get /testRootPath/testChildPathOne
modifyChildDataOne
cZxid = 0x700000034
ctime = Tue Mar 17 15:26:08 CST 2015
mZxid = 0x700000035
mtime = Tue Mar 17 15:26:09 CST 2015
pZxid = 0x700000034
cversion = 0
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 18
numChildren = 0
[zk: localhost:2181(CONNECTED) 12] ls /testRootPath
[testChildPathTwo, testChildPathOne]
可以看到zk中已经同步的数据。
参考:http://agapple.iteye.com/blog/1111377
http://www.ibm.com/developerworks/cn/opensource/os-cn-zookeeper/
===================END===================