Zookeeper介紹(四)——Zookeeper中的基本概念
在介紹了Zookeeper的安裝之後,就可以瞭解一下Zookeeper中的常用概念了。本文將主要介紹ZK中角色、資料模型、節點、ACL、watcher等概念。
角色
在Zookeeper概述中也提到過,Zookeeper的Follower在接到客戶端請求之後會把請求轉發到Leader,這裡提到的Follower和Leader就是ZK中的角色,ZK中有以下角色:
領導者(leader)
負責進行投票的發起和決議,更新系統狀態。為客戶端提供讀和寫服務。
跟隨者(follower)
用於接受客戶端請求並想客戶端返回結果,在選主過程中參與投票。為客戶端提供讀服務。
觀察者(observer)
可以接受客戶端連線,將寫請求轉發給leader,但observer不參加投票過程,只同步leader的狀態,observer的目的是為了擴充套件系統,提高讀取速度
客戶端(client)
請求發起方
資料模型
ZK中資料是以目錄結構的形式儲存的。其中的每一個儲存資料的節點都叫做Znode,每個Znode都有一個唯一的路徑標識。和目錄結構類似,每一個節點都可以可有子節點(臨時節點除外)。節點中可以儲存資料和狀態資訊,每個Znode上可以配置監視器(watcher),用於監聽節點中的資料變化。節點不支援部分讀寫,而是一次性完整讀寫。
節點
Znode有四種類型,PERSISTENT(持久節點)、PERSISTENT_SEQUENTIAL(持久的連續節點)、EPHEMERAL(臨時節點)、EPHEMERAL_SEQUENTIAL(臨時的連續節點)
Znode的型別在建立時確定並且之後不能再修改
臨時節點
臨時節點的生命週期和客戶端會話繫結。也就是說,如果客戶端會話失效,那麼這個節點就會自動被清除掉。
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();// 關閉連線後建立的臨時節點將自動刪除
臨時節點不能有子節點
持久節點
所謂持久節點,是指在節點建立後,就一直存在,直到有刪除操作來主動清除這個節點——不會因為建立該節點的客戶端會話失效而消失。
String root ="/computer";String createdPath = zk.create(root, root.getBytes(),Ids.OPEN_ACL_UNSAFE,CreateMode.PERSISTENT);System.out.println("createdPath = "+ createdPath);
臨時順序節點
臨時節點的生命週期和客戶端會話繫結。也就是說,如果客戶端會話失效,那麼這個節點就會自動被清除掉。注意建立的節點會自動加上編號。
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
createdPath =/ephemeral/test0000000003
createdPath =/ephemeral/test0000000004
createdPath =/ephemeral/test0000000005
createdPath =/ephemeral/test0000000006
持久順序節點
這類節點的基本特性和持久節點型別是一致的。額外的特性是,在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都是自動新增的序列號
節點中除了可以儲存資料,還包含狀態資訊。
ACL
每個znode被建立時都會帶有一個ACL列表,用於決定誰可以對它執行何種操作。
觀察(watcher)
Watcher 在 ZooKeeper 是一個核心功能,Watcher 可以監控目錄節點的資料變化以及子目錄的變化,一旦這些狀態發生變化,伺服器就會通知所有設定在這個目錄節點上的 Watcher,從而每個客戶端都很快知道它所關注的目錄節點的狀態發生變化,而做出相應的反應
可以設定觀察的操作:exists
,getChildren
,getData
可以觸發觀察的操作:create
,delete
,setData
znode以某種方式發生變化時,“觀察”(watch)機制可以讓客戶端得到通知。可以針對ZooKeeper服務的“操作”來設定觀察,該服務的其他 操作可以觸發觀察。比如,客戶端可以對某個客戶端呼叫exists操作,同時在它上面設定一個觀察,如果此時這個znode不存在,則exists返回 false,如果一段時間之後,這個znode被其他客戶端建立,則這個觀察會被觸發,之前的那個客戶端就會得到通知。