zookeeper是hadoop的正式子項目,它是一個針對大型分布式系統的可靠協調系統,提供的功能包括:配置維護、名字服務、分布式同步、組服務等。zookeeper的目标就是封裝好複雜易出錯的關鍵服務,将簡單易用的接口和性能高效、功能穩定的系統提供給使用者。
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.
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來處理事件通知,隊列,優先隊列,鎖,共享鎖,可撤銷的共享鎖,兩階段送出.
那麼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);
總伺服器周遊這些子節點,并擷取子節點的資料生成提供搜尋引擎的伺服器清單.
當總伺服器接收到子節點改變的事件資訊,重新傳回第二步.
總伺服器在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的節點資料改變時,從這個節點擷取總伺服器的網絡位址資料,并改變目前的總伺服器的網絡位址.
特别說明:尊重作者的勞動成果,轉載請注明出處哦~~~http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt193