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