Apache > ZooKeeper
 

ZooKeeper 觀察者

觀察者:擴充 ZooKeeper 而不影響寫入效能

雖然 ZooKeeper 讓客戶端直接連線到群組的投票成員,效能非常好,但這種架構很難擴充到大量的客戶端。問題在於,當我們增加更多投票成員時,寫入效能會下降。這是因為寫入操作需要(通常)至少一半的群組節點同意,因此隨著投票者增加,投票成本可能會大幅增加。

我們引進了一種新的 ZooKeeper 節點類型,稱為「觀察者」,有助於解決此問題,並進一步提升 ZooKeeper 的可擴充性。觀察者是群組的非投票成員,只會聽到投票結果,不會參與導致投票結果的同意議定書。除了這個簡單的區別之外,觀察者的功能與追隨者完全相同,客戶端可以連線到觀察者,並向觀察者傳送讀取和寫入要求。觀察者會像追隨者一樣將這些要求轉發給領導者,但之後只會等待投票結果。因此,我們可以盡量增加觀察者的數量,而不影響投票效能。

觀察者還有其他優點。由於觀察者不會投票,因此不是 ZooKeeper 群組的關鍵部分。因此,觀察者可以發生故障或與叢集斷線,而不影響 ZooKeeper 服務的可用性。對使用者來說,好處是觀察者可以透過比追隨者不穩定的網路連結連線。事實上,觀察者可以用來與另一個資料中心的 ZooKeeper 伺服器通訊。觀察者的客戶端會看到快速的讀取,因為所有讀取都在本地端執行,而寫入會產生最少的網路流量,因為在沒有投票議定書的情況下所需的訊息數量較少。

如何使用觀察者

設定使用觀察者的 ZooKeeper 群組非常簡單,只需要對設定檔進行兩個變更。首先,在每個要成為觀察者的節點設定檔中,您必須放置這行

peerType=observer

這行會告訴 ZooKeeper 伺服器要成為觀察者。其次,在每個伺服器設定檔中,您必須在每個觀察者的伺服器定義行中加入 :observer。例如

server.1:localhost:2181:3181:observer

這會告訴每個其他伺服器,server.1 是觀察者,且他們不應期待它投票。這是您在 ZooKeeper 集群中新增觀察者所需的全部設定。現在,您可以連線到它,就好像它是普通追隨者一樣。透過執行以下動作來試用看看

$ bin/zkCli.sh -server localhost:2181

其中,localhost:2181 是每個設定檔中指定的觀察者的主機名稱和埠號。您應該會看到一個命令列提示字元,您可以透過它發出命令,例如 ls,來查詢 ZooKeeper 服務。

如何使用觀察者主控

觀察者功能簡單,作為集合中的非投票成員,與追隨者共用學習者介面,且僅持有略有不同的內部管線。兩者都透過法定人數埠維持與主控的連線,藉此得知集合中所有新的提案。

預設情況下,觀察者會透過其法定人數埠連線到法定人數的主控,這是他們得知集合中所有新提案的方式。允許觀察者連線到追隨者,而不是連線到主控,以取代連線到提交串流,這會帶來好處。它將支援觀察者的負擔從主控轉移,並讓主控專注於協調寫入的提交。這表示當主控處於高負載時,特別是高網路負載(例如在領導者選舉後,當許多學習者需要同步時)會有更好的效能。當有大量觀察者時,它會減少主控上維護的總網路連線。啟用追隨者來支援觀察者,可讓觀察者的總數擴充到數百個。另一方面,觀察者的可用性會獲得改善,因為大量觀察者完成同步並開始提供客戶端流量所需的時間會縮短。

此功能可透過讓集合中的所有成員知道追隨者將用於偵聽觀察者連線的埠來啟用。將下列項目新增到伺服器設定檔時,將指示觀察者連線到埠 2191 上的對等方(主控和追隨者),並指示追隨者建立觀察者主控執行緒來偵聽和提供該埠上的服務。

observerMasterPort=2191

範例使用案例

以下是觀察者的兩個範例使用案例。事實上,無論您希望擴充 ZooKeeper 集合的客戶端數量,或希望將集合的重要部分與處理客戶端要求的負載隔離,觀察者都是一個良好的架構選擇。