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