ZooKeeper是一種爲分佈式應用所設計的高可用、高性能且一致的開源協調服務,它提供了一項基本服務:分佈式鎖服務。因爲ZooKeeper的開源特性,後來咱們的開發者在分佈式鎖的基礎上,摸索了出了其餘的使用方法:配置維護、組服務、分佈式消息隊列、分佈式通知/協調等。node
簡單的數據結構:共享的數型結構,相似文件系統,存儲於內存。linux
能夠構建集羣:避免單點故障,3-5臺機器就能夠組成集羣,超過半數正常工做就能提供服務。apache
順序訪問:對於每一個讀請求,zk會分配一個全局惟一的遞增編號,利用這個特性能夠實現高級協調服務。bash
高性能:基於內存操做,服務於非事物請求,適用於讀操做爲主的業務場景。服務器
可去官網下載一個穩定的版本,而後進行安裝:www.apache.org/dyn/closer.…網絡
解壓後在zookeeper的conf目錄下建立配置文件zoo.cfg,裏面的配置信息可參考統計目錄下的zoo_sample.cfg文件,咱們這裏配置爲:數據結構
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/opt/zookeeper-data/
clientPort=2181
複製代碼
tickTime:指定了ZooKeeper的基本時間單位(以毫秒爲單位);異步
initLimit:指定了啓動zookeeper時,zookeeper實例中的隨從實例同步到領導實例的初始化鏈接時間限制,超出時間限制則鏈接失敗(以tickTime爲時間單位);分佈式
syncLimit:指定了zookeeper正常運行時,主從節點之間同步數據的時間限制,若超過這個時間限制,那麼隨從實例將會被丟棄;工具
dataDir:zookeeper存放數據的目錄;
clientPort:用於鏈接客戶端的端口。
在配置完響應的配置後,進入到bin目錄下能夠直接經過 bin 目錄下的zkServer.sh腳本執行相應的操做:
1. 啓動zk服務sh zkServer.sh start 或者./zkServer.sh start.
2. 查看zk服務狀態sh zkServer.sh status
3. 中止當前zk服務sh zkServer.sh stop
4. 重啓服務sh zkServer.sh restart
複製代碼
客戶端可使用./zkClient.sh -server 127.0.0.1:2181鏈接到當前zookeeper服務器。客戶端命令行工具的一些簡單操做以下:
1.ls:獲取路徑下的節點信息,注意此路徑爲絕對路徑,相似於linux的ls命令。如ls /zookeeper;
2.create:建立節點,其中-s爲順序充點,-e臨時節點。如create /zookeeper/node1"test_create";
3.get:獲取節點信息,注意節點的路徑皆爲絕對路徑,也就是說必要要從/(根路徑)開始。如get /;
4.set:設置節點的數據。如set /zookeeper "hello world";
5.delete:刪除節點,不能遞歸刪除,若是存在子節點則刪除失敗。
6.rmr:遞歸刪除
7.quit:退出客戶端
8.help:幫助命令
....
複製代碼
zookeeper的師徒結構和標準的Unix文件系統相似,每一個節點稱爲「數據節點」或Znode,每一個Znode能夠存儲數據同時能夠掛載子節點,所以能夠稱之爲「樹」。
特性:1.在Zookeeper中,znode是一個跟Unix文件系統路徑類似的節點,能夠往這個節點存儲或獲取數據
2.經過客戶端可對znode進行增刪改查的操做,還能夠註冊watcher監控znode的變化。
Znode
1.Znode是Zookeeper中數據的最小單元,每一個Znode上均可以保存數據,同時還能夠掛載子節點,znode之間的層級關係就像文件系統的目錄結構同樣,zookeeper將所有的數據存儲在內存中以此來提升服務器吞吐量、減小延遲的目的。
2.Znode有三種類型,Znode的類型在建立時肯定而且不能修改。
臨時(EPHEMERAL):在建立臨時Znode的客戶端會話結束時,服務器會將臨時節點刪除。臨時節點不能有子節點(即便是臨時子節點)。雖然每一個臨時Znode都會綁定一個特定的客戶端會話,可是它們對全部客戶端都是可見的
持久(PERSISTENT):節點一旦被建立,會一直存在與服務器上,Zookeeper規定全部非葉子節點必須是持久化節點
順序(SEQUENTIAL):若是在建立Znode時設置了順序標識,那麼該Znode名稱以後便會附加一個值,這個值由一個單調遞增的計數器(由父節點維護)所添加
3.臨時節點在兩種狀況下會被刪除
當建立Znode的客戶端的會話因超時或者主動關閉而終止時(不是TCP鏈接斷開) 當某個客戶端(不必定是臨時Znode的建立者)主動刪除該節點時
4.每一個數據節點除了存儲數據內容以外,還存儲了數據節點自己的一些狀態信息。Znode的狀態(Stat)信息
序號 | 屬性 | 結數據構 | 描述 |
1 | czxid | long | 節點被建立的Zxid值 |
2 | mzxid | long | 節點被修改的Zxid值 |
3 | pzxid | long | 子節點最有一次被修改時的事務ID |
4 | ctime | long | 節點被建立的時間 |
5 | mtime | long | 節點最後一次被修改的時間 |
6 | versoin | long | 節點被修改的版本號 |
7 | cversion | long | 節點的所擁有子節點被修改的版本號 |
8 | aversion | long | 節點的ACL被修改的版本號 |
9 | emphemeralOwner | long | 若是此節點爲臨時節點,那麼它的值爲這個節點 擁有者的會話ID;不然,它的值爲0 |
10 | dataLength | int | 節點數據域的長度 |
11 | numChildren | int | 節點擁有的子節點個數 |
對於持久節點和臨時節點,同一個znode下,節點的名稱是惟一的! —— 實現分佈式鎖的基礎
客戶端能夠在znode上設置watcher,監聽znode的變化。Znode發生變化(Znode自己的增長,刪除,修改,以及子Znode的變化)能夠經過Watch機制通知到客戶端。
·兩類watch
1.dara watch監聽數據變動
2.child watch監聽子節點變化
·觸發事件
Created event:
Enabled with a call to exists.
Deleted event:
Enabled with a call to exists, getData, and getChildren.
Changed event:
Enabled with a call to exists and getData.
Child event:
Enabled with a call to getChildren.
複製代碼
·特性
1.一次性觸發。 客戶端在Znode設置了Watch時,若是Znode內容發生改變,那麼客戶端就會得到Watch事件。例如:客戶端設置getData("/znode1", true)後,若是/znode1發生改變或者刪除,那麼客戶端就會獲得一個/znode1的Watch事件,可是/znode1再次發生變化,那客戶端是沒法收到Watch事件的,除非客戶端設置了新的Watch。
2.有序性。Watch事件是異步發送到Client。Zookeeper能夠保證客戶端發送過去的更新順序是有序的。例如:某個Znode沒有設置watcher,那麼客戶端對這個Znode設置Watcher發送到集羣以前,該客戶端是感知不到該Znode任何的改變狀況的。換個角度來解釋:因爲Watch有一次性觸發的特色,因此在服務器端沒有Watcher的狀況下,Znode的任何變動就不會通知到客戶端。不過,即便某個Znode設置了Watcher,且在Znode有變化的狀況下通知到了客戶端,可是在客戶端接收到這個變化事件,可是尚未再次設置Watcher以前,若是其餘客戶端對該Znode作了修改,這種狀況下,Znode第二次的變化客戶端是沒法收到通知的。這多是因爲網絡延遲或者是其餘因素致使,因此咱們使用Zookeeper不能指望可以監控到節點每次的變化。Zookeeper只能保證最終的一致性,而沒法保證強一致性。