1. 程式人生 > >zookeeper實現負載均衡

zookeeper實現負載均衡

zookeeper是一個針對大型分散式系統的可靠的協調系統,提供的功能包括命名服務配置維護分散式同步叢集服務等。
分散式叢集:
由於zookeeper主要扮演的角色是分散式叢集中的協調者,所以首先介紹一下分散式和叢集的概念。
簡單來說,分散式是將一個完整的系統拆分成多個能實現不同業務需求的系統分佈在多個地方,而叢集是隻將業務需求相同系統或服務複雜多份放在不同的伺服器實現負載均衡,減輕伺服器壓力。用個比喻來說,小飯店原來只有一個廚師,切菜洗菜備料炒菜全乾。後來客人多了,廚房一個廚師忙不過來,又請了個廚師,兩個廚師都能炒一樣的菜,這兩個廚師的關係是叢集。為了讓廚師專心炒菜,把菜做到極致,又請了個配菜師負責切菜,備菜,備料,廚師和配菜師的關係是分散式

,一個配菜師也忙不過來了,又請了個配菜師,兩個配菜師關係是叢集。這個解釋還是可以的。

與dubbo的配合

zookeeper在一個分散式叢集中既可以作為服務註冊中心,來協調幾個業務需求不同的分散式服務,也可以在一個叢集中實現負載均衡,最典型的例項是zookeeper與Dubbo的配合使用,dubbo是阿里巴巴的RPC框架(如果沒有接觸過,在本文中可以理解為webservice)。zookeeper 在dubbo組成的分散式服務中就實現了一個服務註冊中心的角色,既可以實現分散式服務的協調功能也可以實現負載均衡的功能

如下圖所示,把ZooKeeper作為一個服務的註冊中心,在其中登記每個服務,每臺伺服器知道自己是屬於哪個服務,在伺服器啟動時,自己向所屬服務進行登記,這樣,一個樹形的服務結構就呈現出來了,根據這樣一個樹形服務結構,RPC服務的消費者可以很輕鬆的找到它所需求的服務資訊。同時在一個service節點下可以註冊多個業務邏輯相同的服務,以實現負載均衡。

負載均衡

zookeeper實現負載均衡其實原理很簡單,zookeeper 的資料儲存類似於liunx的目錄結構。首先建立servers節點,並建立監聽器監視servers子節點的狀態(用於在伺服器增添時及時同步當前叢集中伺服器列表)。在每個伺服器啟動時,在servers節點下建立子節點worker server(可以用伺服器地址命名),並在對應的位元組點下存入伺服器的相關資訊。這樣,我們在zookeeper伺服器上可以獲取當前叢集中的伺服器列表及相關資訊,可以自定義一個負載均衡演算法,在每個請求過來時從zookeeper伺服器中獲取當前叢集伺服器列表,根據演算法選出其中一個伺服器來處理請求。

程式碼
serviceAProvider,和serviceBProvider是模擬提供相同服務service-A的叢集 模擬IP地址分別為92.168.58.131,92.168.58.132,
zookeeper伺服器地址為172.19.100.29:2181。

另附程式碼:

新增連結描述