(如果感覺有幫助,請幫忙點推薦,添加關注,謝謝!你的支持是我不斷更新文章的動力。本博客會逐步推出一系列的關於大型網站架構、分布式應用、設計模式、架構模式等方面的系列文章)
Zookeeper是Hadoop下的一個子項目,它是一個針對大型分布式系統的可靠的協調系統,提供的功能包括命名服務、配置維護、分布式同步、集群服務等。
Zookeeper是可以集群復制的,集群間通過Zab(Zookeeper Atomic Broadcast)協議來保持數據的一致性。
該協議包括2個階段:leader election階段和Actomic broadcast階段。集群中將選舉出一個leader,其他的機器則稱為follower,所有的寫操作都被傳送給leader,並通過broadcast將所有的更新告訴follower。當leader崩潰或者leader失去大多數的follower時,需要重新選舉出一個新的leader,讓所有的服務器都恢復到一個正確的狀態。當leader被選舉出來,且大多數服務器完成了和leader的狀態同步后,leader election的過程就結束了,將進入Atomic broadcast的過程。Actomic broadcast同步leader和follower之間的信息,保證leader和follower具備相同的系統狀態。
Zookeeper集群的結構圖如下:
路由和負載均衡的實現
當服務越來越多,規模越來越大時,對應的機器數量也越來越龐大,單靠人工來管理和維護服務及地址的配置信息,已經越來越困難。並且,依賴單一的硬件負載均衡設備或者使用LVS、Nginx等軟件方案進行路由和負載均衡調度,單點故障的問題也開始凸顯,一旦服務路由或者負載均衡服務器宕機,依賴其的所有服務均將失效。如果采用雙機高可用的部署方案,使用一台服務器“stand by”,能部分解決問題,但是鑒於負載均衡設備的昂貴成本,已難以全面推廣。
一旦服務器與ZooKeeper集群斷開連接,節點也就不存在了,通過注冊相應的watcher,服務消費者能夠第一時間獲知服務提供者機器信息的變更。利用其znode的特點和watcher機制,將其作為動態注冊和獲取服務信息的配置中心,統一管理服務名稱和其對應的服務器列表信息,我們能夠近乎實時地感知到后端服務器的狀態(上線、下線、宕機)。Zookeeper集群間通過Zab協議,服務配置信息能夠保持一致,而Zookeeper本身容錯特性和leader選舉機制,能保證我們方便地進行擴容。
Zookeeper中,服務提供者在啟動時,將其提供的服務名稱、服務器地址、以節點的形式注冊到服務配置中心,服務消費者通過服務配置中心來獲得需要調用的服務名稱節點下的機器列表節點。通過前面所介紹的負載均衡算法,選取其中一台服務器進行調用。當服務器宕機或者下線時,由於znode非持久的特性,相應的機器可以動態地從服務配置中心里面移除,並觸發服務消費者的watcher。在這個過程中,服務消費者只有在第一次調用服務時需要查詢服務配置中心,然后將查詢到的服務信息緩存到本地,后面的調用直接使用本地緩存的服務地址列表信息,而不需要重新發起請求到服務配置中心去獲取相應的服務地址列表,直到服務的地址列表有變更(機器上線或者下線),變更行為會觸發服務消費者注冊的相應的watcher進行服務地址的重新查詢。這種無中心化的結構,使得服務消費者在服務信息沒有變更時,幾乎不依賴配置中心,解決了之前負載均衡設備所導致的單點故障的問題,並且大大降低了服務配置中心的壓力。
通過Zookeeper來實現服務動態注冊、機器上線與下線的動態感知,擴容方便,容錯性好,且無中心化結構能夠解決之前使用負載均衡設備所帶來的單點故障問題。只有當配置信息更新時服務消費者才會去Zookeeper上獲取最新的服務地址列表,其他時候使用本地緩存即可,這樣服務消費者在服務信息沒有變更時,幾乎不依賴配置中心,能大大降低配置中心的壓力。