Zookeeper概念詳解

一.Zookeeper是什麼?

Zookeeper是一個開源的分佈式協調服務,其致力於分佈式數據一致性解決方案。因此,分佈式應用程序可以基於zookeeper實現數據發佈/訂閱、負載均衡、命名服務、分佈式協調/通知、集群管理、master選舉、分佈式鎖和分佈式隊列等功能。

Zookeeper也可以作用於服務生產者和服務消費者的註冊中心,即服務生產者可以將服務註冊到zookeeper中心,服務消費者在調用服務的時候會先到zookeeper中心查找服務,獲取到服務生產者的詳細信息後,再調用服務生產者的數據。

Zookeeper概念詳解

二.zookeeper概念

2.1 讀在前面

Zookeeper本身就是一個分佈式程序,所以只要半數的節點存活,那麼zookeeper就能正常提供服務。

為了保證高可用,需要以集群的形式來部署zookeeper,這樣即使某臺機器發生故障,zookeeper也是可用的。

Zookeeper將數據保存在內存中,這樣可以保證高吞吐和低延遲。

Zookeeper的高性能體現在"讀",由於"寫"存在服務器間數據及狀態的同步,因此"寫"性能低於"讀"性能。

Zookeeper存在臨時節點的概念,當創建臨時節點的客戶端會話一直保持活動,則臨時節點就會一直存在,而當會話終結後,臨時節點則會被刪除。

持久節點一旦被創建,除非主動執行節點(ZNode)的移除操作,否則這個節點將一直保存在zookeeper上。

Zookeeper提供了以下功能,一是存儲、讀取用戶程序提交的數據,二是為用戶程序提交數據節點監聽服務。

2.2 會話(Session)

Session指的是zookeeper服務器與客戶端會話。在zookeeper中,一個客戶端連接是指客戶端和服務端之間的一個TCP長連接。

客戶端啟動的時候,首先會與zookeeper服務器建立一個tcp長連接,從第一次連接建立開始,客戶端會話的生命週期也開始。通過這個連接,客戶端能夠通過心跳機制與服務器保持有效的會話,也能夠向zookeeper服務器發送請求病接收響應,同時還能夠通過該連接接收來自服務器的watch事件通知。

SessionTimeout值用來設置客戶端會話的超時時間,當由於服務器壓力過大、網絡故障或客戶端主動斷開連接等各種原因所導致客戶端連接斷開的,只要在sessionTimeout規定的時間內能夠重新連接上集群中任意一臺服務器,則之前創建的會話仍然有效。

在為客戶端創建會話前,服務端會為每個客戶端都分配一個全局唯一的sessionID,此sessionID是zookeeper會話的重要標識,許多與會話相關的運行機制都是基於此的。

2.3 ZNode

在zookeeper中,節點可以分為兩類,一是構成集群的機器,稱之為機器節點,二是數據模型中的數據單元,稱之為數據節點(ZNode)。

Zookeeper將所有數據存儲內存中,數據模型是一棵樹(Znode Tree),其是由斜槓(/)進行分割的路徑,如/foo/path就是一個Znode。每個Znode都會保存自己的數據內容,同時還會保存一系列屬性信息。

Zookeeper還允許用戶為每個節點添加一個特殊的屬性:SEQUENTIAL,一旦節點被標記上這個屬性,那麼在這個節點被創建的時候,zookeeper會自動在其節點名後面追加一個整型數字,這個整型數字是一個由父節點維護的自增數字。

2.4 version

對於每個ZNode,zookeeper都會維護一個stat的數據結構

Stat記錄ZNode的三個數據版本,分別是version(當前ZNode的版本)、cversion(當前ZNode子節點的版本)、aversion(當前ZNode的ACL版本)

2.5 Watcher(事件監聽器)

Zookeeper允許用戶在指定節點上註冊一些watcher,並且在一些特定事件觸發的時候,zookeeper服務端會將事件通知到感興趣的客戶端去,該機制是zookeeper實現分佈式協調服務的重要特性。

2.6 ACL(AccessControlLists)

zookeeper採用ACL(AccessControlLists)策略來進行權限控制。

CREATE:創建子節點的權限(針對子節點)

READ:獲取節點數據和子節點列表的權限

WRITE:更新節點數據的權限

DELETE:刪除子節點的權限(針對子節點)

ADMIN:設置節點ACL的權限

2.7 zookeeper特性

順序一致性:從同一客戶端發起的事務請求,最終將會嚴格地按照順序被應用到zookeeper中。

原子性:所有事務請求的處理結果在整個集群中的所有機器上的應用情況是一致的,要麼整個集群中所有的機器都成功應用了某個事務,要麼都沒有應用。

單一系統映像:無論客戶端連到哪個zookeeper服務器上,其看到的服務端數據模型都是一致的。

可靠性:一旦一次更改請求被應用,更改的結果就會被持久化,直到被下一次更改覆蓋。

三.zookeeper設計目標

3.1 簡單的數據模型

命名空間由Znode組成,類似於文件和目錄。

Zookeeper概念詳解

3.2 構建集群

客戶端在使用zookeeper時,需要知道集群中機器列表,通過與集群中的某一臺機器建立TCP連接來使用服務。

客戶端使用這個TCP連接來發送請求、獲取結果、獲取監聽事件以及發送心跳包,如果這個連接異常斷開了,那麼客戶端就可以連接到另一個機器上。

Zookeeper概念詳解

上圖中每一個 Server 代表一個安裝 ZooKeeper 服務的服務器。組成 ZooKeeper 服務的服務器都會在內存中維護當前的服務器狀態,並且每臺服務器之間都互相保持著通信。

集群間通過 Zab 協議(Zookeeper Atomic Broadcast)來保持數據的一致性。

3.3 順序訪問

對於來自客戶端的每個更新請求,ZooKeeper 都會分配一個全局唯一的遞增編號。

這個編號反應了所有事務操作的先後順序,應用程序可以使用 ZooKeeper 這個特性來實現更高層次的同步原語。這個編號也叫做時間戳—zxid(ZooKeeper Transaction Id)。

四.zookeeper集群角色

Zookeeper集群角色可分為Leader、Follower、Observer

Follower和Observer唯一的區別在於Observer機器不參與Leader的選舉過程,也不參與寫操作的"過半寫成功"策略,因此,Observer機器可以在不影響寫性能的情況下提升集群的讀性能。

Leader(領導者),負責進行投票的發起和決議,更新系統狀態

Follower(跟隨者),用於接收客戶請求並向客戶端返回結果,在選主過程中參與投票

Observer(觀察者),接收客戶端連接,將寫請求轉發給Leader節點,但不參與選主的投票,只同步Leader的數據狀態。

您的關注是我的持續動力,咱們下期再見bye~


分享到:


相關文章: