ZooKeeper是一個分佈式的,開放源碼的分佈式應用程序協調服務,是Google的Chubby一個開源的實現,是大數據生態中的重要組件。它是集羣的管理者,監視着集羣中各個節點的狀態根據節點提交的反饋進行下一步合理操做。最終,將簡單易用的接口和性能高效、功能穩定的系統提供給用戶。node
它是一個爲分佈式應用提供一致性協調服務的中間件redis
客戶端到服務端的一次請求到響應結束會經歷多臺計算機數據庫
圖示1服務器
圖示2併發
服務的動態註冊和發現,爲了支持高併發,OrderService被部署了4份,每一個客戶端都保存了一份服務提供者的列表,但這個列表是靜態的(在配置文件中寫死的),若是服務的提供者發生了變化,例若有些機器down了,或者又新增了OrderService的實例,客戶端根本不知道,想要獲得最新的服務提供者的URL列表,必須手工更新配置文件,很不方便。分佈式
問題 : 客戶端和服務提供者的緊耦合高併發
解決方案: 解除耦合,增長一箇中間層 -- 註冊中心它保存了能提供的服務的名稱,以及URL。首先這些服務會在註冊中心進行註冊,當客戶端來查詢的時候,只須要給出名稱,註冊中心就會給出一個URL。全部的客戶端在訪問服務前,都須要向這個註冊中心進行詢問,以得到最新的地址。性能
註冊中心能夠是樹形結構,每一個服務下面有若干節點,每一個節點表示服務的實例。大數據
註冊中心和各個服務實例直接創建Session,要求實例們按期發送心跳,一旦特定時間收不到心跳,則認爲實例掛了,刪除該實例。雲計算
Job協調問題
三個Job的功能相同,部署在三個不一樣的機器上,要求同一時刻只有一個能夠運行,也就是若是有一個宕了的話,須要在剩下的兩個中選舉出Master
繼續工做
因此這三個Job須要互相協調
使用共享數據庫表。咱們知道數據庫主鍵不能衝突,可讓三個Job向表中插入一樣的數據,誰成功誰就是Master。缺點是若是搶到Master的Job掛了,則記錄永遠存在,其餘的Job沒法插入數據。因此必須加上按期更新的機制。
讓Job在啓動以後,去註冊中心註冊,也就是建立一個樹節點,誰成功誰是Master(註冊中心必須保證只能建立成功一次)。
這樣,若是節點刪除了,就開始新一輪爭搶。
分佈式鎖, 多臺機器上運行的不一樣的系統操做同一資源
使用Master選舉的方式,讓你們去搶,誰能搶到就建立一個/distribute_lock
節點,讀完之後就刪除,讓你們再來搶。缺點是某個系統可能屢次搶到,不夠公平。
讓每一個系統在註冊中心的/distribute_lock
下建立子節點,而後編號,每一個系統檢查本身的編號,誰的編號小認爲誰持有了鎖,好比下圖中是系統1持有了鎖
系統1操做完成之後,就能夠把process_01刪除了,再建立一個新的節點 process_04。此時是process_02最小了,因此認爲系統2持有了鎖。
操做完成之後也要把process_02節點刪除,建立新的節點。這時候process_03就是最小的了,能夠持有鎖了。
註冊中心的高可用