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===================