zookeeper是乙個高可用的分布式資料管理與系統協調框架。基於對paxos演算法的實現,使該框架保證了分布式環境中資料的強一致性,也正是基於這樣的特性,使得zookeeper能夠應用於很多場景。網上對zk的使用場景也有不少介紹,本文將結合作者身邊的專案例子,系統的對zk的使用場景進行歸類介紹。 值得注意的是,zk並不是生來就為這些場景設計,都是後來眾多開發者根據框架的特性,摸索出來的典型使用方法。因此,也非常歡迎你分享你在zk使用上的奇技淫巧。
場景類別典型場景描述(zk特性,使用方法)應用中的具體使用
資料發布與訂閱
發布與訂閱即所謂的配置管理,顧名思義就是將資料發布到zk節點上,供訂閱者動態獲取資料,實現配置資訊的集中式管理和動態更新。例如全域性的配置資訊,位址列表等就非常適合使用。
1. 索引資訊和集群中機器節點狀態存放在zk的一些指定節點,供各個客戶端訂閱使用。2. 系統日誌(經過處理後的)儲存,這些日誌通常2-3天後被清除。3. 應用中用到的一些配置資訊集中管理,在應用啟動的時候主動來獲取一次,並且在節點上註冊乙個watcher,以後每次配置有更新,實時通知到應用,獲取最新配置資訊。 4. 業務邏輯中需要用到的一些全域性變數,比如一些訊息中介軟體的訊息佇列通常有個offset,這個offset存放在zk上,這樣集群中每個傳送者都能知道當前的傳送進度。 5. 系統中有些資訊需要動態獲取,並且還會存在人工手動去修改這個資訊。以前通常是暴露出介面,例如jmx介面,有了zk後,只要將這些資訊存放到zk節點上即可。
name service
這個主要是作為分布式命名服務,通過呼叫zk的create node api,能夠很容易建立乙個全域性唯一的path,這個path就可以作為乙個名稱。
分布通知/協調
zookeeper中特有watcher註冊與非同步通知機制,能夠很好的實現分布式環境下不同系統之間的通知與協調,實現對資料變更的實時處理。使用方法通常是不同系統都對zk上同乙個znode進行註冊,監聽znode的變化(包括znode本身內容及子節點的),其中乙個系統update了znode,那麼另乙個系統能夠收到通知,並作出相應處理。
1. 另一種心跳檢測機制:檢測系統和被檢測系統之間並不直接關聯起來,而是通過zk上某個節點關聯,大大減少系統耦合。2. 另一種系統排程模式:某系統有控制台和推送系統兩部分組成,控制台的職責是控制推送系統進行相應的推送工作。管理人員在控制台作的一些操作,實際上是修改了zk上某些節點的狀態,而zk就把這些變化通知給他們註冊watcher的客戶端,即推送系統,於是,作出相應的推送任務。3. 另一種工作匯報模式:一些類似於任務分發系統,子任務啟動後,到zk來註冊乙個臨時節點,並且定時將自己的進度進行匯報(將進度寫回這個臨時節點),這樣任務管理者就能夠實時知道任務進度。 總之,使用zookeeper來進行分布式通知和協調能夠大大降低系統之間的耦合。
分布式鎖分布式鎖,這個主要得益於zookeeper為我們保證了資料的強一致性,即使用者只要完全相信每時每刻,zk集群中任意節點(乙個zk server)上的相同znode的資料是一定是相同的。鎖服務可以分為兩類,乙個是保持獨佔,另乙個是控制時序。所謂保持獨佔,就是所有試圖來獲取這個鎖的客戶端,最終只有乙個可以成功獲得這把鎖。通常的做法是把zk上的乙個znode看作是一把鎖,通過create znode的方式來實現。所有客戶端都去建立 /distribute_lock 節點,最終成功建立的那個客戶端也即擁有了這把鎖。 控制時序,就是所有檢視來獲取這個鎖的客戶端,最終都是會被安排執行,只是有個全域性時序了。做法和上面基本類似,只是這裡 /distribute_lock 已經預先存在,客戶端在它下面建立臨時有序節點(這個可以通過節點的屬性控制:createmode.ephemeral_sequential來指定)。zk的父節點(/distribute_lock)維持乙份sequence,保證子節點建立的時序性,從而也形成了每個客戶端的全域性時序。
集群管理
分布式佇列
佇列方面,我目前感覺有兩種,一種是常規的先進先出佇列,另一種是要等到佇列成員聚齊之後的才統一按序執行。對於第二種先進先出佇列,和分布式鎖服務中的控制時序場景基本原理一致,這裡不再贅述。第二種佇列其實是在fifo佇列的基礎上作了乙個增強。通常可以在 /queue 這個znode下預先建立乙個/queue/num 節點,並且賦值為n(或者直接給/queue賦值n),表示佇列大小,之後每次有佇列成員加入後,就判斷下是否已經到達佇列大小,決定是否可以開始執行了。這種用法的典型場景是,分布式環境中,乙個大任務task a,需要在很多子任務完成(或條件就緒)情況下才能進行。這個時候,凡是其中乙個子任務完成(就緒),那麼就去 /tasklist 下建立自己的臨時時序節點(createmode.ephemeral_sequential),當 /tasklist 發現自己下面的子節點滿足指定個數,就可以進行下一步按序進行處理了。
ZooKeeper典型使用場景
zookeeper是乙個高可用的分布式資料管理與系統協調框架。基於對paxos演算法的實現,使該框架保證了分布式環境中資料的強一致性,也正是 基於這樣的特性,使得zookeeper能夠應用於很多場景。網上對zk的使用場景也有不少介紹,本文將結合作者身邊的專案例子,系統的對zk的使用場景 進行歸類介紹...
ZooKeeper典型應用場景
zookeeper 是乙個開源的高可用的分布式資料管理與系統協調框架,基於對 paxos 演算法的實現,保證了分布式環境中資料的強一致性。發布與訂閱模型 發布者發布資料到 zk 節點上,供訂閱者動態獲取資料。在資料量很少,但是資料更新快的場景下 訊息中介軟體中的發布者和訂閱者的負載均衡,linked...
ZooKeeper典型使用場景一覽
zookeeper是乙個高可用的分布式資料管理與系統協調框架。基於對paxos演算法的實現,使該框架保證了分布式環境中資料的強一致性,也正是基於這樣的特性,使得zookeeper能夠應用於很多場景。網上對zk的使用場景也有不少介紹,本文將結合作者身邊的專案例子,系統的對zk的使用場景進行歸類介紹。值...