ZooKeeper的一些概念

一、ZooKeeper介紹

Zookeeper是一個分佈式的協調服務,設計目標是將複雜且容易出錯的分佈式一致性服務封裝起來,以一系列的簡單易用的接口提供給用戶使用。
它提供了典型的分佈式數據一致性的解決方案,分佈式應用程序可以基於它實現 數據發佈/訂閱、負載均衡、命名服務、分佈式協調/通知、集羣管理、Leader選舉、分佈式鎖和分佈式隊列等功能。

二、ZooKeeper的基本概念

集羣

通常在分佈式系統中,構成一個集羣的每一臺機器都有自己的角色,最典型的集羣模式就是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/path。每個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這兩種權限都是針對子節點的權限控制。

發佈了68 篇原創文章 · 獲贊 12 · 訪問量 40萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章