集群角色
通常在分布式系統中,構成一個集群的每一臺機器都有自己的角色,最典型的集群模式就是Master/Slave模式(主備模式)。在這種模式中,我們把能夠處理所有寫操作的機器稱為Master機器,把所有通過異步復制方式獲取最新數據,并提供讀服務的機器稱為Slave機器。而在ZooKeeper中,這些概念被顛覆了。它沒有沿用傳統的Master/Slave概念,而是引入了Leader、 Follower 和Observer 三種角色。ZooKeeper 集群中的所有機器通過一個Leader選舉過程來選定一臺被稱為“Leader”的機器,Leader 服務器為客戶端提供讀和寫服務。除Leader外,其他機器包括Follower 和Observer。Follower 和Observer都能夠提供讀服務,唯一的區別在于,Observer機器不參與Leader選舉過程,也不參與寫操作的“過半寫成功”策略,因此Observer可以在不影響寫性能的情況下提升集群的讀性能。
會話?(Session)
Session是指客戶端會話,在講解會話之前,我們首先來了解一下客戶端連接。在ZooKeeper中,一個客戶端連接是指客戶端和服務器之間的一個TCP長連接。ZooKeeper對外的服務端口默認是2181,客戶端啟動的時候,首先會與服務器建立一個TCP連接,從第一次連接建立開始,客戶端會話的生命周期也開始了,通過這個連接,客戶端能夠通過心跳檢測與服務器保持有效的會話,也能夠向ZooKeeper服務器發送請求并接受響應,同時還能夠通過該連接接收來自服務器的Watch事件通知。Session的sessionTimeout值用來設置一個客戶端會話的超時時間。當由于服務器壓力太大、網絡故障或是客戶端主動斷開連接等各種原因導致客戶端連接斷開時,只要在sessionTimeout規定的時間內能夠重新連接上集群中任意一臺服務器,那么之前創建的會話仍然有效。
數據節點(Znode)
在談到分布式的時候,我們通常說的“節點”是指組成集群的每一臺機器。然而,在
ZooKeeper中,“節點”分為兩類,第一類同樣是指構成集群的機器,我們稱之為機器節
點;第二類則是指數據模型中的數據單元,我們稱之為數據節點一ZNode。 ZooKeeper
將所有數據存儲在內存中,數據模型是一棵樹(ZNode Tree), 由斜杠(/) 進行分割的
路徑,就是一個Znode,例如/foo/pathI。每個ZNode.上都會保存自己的數據內容,同時
還會保存一系列屬性信息。
在ZooKeeper中,ZNode可以分為持久節點和臨時節點兩類。所謂持久節點是指一旦這個ZNode被創建了,除非主動進行ZNode的移除操作,否則這個ZNode將一直保存在ZooKeeper上。而臨時節點就不一樣了,它的生命周期和客戶端會話綁定,一旦客戶端會話失效,那么這個客戶端創建的所有臨時節點都會被移除。另外,ZooKeeper還允許用戶為每個節點添加一個特殊的屬性:SEQUENTIAL。一旦節點被標記上這個屬性,那么在這個節點被創建的時候,ZooKeeper會自動在其節點名后面追加上一個整型數字,這個整型數字是一個由父節點維護的自增數字。
版本
在前面我們已經提到,ZooKeeper 的每個ZNode上都會存儲數據,對應于每個ZNode,ZooKeeper都會為其維護一個叫作Stat的數據結構,Stat中記錄了這個ZNode的三個數據版本,分別是version(當前ZNode的版本)、cversion (當前ZNode子節點的版本)和aversion(當前ZNode的ACL版本)。
Watcher
Watcher (事件監聽器),是ZooKeeper中的一個很重要的特性。ZooKeeper 允許用戶在指定節點上注冊一些Watcher,并且在一些特定事件觸發的時候,ZooKeeper服務端會將事件通知到感興趣的客戶端上去,該機制是ZooKeeper實現分布式協調服務的重要特性。
ACL
ZooKeeper采用ACL (Access Control Lists) 策略來進行權限控制,類似于UNIX文件系統的權限控制。ZooKeeper 定義了如下5種權限。
CREATE:創建子節點的權限。
READ:獲取節點數據和子節點列表的權限。
WRITE:更新節點數據的權限。
DELETE:刪除子節點的權限。
ADMIN:設置節點ACL的權限。
其中尤其需要注意的是,CREATE和DELETE這兩種權限都是針對子節點的權限控制。