Zookeeper 概述及應用場景

1、概述

        分佈式協調技術,主要用來解決分佈式環境當中多個進程之間的同步控制,讓他們有序的去訪問某種臨界資源,防止形成"髒數據"的後果。
        ZooKeeper是一個分佈式的,開放源碼的分佈式應用程序協調服務,是Google的Chubby一個開源的實現,是Hadoop和Hbase的重要組件。它是一個爲分佈式應用提供一致性服務的軟件,提供的功能包括:配置維護、域名服務、分佈式同步、組服務等。它提供了一項基本服務:分佈式鎖服務。
        ZooKeeper是以Fast Paxos算法爲基礎的,Paxos 算法存在活鎖的問題,即當有多個proposer交錯提交時,有可能互相排斥致使沒有一個proposer能提交成功,而Fast Paxos做了一些優化,經過選舉產生一個leader (領導者),只有leader才能提交proposer。node


        在Zookeeper中,znode是一個跟Unix文件系統路徑類似的節點,能夠往這個節點存儲或獲取數據。若是在建立znode時Flag設置爲EPHEMERAL,那麼當建立這個znode的節點和Zookeeper失去鏈接後,這個znode將再也不存在在Zookeeper裏,Zookeeper使用Watcher察覺事件信息。當客戶端接收到事件信息,好比鏈接超時、節點數據改變、子節點改變,能夠調用相應的行爲來處理數據。
        ZooKeeper所提供的服務主要是經過:數據結構+原語+watcher機制,三個部分來實現的。算法

數據模型znode

        ZooKeeper的數據模型,在結構上和標準文件系統的很是類似,都是採用這種樹形層次結構,ZooKeeper樹中的每一個節點被稱爲—Znode。和文件系統的目錄樹同樣,ZooKeeper樹中的每一個節點能夠擁有子節點。
        經過路徑引用,且要求時絕對路徑。數據庫

原語

        zookeeper有9個基本的操做,這些操做時有限制的,同時操做時非阻塞的。網絡

Watch觸發器

        ZooKeeper能夠爲全部的讀操做設置watch數據結構

ZooKeeper所管理的watch能夠分爲兩類

        數據watch(data  watches):getData和exists負責設置數據watch
        孩子watch(child watches):getChildren負責設置孩子watch分佈式

ZooKeeper提供分佈式鎖應用實例

        傳統的準備方案,實現方式是,備用節點向主節點發ping,主節點收到ping後給回覆ACK消息,若是備用節點收不到ACK消息則認爲主節點掛掉,啓動備節點的上的實例,接替成爲主節點,但若是是網絡不可靠致使的ACK消息無法正常收到則會產生雙主的問題,致使服務混亂。
引入Zookeeper後,啓動的主節點A,B會向zk註冊,再進行選舉出主節點,其餘的則成爲被阻塞的備用節點,若是主節點掛掉,則會自動刪掉其在zk中的註冊節點,zk感知節點變化,再次選舉新的leader做爲主節點。若是有新節點註冊,仍是經過選舉leader的方式確保只有一個主節點。oop

2、ZooKeeper 典型的應用場景

        Zoopkeeper 提供了一套很好的分佈式集羣管理的機制,就是它這種基於層次型的目錄樹的數據結構,並對樹中的節點進行有效管理,從而能夠設計出多種多樣的分佈式的數據管理模型優化

統一命名服務(Name Service)

        分佈式應用中,一般須要有一套完整的命名規則,既可以產生惟一的名稱又便於人識別和記住,一般狀況下用樹形的名稱結構是一個理想的選擇,樹形的名稱結構是一 個有層次的目錄結構,既對人友好又不會重複。說到這裏你可能想到了 JNDI,沒錯 Zookeeper 的 Name Service 與 JNDI 可以完成的功能是差很少的,它們都是將有層次的目錄結構關聯到必定資源上,可是 Zookeeper 的 Name Service 更加是普遍意義上的關聯,也許你並不須要將名稱關聯到特定資源上,你可能只須要一個不會重複名稱,就像數據庫中產生一個惟一的數字主鍵同樣。spa

配置管理(Configuration Management)

        配置的管理在分佈式應用環境中很常見,例如同一個應用系統須要多臺 PC Server 運行,可是它們運行的應用系統的某些配置項是相同的,若是要修改這些相同的配置項,那麼就必須同時修改每臺運行這個應用系統的 PC Server,這樣很是麻煩並且容易出錯。像 這樣的配置信息徹底能夠交給 Zookeeper 來管理,將配置信息保存在 Zookeeper 的某個目錄節點中,而後將全部須要修改的應用機器監控配置信息的狀態,一旦配置信息發生變化,每臺應用機器就會收到 Zookeeper 的通知,而後從 Zookeeper 獲取新的配置信息應用到系統中。設計

集羣管理(Group Membership)

        Zookeeper 不只可以幫你維護當前的集羣中機器的服務狀態,並且可以幫你選出一個「總管」,讓這個總管來管理集羣,這就是 Zookeeper 的另外一個功能 Leader Election。

共享鎖(Locks)

        Zookeeper 卻很容易實現這個功能,實現方式也是須要得到鎖的 Server 建立一個 EPHEMERAL_SEQUENTIAL 目錄節點,而後調用 getChildren方法獲取當前的目錄節點列表中最小的目錄節點是否是就是本身建立的目錄節點,若是正是本身建立的,那麼它就得到了這個鎖,若是不是那麼它就調用 exists(String path, boolean watch) 方法並監控 Zookeeper 上目錄節點列表的變化,一直到本身建立的節點是列表中最小編號的目錄節點,從而得到鎖,釋放鎖很簡單,只要刪除前面它本身所建立的目錄節點就好了。

隊列管理

相關文章
相關標籤/搜索