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 集合的客戶端數量,或希望將集合的重要部分與處理客戶端要求的負載隔離,觀察者都是一個良好的架構選擇。
- 作為資料中心橋樑:在兩個資料中心之間形成 ZK 聯合會是一項有問題的努力,因為資料中心之間的延遲變化很大,可能導致錯誤的故障偵測和分割。但是,如果聯合會完全在一個資料中心中執行,而第二個資料中心只執行觀察者,則分割不會造成問題,因為聯合會保持連線。觀察者的客戶端仍然可以看到並發出提案。
- 作為訊息匯流排的連結:有些公司表示有興趣將 ZK 用作持續可靠訊息匯流排的組成部分。觀察者將提供一個自然的整合點來執行這項工作:可以使用外掛程式機制將觀察者看到的提案串流附加到發布訂閱系統,同樣不需要載入核心聯合會。