Zookeeper節點類型

ZooKeeper 節點是有生命週期的,這取決於節點的類型。在 ZooKeeper 中,節點類型能夠分爲持久節點(PERSISTENT )、臨時節點(EPHEMERAL),以及時序節點(SEQUENTIAL ),具體在節點建立過程當中,通常是組合使用,能夠生成如下 4 種節點類型。 node


一、臨時節點(EPHEMERAL) htm

臨時節點的生命週期和客戶端會話綁定。也就是說,若是客戶端會話失效,那麼這個節點就會自動被清除掉。實例: 生命週期

String root = "/ephemeral";
String createdPath = zk.create(root, root.getBytes(),
          Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
System.out.println("createdPath = " + createdPath);
        
String path = "/ephemeral/test01" ; 
createdPath = zk.create(path, path.getBytes(),
            Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);
System.out.println("createdPath = " + createdPath);
Thread.sleep(1000 * 20); // 等待20秒關閉ZooKeeper鏈接
zk.close(); // 關閉鏈接後建立的臨時節點將自動刪除

注意:這裏提到的是會話失效,而非鏈接斷開。另外,在臨時節點下面不能建立子節點。 get


二、臨時順序節點(EPHEMERAL_SEQUENTIAL) test

臨時節點的生命週期和客戶端會話綁定。也就是說,若是客戶端會話失效,那麼這個節點就會自動被清除掉。注意建立的節點會自動加上編號。實例: bug

String root = "/ephemeral";
String createdPath = zk.create(root, root.getBytes(),
          Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
System.out.println("createdPath = " + createdPath);
        
String path = "/ephemeral/test01" ; 
createdPath = zk.create(path, path.getBytes(),
            Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL);
System.out.println("createdPath = " + createdPath);
Thread.sleep(1000 * 20); // 等待20秒關閉ZooKeeper鏈接
zk.close(); // 關閉鏈接後建立的臨時節點將自動刪除

輸出結果: 客戶端

type = None di

createdPath = /ephemeral/test0000000003 co

createdPath = /ephemeral/test0000000004 數字

createdPath = /ephemeral/test0000000005

createdPath = /ephemeral/test0000000006


三、持久節點(PERSISTENT)

所謂持久節點,是指在節點建立後,就一直存在,直到有刪除操做來主動清除這個節點——不會由於建立該節點的客戶端會話失效而消失。實例:

String root = "/computer";
String createdPath = zk.create(root, root.getBytes(),
       Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
System.out.println("createdPath = " + createdPath);

四、持久順序節點(PERSISTENT_SEQUENTIAL)

這類節點的基本特性和持久節點 類型是一致的。額外的特性是,在ZooKeeper中,每一個父節點會爲他的第一級子節點維護一份時序,會記錄每一個子節點建立的前後順序。基於這個特性,在 建立子節點的時候,能夠設置這個屬性,那麼在建立節點過程當中,ZooKeeper會自動爲給定節點名加上一個數字後綴,做爲新的節點名。這個數字後綴的範 圍是整型的最大值。實例:

String root = "/computer";
String createdPath = zk.create(root, root.getBytes(),
       Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
System.out.println("createdPath = " + createdPath);
for (int i=0; i<5; i++) {
   String path = "/computer/node";
   String createdPath = zk.create(path, path.getBytes(),
       Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT_SEQUENTIAL);
   System.out.println("createdPath = " + createdPath);
}
zk.close();

運行結果:

createdPath = /computer

createdPath = /computer/node0000000000

createdPath = /computer/node0000000001

createdPath = /computer/node0000000002

createdPath = /computer/node0000000003

createdPath = /computer/node0000000004

結果中的0000000000~0000000004都是自動添加的序列號

http://www.bug315.com/article/166.htm
相關文章
相關標籤/搜索