zookeeper znode的基本操做

zookeeper znode的基本操做java


zk的客戶端api,node

// 建立一個給定的目錄節點 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)

說明,shell

每一種按同步仍是異步,添加指定watcher仍是默認watcher又分爲4種。默認watcher能夠在ZooKeeper zk = new ZooKeeper(serverList, sessionTimeout, watcher)中進行指定。若是包含boolean watch的讀方法傳入true則將默認watcher註冊爲所關注事件的watch。若是傳入false則不註冊任何watch。apache

 

CreateMode主要有幾種:api

PERSISTENT (持續的,相比於EPHEMERAL,不會隨着client session的close/expire而消失)服務器

PERSISTENT_SEQUENTIALsession

EPHEMERAL (短暫的,生命週期依賴於client session,對應session close/expire後其znode也會消失)app

EPHEMERAL_SEQUENTIAL  (SEQUENTIAL意爲順序的)異步


AsyncCallback異步callback,根據操做類型的不一樣,也分幾類:spa

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

相關文章
相關標籤/搜索