zookeeper znode的基本操作

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

你可能感兴趣的:(zookeeper znode的基本操作)