1. 程式人生 > >Zookeeper介紹(四)——Zookeeper中的基本概念

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被其他客戶端建立,則這個觀察會被觸發,之前的那個客戶端就會得到通知。

參考資料: