ZooKeeper筆記(1):ZooKeeper特性與基本概念

yaluoshan發表於2020-11-18

Zookeeper是一個典型的分散式資料一致性的解決方案,提一供了諸如統一命名服務、配置管理和分散式鎖等分散式的基礎服務。Zookeeper的設計目標是將那些複雜且容易出錯的分散式一致性服務封裝起來,構成一個高效可靠的原語集,並以一系列簡單易用的介面提供給使用者使用。

隨著分散式架構的出現,越來越多的分散式應用會面臨資料一致性問題。除ZooKeeper之外,目前還沒有一個成熟穩定且被大規模應用的解決方案,ZooKeeper無論從效能、易用性、穩定性上來說都已經達到了一個工業級產品的標準。其次,Zookeeper是開源、免費的,已經得到了廣泛的應用,Hadoop、HBase、Stom和Solr等越來越來越多的大型分散式專案都已經將ZooKeeper作為其核心元件,用於分散式協調。

1.Zookeeper的特性

1)順序一致性

從同一個客戶端發起的事務請求,最終將會嚴格地按照其發起順序被應用到ZooKeeper中去。

2)原子性

所有事務請求的處理結果在整個叢集中所有機器上的應用情況是一致的,也就是說,要麼整個叢集所有機器都成功執行了某一個事務,要麼都沒有執行。一定不會出現叢集中部分機器執行了該事務,而另外一部分沒有執行事務的情況。

3)單一檢視

無論客戶端連線叢集中的任意一個Zookeeper伺服器,其看到的服務端資料模型都是一致的。

4)可靠性

一旦服務端成功地應用了一個事務,並完成對客戶端的響應,那麼該事務所引起的服務端狀志變更將會被一直保留下來。

5)實時性

Zookeeper僅僅保證在一定的時間段內,客戶端最終一定能夠從服務端讀取到最新的資料狀態。並不能保證客戶端立即能從服務端讀取到最新的狀態。

2.ZooKeeper的設計目標

ZooKeeper致力於提供一個高效能、高可用、具有嚴格的順序訪問控制能力(主要是寫操作的嚴格順序性)的分散式協調服務,ZooKeeper的四個設計目標如下。

(1)簡單的資料模型

ZooKeeper使得分散式程式能夠通過一個共享的樹型結構的名字空間來進行相互協調。樹型結構的名字空間指ZooKeeper伺服器記憶體中的一個資料模型,其由一系列ZNode的資料節點組成。其資料模型類似於一個檔案系統,ZNode之間的層級關係,就像檔案系統的目錄結構一樣。與傳統的磁碟檔案系統不同,ZooKeeper將全量資料儲存在記憶體中,以此來提高伺服器吞吐、減少延遲。

(2)可以構建叢集

一個ZooKeeper叢集通常由一組機器組成,一般3-5臺機器就可以組成一個高可用的ZooKeeper叢集。組成ZooKeeper叢集的每臺機器都會在記憶體中維護當前的伺服器狀態,並且每臺機器之間都互相保持著通訊。只要叢集中存在超過一半的機器能夠正常工作那麼整個叢集就能夠正常對外服務。ZooKeeper的客戶端程式會選擇和叢集中任意一臺機器建立一個TCP連線,一旦客戶端和連線的ZooKeeper伺服器之間的連線斷開,客戶端會自動連線到叢集中的其他機器。

(3)順序訪問

對於來自客戶端的毎個更新請求,ZooKeeper都會分配個全域性唯一的遞增編號,這個一編號反映了所有事務操作的先後順序,應用程式可以使用ZooKeeper的這個特性來實現更高層次的同步原語。

(4)高效能

ZooKeeper將全量資料儲存在記憶體中,並直接服務於客戶端的所有非事務請求,因此它尤其適用於以讀操作為主的應用場景,效能非常高。

3.ZooKeeper中的基本概念

(1)叢集角色

ZooKeeper沒有采用傳統的Master/Slave結構,而是引入了Leader、Follower、Observer等三個角色。叢集中的所有非Observer機器通過Leader選舉過程來選定一臺Leader伺服器,Leader伺服器為客戶端提供讀、寫服務。Follower和Observer都能夠提供讀服務,二者唯一的區別在於,Observer機器不參與Leader選舉過程,也不參與寫操作的“過半寫成功”策略,僅僅只提供讀服務。因此Observer可以在不影響寫效能的情況下提升叢集的讀效能。

(2)會話(Session)

Session是指客戶端會話。在ZooKeeper中,客戶端連線是指客戶端和伺服器之間的一個TCP長連線。客戶端與伺服器從第一次連線建立開始,客戶端會話的生命週期就開始了,通過這個TCP長連線,客戶端能夠通過心跳檢測與伺服器保持有效的會話,也能夠向ZooKeeper伺服器傳送請求並接受響應,同時還能夠通過該連線接收來自伺服器的Watch事件通知。

Session的sessionTimeout值用來設定一個客戶端會話的超時時間。當由於伺服器壓力太大、網路故障或客戶端主動斷開連線等各種原因導致客戶端連線斷開時,只要在sessionTimeout規定的時間內能夠重新連線上叢集中任意一臺伺服器,那麼之前建立的會話仍然有效。

(3)資料節點(Znode)

ZooKeeper中節點分為兩類,第一類指構成叢集的機器,稱為機器節點;第二類指資料模型中的資料單元,稱為資料節點ZNode。ZooKeeper將所有資料儲存在記憶體中,資料模型是棵樹(ZNodeTree),由斜槓(/)進行分割的路徑,就是一個ZNode,每個ZNode上都會儲存自己的資料內容,同時還會儲存一系列屬性資訊。

在ZooKeeper中,ZNode可以分為持久節點和臨時節點兩類。持久節點是指這個ZNode被建立後,除非主動移除ZNode,將一直儲存在ZooKeeper上。臨時節點的生命週期和客戶端會話繫結,一旦客戶端會話失效,這個客戶端建立的所有臨吋節點被全部移除。另外,ZooKeeper還允許使用者為毎個節點新增一個特殊的屬性:SEQUENTIAL。一旦節點被標記上這個屬性,那麼在這個節點被建立的時候,ZooKeeper會自動在其節點名後面追加上一個整型數字,這個整型數字是一個由父節點維護的自增數字。

(4)版本

ZooKeeper的每個ZNode上都會儲存資料,對於每個ZNode,ZooKeeper都會為其維護一個叫作Stat的資料結構,Stat中記錄了ZNode的三個資料版本,分別是version(當前ZNode的版本)、cversion(當前ZNode子節點的版本)和aversion(當前ZNode的ACL版本)。

(5)Watcher

Watcher(事件監聽器)是ZooKeeper中的一個很重要的特性,ZooKeeper允許使用者在指定ZNode上註冊一些Watcher,並在一些特定事件觸發的時候,ZooKeeper服務端會將事件通知到感興趣的客戶端上去,該機制是ZooKeeper實現分散式協調服務的重要特性。

(6)ACL

ZooKeeper釆用ACL(Access Control Lists)策略釆進行許可權控制,類似於UNX檔案系統的許可權控制。ZooKeeper定義瞭如下5種許可權,其中,CREATE和DELETE這兩種許可權都是針對子節點的許可權控制。

  • CREATE:建立子節點的許可權;
  • READ:獲取節點資料和子節點列表的許可權;
  • WRITE:更新節點資料的許可權;
  • DELETE:刪除子節點的許可權;
  • ADMIN:設定節點ACL的許可權;

相關文章