理解 zookeeper

理解 zookeeper

Zookeeper 主要用來解決分佈式應用中經常遇到的一些數據管理,如統一命名服務器、狀態同步服務、集羣管理、分佈式應用配置項的管理。

節點特性

  1. 同一時刻多臺機器創建同一個節點,只有一個會爭搶成功。利用這個特性可以做分佈式鎖。
  2. 臨時節點的生命週期與會話一致,會話關閉則臨時節點刪除。利用這個特性經常來做心跳,動態監控,負載等動作。
  3. 順序節點保證節點名全局唯一。這個特性可以用來生成分佈式環境下的全局自增長id。

zookeeper 提供的服務

  1. 創建節點
  2. 刪除節點
  3. 更新節點
  4. 獲取節點信息
  5. 權限控制
  6. 事件監聽

Zookeeper的集羣對server進行了歸類:

  • Leader
  • Follower
  • Observer

Zookeeper 作用(使用場景)

  1. 配置中心 -- Zookeeper 的目錄結構比較特殊,可以這個特性作爲分佈式的配置中心,當配置內容發生更新可以及時通知各服務器進行更新
  2. 集羣選舉 -- 當某一個服務宕機或者整個服務重啓,可根據Zookeeper節點的順序一致性來選擇最大節點或者最小節點作爲leader
  3. 分佈式鎖 -- 原理同集羣選舉,根據節點的順序一致性來選擇最小節點對應的那個服務獲得鎖,當服務執行完成刪除節點就會釋放鎖,再由其他服務去爭取鎖。
  4. 註冊中心 -- Zookeeper的目錄以及子節點。主要通過對節點的管理做到發佈以及事件監聽做到訂閱。
  5. 隊列管理
    1. 同步隊列 當一個隊列的隊員都聚齊時,隊列纔可用,否則一直等待所有的成員到達,這種是同步隊列
      創建一個父目錄 /synchronizing ,每個成員都監控標誌(Set Watch)位目錄 /synchronizing/start 是否存在,然後每個成員都加入這個隊列,加入隊列的方式就是創建 /synchronizing/member_i 的臨時目錄節點,然後每個成員獲取 、synchronizing 目錄的所有目錄節點,也就是 member_i,判斷 i 的值是否已經是成員的目錄,如果小於成員個數就等待 synchronizing/start 的出現,如果相等就創建synchronizing/start
    2. 異步隊列 隊列按照FIFO方式進行入隊和出隊操作,例如實現生產者和消費者模型。
      保證所有成員加入隊列時都是有編號的,出隊是通過getChildren() 方法可以返回當前所有的隊列元素,然後消費其中最小的元素。

Zookeeper 在分佈式中的作用:

使用Zookeeper提供分佈式鎖機制,從而實現分佈式的一致性處理。

  • Barrier
  • Queue
  • Lock
  • 2PC

Java Api 接口

String create(String path, byte data[], List<ACL> acl, CreateMode createMode)
void   create(String path, byte data[], List<ACL> acl, CreateMode createMode, StringCallback cb, Object ctx)

void delete(String path, int version)
void delete(String path, int version, VoidCallback cb, Object ctx)

Stat setData(String path, byte data[], int version)
void setData(String path, byte data[], int version, StatCallback cb, Object ctx)

Stat setACL(String path, List<ACL> acl, int version)
void setACL(String path, List<ACL> acl, int version, StatCallback cb, Object ctx)

Stat exists(String path, Watcher watcher)
Stat exists(String path, boolean watch)
void exists(String path, Watcher watcher, StatCallback cb, Object ctx)
void exists(String path, boolean watch  , StatCallback cb, Object ctx)

byte[] getData(String path, Watcher watcher, Stat stat)
byte[] getData(String path, boolean watch  , Stat stat)
void   getData(String path, Watcher watcher, DataCallback cb, Object ctx)
void   getData(String path, boolean watch  , DataCallback cb, Object ctx)

List<String> getChildren(String path, Watcher watcher)
List<String> getChildren(String path, boolean watch  )
void  getChildren(String path, Watcher watcher, ChildrenCallback cb, Object ctx)
void  getChildren(String path, boolean watch  , ChildrenCallback cb, Object ctx)

List<String> getChildren(String path, Watcher watcher, Stat stat)
List<String> getChildren(String path, boolean watch  , Stat stat)
void getChildren(String path, Watcher watcher, Children2Callback cb, Object ctx)
void getChildren(String path, boolean watch  , Children2Callback cb, Object ctx)

接口說明

  • 每一種安同步還是異步
  • 添加指定watcher還是默認watcher分爲4中。默認watcher在Zookeeper 初始化中進行指定。
  • 如果包含boolean watch 的讀方法傳入true,則將默認爲watcher註冊爲所關注事件的watch。如果傳入false則不註冊watch。

CreateMode

  • PERSISTENT 持續的。相比與EPHEMERAL,不會隨着client session的close或者expire而消失
  • PERSISTENT_SEQUENTIAL
  • EPHEMERAL 短暫的,生命週期依賴於client session、對應session close/expire 後其znode也會消失。
  • EPHEMERAL_SEQUENTIAL SEQUENTIAL意爲順序的。

Zookeeper 爲了解決數據的一致性,使用Watcher的異步回調接口,將服務器znode的變化以事件的形式通知給客戶端,主要是一種方向推送的機制,讓客戶端可以做出及時響應。比如及時更新後端的可用集羣服務列表。

參考網站

Zookeeper Api(java)入門與應用(轉)

保證分佈式系統數據一致性的6種方案

解決分佈式系統的一致性問題,我們需要了解哪些理論

分佈式系統的事務處理

ZooKeeper典型應用場景一覽

zookeeper中的基本概念

Watcher/Callback 參考網站

http://luzengyi.blog.163.com/blog/static/529188201064113744373/ http://luzengyi.blog.163.com/blog/static/529188201061155444869/

ACL

http://rdc.taobao.com/team/jm/archives/947

集羣管理

paxos 實現 paxos算法介紹續 zookeeper代碼解析

Zookeeper 官方文檔

http://zookeeper.apache.org/doc/r3.3.2/recipes.html

TODO

Zookeeper 一致性

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章