上篇文章 我們已經安裝上了zookeeper,也簡單的體驗了一把,但是如果讓你給別人介紹下zookeeper,可能也是說不出來。本篇文章就參考了網上各位優秀博主的文章,整理出自己更能理解的內容
優秀博文
-
- sunddenly的zookeeper系列
http://www.cnblogs.com/sunddenly/category/620563.html
-
- 程序員小灰zookeeper系列
https://mp.weixin.qq.com/s/Gs4rrF8wwRzF6EvyrF_o4A
簡介
Zookeeper是一種分布式協調服務
之前的工作都是單機部署應用,並沒有接觸過zookeeper,現在 的新公司動不動就集群,什么主從,分布式,渣渣的我聽得一臉蒙蔽,項目中也使用zookeeper進行應用配置以及使用了elasticjob。
應用場景
- 1.分布式鎖(利用Zookeeper的臨時順序節點,可以輕松實現分布式鎖)
- 2.服務注冊和發現
- 3.共享配置和狀態信息
數據模型
Zookeeper的數據模型如同文件系統的目錄。
Zookeeper的數據存儲是基於節點,這種節點叫做Znode。
data:
Znode存儲的數據信息。
ACL:
記錄Znode的訪問權限,即哪些人或哪些IP可以訪問本節點。
stat:
包含Znode的各種元數據,比如事務ID、版本號、時間戳、大小等等。
child:
當前節點的子節點引用
Zookeeper是為讀多寫少的場景所設計。Znode並不是用來存儲大規模業務數據,而是用於存儲少量的狀態和配置信息,每個節點的數據最大不能超過1MB。
Zookeeper的基本操作和事件通知
Zookeeper包含了哪些基本操作呢?這里列舉出比較常用的API:
-
create 創建節點
-
delete 刪除節點
-
exists 判斷節點是否存在
-
getData 獲得一個節點的數據
-
setData 設置一個節點的數據
-
getChildren 獲取節點下的所有子節點
這其中,exists,getData,getChildren屬於讀操作。Zookeeper客戶端在請求讀操作的時候,可以選擇是否設置Watch。
Watch是什么意思呢?
我們可以理解成是注冊在特定Znode上的觸發器。當這個Znode發生改變,也就是調用了create,delete,setData方法的時候,將會觸發Znode上注冊的對應事件,請求Watch的客戶端會接收到異步通知。
具體交互過程如下:
1.客戶端調用getData方法,watch參數是true。服務端接到請求,返回節點數據,並且在對應的哈希表里插入被Watch的Znode路徑,以及Watcher列表。
2.當被Watch的Znode已刪除,服務端會查找哈希表,找到該Znode對應的所有Watcher,異步通知客戶端,並且刪除哈希表中對應的Key-Value。