詳見:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt193node
ZooKeeper是Hadoop的正式子項目,它是一個針對大型分佈式系統的可靠協調系統,提供的功能包括:配置維護、名字服務、分佈式同步、組服務等。ZooKeeper的目標就是封裝好複雜易出錯的關鍵服務,將簡單易用的接口和性能高效、功能穩定的系統提供給用戶。web
Zookeeper是Google的Chubby一個開源的實現.是高有效和可靠的協同工做系統.Zookeeper可以用來leader選舉,配置信息維護等.在一個分佈式的環境中,咱們須要一個Master實例或存儲一些配置信息,確保文件寫入的一致性等.Zookeeper可以保證以下3點:服務器
Watches are ordered with respect to other events, other watches, and
asynchronous replies. The ZooKeeper client libraries ensures that
everything is dispatched in order.網絡
A client will see a watch event for a znode it is watching before seeing the new data that corresponds to that znode.async
The order of watch events from ZooKeeper corresponds to the order of the updates as seen by the ZooKeeper service.分佈式
在Zookeeper中,znode是一個跟Unix文件系統路徑類似的節點,能夠往這個節點存儲或獲取數據.若是在建立znode時Flag設置 爲EPHEMERAL,那麼當這個建立這個znode的節點和Zookeeper失去鏈接後,這個znode將再也不存在在Zookeeper 裏.Zookeeper使用Watcher察覺事件信息,當客戶端接收到事件信息,好比鏈接超時,節點數據改變,子節點改變,能夠調用相應的行爲來處理數 據.Zookeeper的Wiki頁面展現瞭如何使用Zookeeper來處理事件通知,隊列,優先隊列,鎖,共享鎖,可撤銷的共享鎖,兩階段提交.oop
那麼Zookeeper能幫咱們做什麼事情呢?簡單的例子:假設咱們咱們有個20個搜索引擎的服務器(每一個負責總索引中的一部分的搜索任務)和一個 總服務器(負責向這20個搜索引擎的服務器發出搜索請求併合並結果集),一個備用的總服務器(負責當總服務器宕機時替換總服務器),一個web的 cgi(向總服務器發出搜索請求).搜索引擎的服務器中的15個服務器如今提供搜索服務,5個服務器正在生成索引.這20個搜索引擎的服務器常常要讓正在 提供搜索服務的服務器中止提供服務開始生成索引,或生成索引的服務器已經把索引生成完成能夠搜索提供服務了.使用Zookeeper能夠保證總服務器自動 感知有多少提供搜索引擎的服務器並向這些服務器發出搜索請求,備用的總服務器宕機時自動啓用備用的總服務器,web的cgi可以自動地獲知總服務器的網絡 地址變化.這些又如何作到呢?性能
提供搜索引擎的服務器都在Zookeeper中建立znode,zk.create("/search/nodes/node1",
"hostname".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateFlags.EPHEMERAL);搜索引擎
總服務器能夠從Zookeeper中獲取一個znode的子節點的列表,zk.getChildren("/search/nodes", true);spa
總服務器遍歷這些子節點,並獲取子節點的數據生成提供搜索引擎的服務器列表.
當總服務器接收到子節點改變的事件信息,從新返回第二步.
總服務器在Zookeeper中建立節點,zk.create("/search/master", "hostname".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateFlags.EPHEMERAL);
備用的總服務器監控Zookeeper中的"/search/master"節點.當這個znode的節點數據改變時,把本身啓動變成總服務器,並把本身的網絡地址數據放進這個節點.
web的cgi從Zookeeper中"/search/master"節點獲取總服務器的網絡地址數據並向其發送搜索請求.
web的cgi監控Zookeeper中的"/search/master"節點,當這個znode的節點數據改變時,從這個節點獲取總服務器的網絡地址數據,並改變當前的總服務器的網絡地址.