理解 zookeeper
Zookeeper 主要用來解決分佈式應用中經常遇到的一些數據管理,如統一命名服務器、狀態同步服務、集羣管理、分佈式應用配置項的管理。
節點特性
- 同一時刻多臺機器創建同一個節點,只有一個會爭搶成功。利用這個特性可以做分佈式鎖。
- 臨時節點的生命週期與會話一致,會話關閉則臨時節點刪除。利用這個特性經常來做心跳,動態監控,負載等動作。
- 順序節點保證節點名全局唯一。這個特性可以用來生成分佈式環境下的全局自增長id。
zookeeper 提供的服務
- 創建節點
- 刪除節點
- 更新節點
- 獲取節點信息
- 權限控制
- 事件監聽
Zookeeper的集羣對server進行了歸類:
- Leader
- Follower
- Observer
Zookeeper 作用(使用場景)
- 配置中心 -- Zookeeper 的目錄結構比較特殊,可以這個特性作爲分佈式的配置中心,當配置內容發生更新可以及時通知各服務器進行更新
- 集羣選舉 -- 當某一個服務宕機或者整個服務重啓,可根據Zookeeper節點的順序一致性來選擇最大節點或者最小節點作爲leader
- 分佈式鎖 -- 原理同集羣選舉,根據節點的順序一致性來選擇最小節點對應的那個服務獲得鎖,當服務執行完成刪除節點就會釋放鎖,再由其他服務去爭取鎖。
- 註冊中心 -- Zookeeper的目錄以及子節點。主要通過對節點的管理做到發佈以及事件監聽做到訂閱。
- 隊列管理
- 同步隊列
當一個隊列的隊員都聚齊時,隊列纔可用,否則一直等待所有的成員到達,這種是同步隊列
創建一個父目錄/synchronizing
,每個成員都監控標誌(Set Watch)位目錄/synchronizing/start
是否存在,然後每個成員都加入這個隊列,加入隊列的方式就是創建/synchronizing/member_i
的臨時目錄節點,然後每個成員獲取、synchronizing
目錄的所有目錄節點,也就是 member_i,判斷 i 的值是否已經是成員的目錄,如果小於成員個數就等待synchronizing/start
的出現,如果相等就創建synchronizing/start
- 異步隊列 隊列按照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的變化以事件的形式通知給客戶端,主要是一種方向推送的機制,讓客戶端可以做出及時響應。比如及時更新後端的可用集羣服務列表。
參考網站
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 一致性