大數據(六) - ZooKeeper

jopen 8年前發布 | 13K 次閱讀 分布式/云計算/大數據

Zookeeper是什么

        是一個針對大型分布式系統的可靠協調系統;

        提供的功能包括:配置維護、名字服務、分布式同步、組服務等;

        目標就是封裝好復雜易出錯的關鍵服務,將簡單易用的接口和性能高效、功能穩定的系統提供給用戶;

        Zookeeper已經成為Hadoop生態系統中的基礎組件。


Zookeeper特點</span>
        最終一致性:為客戶端展示同一視圖,這是zookeeper最重要的功能。

        可靠性:如果消息被到一臺服務器接受,那么它將被所有的服務器接受。

        實時性:Zookeeper不能保證兩個客戶端能同時得到剛更新的數據,如果需要最新數據,應該在讀數據之前調用sync()接口。

        等待無關(wait-free):慢的或者失效的client不干預快速的client的請求。

        原子性:更新只能成功或者失敗,沒有中間狀態。

        順序性:所有Server,同一消息發布順序一致。


Zookeeper 架構</span>

        每個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 數據寫流程</span>


Zookeeper數據模型</span>

        層次化的目錄結構,命名符合常規文件系統規范;

        每個節點在zookeeper中叫做znode,并且其有一個唯一的路徑標識;

        節點Znode可以包含數據和子節點(EPHEMERAL類型的節點不能有子節點);

        Znode中的數據可以有多個版本,比如某一個路徑下存有多個數據版本,那么查詢這個路徑下的數據需帶上版本;

        客戶端應用可以在節點上設置監視器(Watcher);

        節點不支持部分讀寫,而是一次性完整讀寫。

        Znode有兩種類型,短暫的(ephemeral)和持久的(persistent);

        Znode的類型在創建時確定并且之后不能再修改;

        短暫znode的客戶端會話結束時,zookeeper會將該短暫znode刪除,短暫znode不可以有子節點;

        持久znode不依賴于客戶端會話,只有當客戶端明確要刪除該持久znode時才會被刪除;

        Znode有四種形式的目錄節點,PERSISTENT、PERSISTENT_SEQUENTIAL、EPHEMERAL、EPHEMERAL_SEQUENTIAL。



Zookeeper應用場景</span>
         統一命名服務

                分布式環境下,經常需要對應用/服務進行統一命名,便于識別不同服務;

                        類似于域名與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部署</span>
        單機模式

         偽分布式模式(在單機上啟動多個zookeeper實例,模擬分布式)

        分布式模式


Zookeeper API非常簡單</span>

Zookeeper Watcher</span>

        Watcher 在 ZooKeeper 是一個核心功能

                可以監控目錄節點的數據變化以及子目錄的變化;

                一旦狀態發生變化,服務器就會通知所有設置在這個目錄節點上的 Watcher;

        基本特點

                一次設置對應一次觸發

                異步觸發

                順序觸發

        可以設置觀察的操作:exists getChildren getData

        可以觸發觀察的操作:create delete setData


Zookeeper 實例</span>

        更多實例

                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 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!