Zookeeper基本功能
統一命名服務(naming)
分布式應用中,通常需要有一套完整的命名規則,既能狗產生唯一的命名又便於認識別和記住,通常情況下用樹形的結構是一個理想的選擇,屬性的名稱結構是一個有層次的目錄結構,既對人友好又不會重複,說到這裏你可能xiangdao`想到JNDO沒錯Zookeeper的Name Service與JNDI能夠完成的功能是差不多的,他們都是醬油層次的目錄結構關聯到一定資源上,dansh但是Zookeeper的NameService更加是廣泛意義上的關聯,也許你並不需要將名稱關聯到特定資源上,你可能隻需要一個不會重複的名稱,就想數據庫中產生唯一的數字主鍵一樣.
NameService已經是Zookeeper內置的功能,nizh你隻要調用Zookeeper的API就能實現,如調用create接口就可以很容易的創建一個目錄節點.
配置管理
配置管理的在分布式應用環境下很常見,例如同一個應用係統需要多台PC Server運行,但是他們運行的應用係統的某些配置是相同的,如果要修改這個相同的配置項,那麼就必須同時修改每台運行這個係統的PC Server這樣非常麻煩而且容易出錯.
像這樣的配置信息完全可以交給Zookeeper來管理,將配置信息保存在Zookeeper的某個目錄節點中,然後將所有需要修改的應用及其監控配置信息的狀態,一旦配置信息發生變化,每台應用及其就會收到ZooKeeper的通知,然後從Zookeeper的通知,然後從Zookeeper獲取新的配置信息應用到係統中
集群管理
Zookeeper能夠很容易的實現集群管理的功能,如有多台Server組成一個服務集群,那麼必須要一個總管知道當前及權重每台機器的服務狀態,一旦有機器不能提供服務,集群中其他集群必須知道,從而做出調整重新分配服務政策.同樣增加集群的服務能力時,就會增加一台或者多台server,同樣也必須讓總管知道.
Zookeeper不僅能夠幫你維護當前的集群中機器的服務狀態,而且能夠幫你選出一個'總管',讓這個總管來管理集群,這就是Zookeeper的另一個功能 Leader Election
它們的實現方式都是在 Zookeeper 上創建一個 EPHEMERAL 類型的目錄節點,然後每個 Server 在它們創建目錄節點的父目錄節點上調用 getChildren(String path, boolean watch) 方法並設置 watch 為 true,由於是 EPHEMERAL 目錄節點,當創建它的 Server 死去,這個目錄節點也隨之被刪除,所以 Children 將會變化,這時 getChildren上的 Watch 將會被調用,所以其它 Server 就知道已經有某台 Server 死去了。新增 Server 也是同樣的原理。
Zookeeper 如何實現 Leader Election,也就是選出一個 Master Server。和前麵的一樣每台 Server 創建一個 EPHEMERAL 目錄節點,不同的是它還是一個 SEQUENTIAL 目錄節點,所以它是個 EPHEMERAL_SEQUENTIAL 目錄節點。之所以它是 EPHEMERAL_SEQUENTIAL 目錄節點,是因為我們可以給每台 Server 編號,我們可以選擇當前是最小編號的 Server 為 Master,假如這個最小編號的 Server 死去,由於是 EPHEMERAL 節點,死去的 Server 對應的節點也被刪除,所以當前的節點列表中又出現一個最小編號的節點,我們就選擇這個節點為當前 Master。這樣就實現了動態選擇 Master,避免了傳統意義上單 Master 容易出現單點故障的問題。
對列管理
Zookeeper 可以處理兩種類型的隊列:
1.當一個隊列的成員都聚齊時,這個隊列才可用,否則一直等待所有成員到達,這種是同步隊列。
2.隊列按照 FIFO 方式進行入隊和出隊操作,例如實現生產者和消費者模型。
同步隊列用 Zookeeper 實現的實現思路如下:
創建一個父目錄 /synchronizing,每個成員都監控標誌(Set Watch)位目錄 /synchronizing/start 是否存在,然後每個成員都加入這個隊列,加入隊列的方式就是創建 /synchronizing/member_i 的臨時目錄節點,然後每個成員獲取 / synchronizing 目錄的所有目錄節點,也就是 member_i。判斷 i 的值是否已經是成員的個數,如果小於成員個數等待 /synchronizing/start 的出現,如果已經相等就創建 /synchronizing/start。
最後更新:2017-10-28 22:33:27