雲計算愈來愈流行的今天,單一機器處理能力已經不能知足咱們的需求,不得不採用大量的服務集羣。服務集羣對外提供服務的過程當中,有不少的配置須要隨時更新,服務間須要協調工做,這些信息如何推送到各個節點?而且保證信息的一致性和可靠性?php
衆所周知,分佈式協調服務很難正確無誤的實現,它們很容易在競爭條件和死鎖上犯錯誤。如何在這方面節省力氣?Zookeeper是一個不錯的選擇。 Zookeeper背後的動機就是解除分佈式應用在實現協調服務上的痛苦。本文在介紹Zookeeper的基本理論基礎上,用Zookeeper實現了一 個配置管理中心,利用Zookeeper將配置信息分發到各個服務節點上,並保證信息的正確性和一致性。java
引用官方的說法:「Zookeeper是一個高性能,分佈式的,開源分佈式應用協調服務。它提供了簡單原始的功能,分佈式應用能夠基於它實現更高級 的服務,好比同步,配置管理,集羣管理,名空間。它被設計爲易於編程,使用文件系統目錄樹做爲數據模型。服務端跑在java上,提供java和C的客戶端 API」。算法
Zookeeper服務自身組成一個集羣(2n+1個服務容許n個失效)。Zookeeper服務有兩個角色,一個是leader,負責寫服務和數據同步,剩下的是follower,提供讀服務,leader失效後會在follower中從新選舉新的leader。編程
Zookeeper邏輯圖以下,服務器
Zookeeper表現爲一個分層的文件系統目錄樹結構(不一樣於文件系統的是,節點能夠有本身的數據,而文件系統中的目錄節點只有子節點)。分佈式
數據模型結構圖以下,性能
圓形節點能夠含有子節點,多邊形節點不能含有子節點。一個節點對應一個應用,節點存儲的數據就是應用須要的配置信息。雲計算
應用配置集中到節點上,應用啓動時主動獲取,並在節點上註冊一個watcher,每次配置更新都會通知到應用。.net
分佈式命名服務,建立一個節點後,節點的路徑就是全局惟一的,能夠做爲全局名稱使用。設計
不一樣的系統都監聽同一個節點,一旦有了更新,另外一個系統可以收到通知。
Zookeeper能保證數據的強一致性,用戶任什麼時候候均可以相信集羣中每一個節點的數據都是相同的。一個用戶建立一個節點做爲鎖,另外一個用戶檢測該節點,若是存在,表明別的用戶已經鎖住,若是不存在,則能夠建立一個節點,表明擁有一個鎖。
每一個加入集羣的機器都建立一個節點,寫入本身的狀態。監控父節點的用戶會受到通知,進行相應的處理。離開時刪除節點,監控父節點的用戶一樣會收到通知。
咱們公司作極光推送,Push 業務平臺有大量的邏輯服務器,按業務類型分組。邏輯服務的運行依賴於配置,而且配置會在線調整,須要一個集中的配置項管理中心。Zookeeper的發佈 與訂閱特性以及發送更新通知的機制很好的知足了咱們的需求。Zookeeper的容災特性也免去了咱們相關的大量管理工做。
下面我主要和你們分享一下Zookeeper在咱們內部服務中的應用。
a. 咱們的邏輯服務器包含兩類配置。
一種爲Acl(訪問控制列表),用戶的消息消費後,按照列表中的條件走向下一個邏輯服務器。另外一種只是單獨的算法邏輯的外提,稱爲Agl(訪問算法列表),可是其中某些判斷條件會常常變化。這兩類配置被收集到了配置管理中心(即Zookeeper)。
邏輯圖以下,
用戶編輯好策略配置信息(xml格式),經過客戶端加載到Zookeeper。Zookeeper當即通知其下的邏輯服務器(BLx),邏輯服務器 下載最新的配置策略,並應用新的策略。新的策略有可能改變某一段id範圍內用戶的數據流向,或越過原來的邏輯服務器,或指向新加入的邏輯服務器。
b. 數據模型設計
同一類型的邏輯服務在Zookeeper上建立一個節點,共享相同的配置信息。
該節點下面爲策略配置項,分爲Acl和Agl兩類,以下圖:(以代理邏輯服務爲例)
Acl1, Acl2, Acl3, Agl1, Agl2分別存有策略配置信息。變化後會通知監聽Proxy節點的邏輯服務器,Proxy邏輯服務器下載最新策略,並應用該策略。新節點的加入和退出也會通知到Proxy邏輯服務器。
c. 業務處理流程以下圖
原文地址http://blog.jpush.cn/index.php/push_zookeeper_study_usage/