Zookeeper做爲分佈式應用的分佈式協調服務,提供C語言和Java語言的API調用。其自己,由Java開發,有一些核心概念,咱們須要有很明確的認識,纔可以更好地使用該服務中間件。本次將從如下幾個部分展開:java
Session會話node
Watch算法
數據模型數據庫
如圖所示,ZK是一個C/S架構,包含客戶端、服務端,客戶端鏈接服務端,稱之爲一個會話。express
創建會話的流程、特色以下:服務器
一個客戶端鏈接一個會話,由ZK進行分配惟一的會話idmarkdown
客戶端以特定的時間間隔發送心跳以保持會話有效性,經過參數tickTime來設定session
超過會話超時時間未收到客戶端心跳,服務端則斷定,該客戶端失效,已掛掉;架構
minSessionTimeout 會話的最小超時時間,(默認爲2倍的tickTime)分佈式
maxSessionTimeout 會話的最大超時時間,(默認爲20倍的tickTime)
會話中的請求按照FIFO順序執行,相似於隊列
ZK做爲分佈式協調服務,同時也是個集中存儲服務,數據存儲在內容中,具備高性能、低延時特色,依賴於自己的數據模型。
區別:節點能夠包含與之關聯的數據以及子節點(在文件系統看來,既是文件也是文件夾)
節點的路徑老是表示爲規範的、絕對的、斜槓分隔的路徑
如圖所示,每一個節點,均可以設置對應的值
其中,每一個節點,稱之爲znode。
名稱惟一,命名規範
節點類型:持久、順序、臨時、臨時順序
節點數據構成
節點名稱除下列限制外,可使用任何unicode字符
null字符(\u0000)不能做爲路徑名的一部分
如下字符不能使用,由於不能很友好的顯式,\u0001 - \u0019 和\u007F - \u009F
不容許使用如下字符:\ud800 - uf8fff,\uFFF0 - \uFFFF
"."字符能夠用做另外一個名稱的一部分,可是「.」 和 ".." 不能單獨用於指示路徑上的節點,zookeeper不適用相對路徑,都是絕對路徑的節點例如:「/a/b/./c」 "c/a/b/../" 都是無效的節點命名
zookeeper有一個保留節點 「zookeeper」
節點包含四種節點類型
持久節點
create /test1 test
複製代碼
臨時節點
create -e /test1 /abd abds
複製代碼
順序節點
create -s /test1/abc 908
複製代碼
臨時順序節點
create -e -s /test1/abd/ 90
複製代碼
其中,順序節點,爲10位的十進制序號,每一個父節點都攜帶一個計數器,zk是由java開發,計數器是帶符號的int(4字節),數值到2147483647,以後將發生溢出,致使名稱「 -2147483648」
如圖所示,完成四種節點類型節點的建立,能夠看到順序節點的十進制序號
同時,臨時節點,有效範圍在當前會話有效期內,關閉當前會話,從新開一個客戶端
圖示內,能夠看到當前sessionid 0x100002011b80003
再次查看節點,便可發現臨時節點 c 、f0000000005 都已經不存在。臨時節點在協調服務中應用普遍。
節點數據:存儲的協調數據(狀態信息、配置、位置信息等)
節點元數據(stat結構)
數據量上限:1M
zk爲分佈式協調服務,非存儲型數據庫,僅用來用於分佈式協調,所以數據量小,保證高性能。
在zk客戶端,可使用stat命令,查看節點元數據。包括如下數據:
Stat結構字段 | 描述 |
---|---|
cZxid | 建立該節點的zxid(事務id) |
mZxid | 最後修改該節點的zxid |
pZxid | 當前節點最後更新的子節點zxid |
ctime | 節點建立時間 |
mtime | 節點最後修改時間 |
dataVersion | 節點數據修改次數 |
cversion | 節點子節點變動次數 |
dataLength | 節點數據長度 |
numChildren | 節點子節點數 |
ephemeralOwner | 節點爲臨時節點,全部者會話id,若是不是臨時節點,值爲0 |
aclVersion | 節點訪問控制列表變動次數 |
客戶端提供下面命令,可使用訪問控制功能
create [-s] [-e] [-c] [-t ttl] path [data] [acl]
setAcl [-s] [-v version] [-R] path acl
getAcl [-s] path
提供設置格式爲 (scheme:expression, perms)
schemes包括
world 任何客戶端均可以訪問.
auth 擁有受權的客戶端.
digest 使用username:base64 encoded SHA1 password digest.
ip ip:127.0.0.1,read
x509
perms包括
CREATE: 可建立子節點
READ: 可獲取節點數據以及子節點列表.
WRITE: 設置節點數據
DELETE: 刪除子節點
ADMIN: 設置權限
zk採用多種方式,來追蹤時間。
Zxid Zookeeper中的每次更改操做都會對應一個惟一的事務id,稱爲Zxid,是一個全局有序的時間戳標記。
Version numbers版本號,每一個節點的更改操做,都會版本號增長
Ticks 當使用zk集羣時,服務端,採用「滴答」tick,來定義事件的時間,如狀態上傳、會話超時、對等點之間的鏈接超時等。ticktime僅經過最小會話超時時間間接公開(默認爲2倍ticktime)若是客戶端請求的設置會話超時,小於服務端設置最小會話超時,服務端會通知客戶端會話超時實際超時時間,即會採用服務端的配置時間,且把結果告知客戶端。若是客戶端設置會話超時,大於服務端配置,則使用客戶端設置。
Real time Zookeeper除了在znode建立和修改時間時將時間戳放入stat結構以外,其餘不使用real time或者時鐘時間
客戶端,能夠經過在znode上設置watch,實現實時監聽znode的變化
data watch 監聽數據變動
child watch 監聽子節點變化
首先,對節點添加watch監聽,而後對節點數據更改,全部客戶端,會觸發watch時間,監聽到變化。
addWatch [-m mode] path # optional mode is one of [PERSISTENT, PERSISTENT_RECURSIVE] - default is PERSISTENT_RECURSIVE
Zookeeper在3.6.0版本後,經過addWatch方法,增長watch能夠設置watch監聽模式,默認爲PERSISTENT_RECURSIVE,持久遞歸,能夠觸發屢次
順序一致性: 保證客戶端操做是按照順序生效的
原子性: 更新成功或失敗,沒有部分結果
單個系統映像:不管鏈接到哪一個集羣中服務器,客戶端都能看到相同的內容
可靠性: 數據的變動不會丟失,除非被客戶端覆蓋修改
zk發生數據更改時,先進行事務記錄,會在集羣中進行一致性算法處理,最終實現一致性,實現可靠
及時性: 保證系統的客戶端當時讀取的數據是最新的