大數據(六) - ZooKeeper
Zookeeper是什么
是一個針對大型分布式系統的可靠協調系統;
提供的功能包括:配置維護、名字服務、分布式同步、組服務等;
目標就是封裝好復雜易出錯的關鍵服務,將簡單易用的接口和性能高效、功能穩定的系統提供給用戶;
Zookeeper已經成為Hadoop生態系統中的基礎組件。
最終一致性:為客戶端展示同一視圖,這是zookeeper最重要的功能。
可靠性:如果消息被到一臺服務器接受,那么它將被所有的服務器接受。
實時性:Zookeeper不能保證兩個客戶端能同時得到剛更新的數據,如果需要最新數據,應該在讀數據之前調用sync()接口。
等待無關(wait-free):慢的或者失效的client不干預快速的client的請求。
原子性:更新只能成功或者失敗,沒有中間狀態。
順序性:所有Server,同一消息發布順序一致。
每個Server在內存中存儲了一份數據;
Zookeeper啟動時,將從實例中選舉一個leader(Paxos協議);
Leader負責處理數據更新等操作(Zab協議);
一個更新操作成功,當且僅當大多數Server在內存中成功修改數據。

其中的角色包括:

Zookeeper Server數目一般為奇數
Leader選舉算法采用了Paxos協議;
Paxos核心思想:當多數Server寫成功,則任務數據寫成功
如果有3個Server,則兩個寫成功即可;
如果有4或5個Server,則三個寫成功即可。
Server數目一般為奇數(3、5、7)
如果有3個Server,則最多允許1個Server掛掉;
如果有4個Server,則同樣最多允許1個Server掛掉
既然如此,為啥要用4個Server?

層次化的目錄結構,命名符合常規文件系統規范;
每個節點在zookeeper中叫做znode,并且其有一個唯一的路徑標識;
節點Znode可以包含數據和子節點(EPHEMERAL類型的節點不能有子節點);
Znode中的數據可以有多個版本,比如某一個路徑下存有多個數據版本,那么查詢這個路徑下的數據需帶上版本;
客戶端應用可以在節點上設置監視器(Watcher);
節點不支持部分讀寫,而是一次性完整讀寫。
Znode有兩種類型,短暫的(ephemeral)和持久的(persistent);
Znode的類型在創建時確定并且之后不能再修改;
短暫znode的客戶端會話結束時,zookeeper會將該短暫znode刪除,短暫znode不可以有子節點;
持久znode不依賴于客戶端會話,只有當客戶端明確要刪除該持久znode時才會被刪除;
Znode有四種形式的目錄節點,PERSISTENT、PERSISTENT_SEQUENTIAL、EPHEMERAL、EPHEMERAL_SEQUENTIAL。

統一命名服務
分布式環境下,經常需要對應用/服務進行統一命名,便于識別不同服務;
類似于域名與ip之間對應關系,域名容易記住;
通過名稱來獲取資源或服務的地址,提供者等信息
按照層次結構組織服務/應用名稱
可將服務名稱以及地址信息寫到Zookeeper上,客戶端通過Zookeeper獲取可用服務列表類
配置管理</span>
分布式環境下,配置文件管理和同步是一個常見問題;
一個集群中,所有節點的配置信息是一致的,比如Hadoop;
對配置文件修改后,希望能夠快速同步到各個節點上
配置管理可交由Zookeeper實現;
可將配置信息寫入Zookeeper的一個znode上;
各個節點監聽這個znode
一旦znode中的數據被修改,zookeeper將通知各個節點
集群管理</span>
分布式環境中,實時掌握每個節點的狀態是必要的;
可根據節點實時狀態作出一些調整;
可交由Zookeeper實現;
可將節點信息寫入Zookeeper的一個znode上;
監聽這個znode可獲取它的實時狀態變化
典型應用
Hbase中Master狀態監控與選舉
分布式通知/協調
分布式環境中,經常存在一個服務需要知道它所管理的子服務的狀態;
NameNode須知道各DataNode的狀態
JobTracker須知道各TaskTracker的狀態
心跳檢測機制可通過Zookeeper實現;
信息推送可由Zookeeper實現(發布/訂閱模式)。
分布式鎖
Zookeeper是強一致的;
多個客戶端同時在Zookeeper上創建相同znode,只有一個創建成功。
實現鎖的獨占性
多個客戶端同時在Zookeeper上創建相同znode ,創建成功的那個客戶端得到鎖,其他客戶端等待。
控制鎖的時序
各個客戶端在某個znode下創建臨時znode (類型為CreateMode.EPHEMERAL_SEQUENTIAL),這樣,該znode可掌握全局訪問時序。
分布式隊列
兩種隊列;
當一個隊列的成員都聚齊時,這個隊列才可用,否則一直等待所有成員到達,這種是同步隊列。
隊列按照 FIFO 方式進行入隊和出隊操作,例如實現生產者和消費者模型。(可通過分布式鎖實現)
同步隊列
一個job由多個task組成,只有所有任務完成后,job才運行完成。
可為job創建一個/job目錄,然后在該目錄下,為每個完成的task創建一個臨時znode,一旦臨時節點數目達到task總數,則job運行完成。
單機模式
偽分布式模式(在單機上啟動多個zookeeper實例,模擬分布式)
分布式模式
Watcher 在 ZooKeeper 是一個核心功能
可以監控目錄節點的數據變化以及子目錄的變化;
一旦狀態發生變化,服務器就會通知所有設置在這個目錄節點上的 Watcher;
基本特點
一次設置對應一次觸發
異步觸發
順序觸發
可以設置觀察的操作:exists getChildren getData
可以觸發觀察的操作:create delete setData
更多實例
https://github.com/sleberknight/zookeeper-samples/tree/master/src/main/java/com/nearinfinity/examples/zookeeper
NetFlix貢獻的Curator ZooKeeper客戶端成為Apache頂級項目 http://curator.apache.org/index.html
來自: http://blog.csdn.net//matthewei6/article/details/50533896
本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!