1. 什麼是zookeeper?
因爲分佈式系統或者說分佈式環境就像是一個公園,裏面可能包含很多tomcat服務,jetty服務,hadoop服務等等,而zookeeper在裏面起到的作用就是協調服務與服務之間的關係類似公園管理者的角色所以叫zookeeper.官方給出的定義是:zookeeper是一個爲了更好的維護分佈式配置信息,命名,分佈式同步,組合服務(同一服務的集羣模式)的一箇中心化的服務。詳情可參見:zookeeper官網
2. zookeeper常用命令
- ls 用來獲取某個目錄下所有的節點
- ls2 與ls不同的是它能夠查看到time,version等信息
- create 創建node,並且初始化值(創建持久有序:create -s, 創建臨時有序: create -e -s)
- get 獲取node的信息
- set 修改node的值
- delete 刪除node(不能級聯刪除)
- quit 退出客戶端
- rmr 自持級聯刪除的命令
3. 節點類型
- PERSISTENT 持久類型一旦創建只能通過手動刪除該節點
- PERSISTENT_SEQUENTIAL 持久有序類型
- EPHEMERAL 臨時類型 客戶端session失效,節點自動刪除 不能有子節點
- EPHEMERAL_SEQUENTIAL 臨時有序類型 session失效,節點自動刪除 不能有子節點
4. zookeeper state structure
- czxid(zxid: zookeeper transaction id) 創建node時的zookeeper事務id
- mzxid 最後一次更新node信息的zookeeper事務id
- pzxid 最後一次更新該node下的child的zookeeper事務id
- ctime 創建時間
- mtime 最後一次更新時間
- version node的更新次數
- cversion 該node下的child更新次數
5.zookeeper watch 機制
客戶端可以在znode上註冊watch,在znode上的state的改變會觸發watch之後清空watch。一旦觸發watch,zookeeper會向client發起通知,所有的在zookeeper上面的read操作都可以註冊watch,包括getData,getChild,exists
- watch 是一種一次性的觸發機制,如果在一個node上已經觸發了watch,則之後該node在發生changes,不會再觸發watch,如果要繼續觸發,需要重新再改node上面註冊watch。
- 通知將發送給通過getData,getChild,exists上watch設置爲true的客戶端上
- 發送給client的通知是有序的