zookeeper
ZooKeeper是Apache軟體基金會的一個軟體項目,是一個分布式的,開放源碼的分布式應用程式協調服務。它為大型分布式計算提供開源的分布式配置服務、同步服務和命名注冊。
ZooKeeper是一個典型的分布式資料一緻性的解決方案,分布式應用程式可以基于它實作諸如資料釋出/訂閱、負載均衡、命名服務、分布式協調/通知、叢集管理、Master 選舉、分布式 鎖和分布式隊列等功能
資料結構
ZooKeeper資料模型的結構與Unix檔案系統很類似,整體上可以看作是一棵樹,每個節點稱做一個ZNode,每個ZNode都可以通過其路徑唯一辨別
zookeeper提供的名稱空間非常類似于标準檔案系統,key-value 的形式存儲。名稱key由斜線 / 分割的一系列路徑元素,zookeeper名稱空間中的每個節點都是由一個路徑辨別。
znode節點
節點類型
持久化目錄節點(PERSISTENT):用戶端與zookeeper斷開連接配接後,該節點依舊存在
java複制代碼# 預設建立的就是持久節點
create /test
持久化順序編号目錄節點(PERSISTENT_SEQUENTIAL):用戶端與zookeeper斷開連接配接後,該節點依舊存在,Zookeeper會給該節點按照順序編号
java複制代碼# 建立序号節點
create -s /test
# 傳回建立的實際路徑
Created /test0000000001
create -s /test
# 傳回建立的實際路徑2
Created /test0000000002
臨時目錄節點(EPHEMERAL):用戶端與zookeeper斷開連接配接後,該節點被删除
java複制代碼# 建立臨時節點, 斷開會話 在連接配接将會自動删除
create -e /temp
臨時順序編号目錄節點(EPHEMERAL_SEQUENTIAL):用戶端與zookeeper斷開連接配接後,該節點被删除,Zookeeper會給該節點按照順序編号
java複制代碼create -e -s /temp/seq
節點屬性
檢視節點屬性:stat /znode
狀态屬性 | 描述 |
cZxid | 建立節點時的事務ID,每次修改狀态都會産生一個事務ID。事務ID是 ZooKeeper 中所有修改總的次序。 每次修改都有唯一的 zxid,如果 zxid1 小于 zxid2,那麼 zxid1 在 zxid2 之前發生。 |
ctime | 建立節點時的時間 |
mZxid | 最後修改節點時的事務ID |
mtime | 最後修改節點時的時間 |
pZxid | 表示該節點的子節點清單最後一次修改的事務ID,添加子節點或删除子節點就會影響子節點清單,但是修改子節點的資料内容則不影響該ID(注意,隻有子節點清單變更了才會變更pzxid,子節點内容變更不會影響pzxid) |
cversion | 子節點版本号,子節點每次修改版本号加1 |
dataversion | 資料版本号,資料每次修改該版本号加1 |
aclversion | 權限版本号,權限每次修改該版本号加1 |
ephemeralOwner | 建立該臨時節點的會話的sessionID。如果該節點是持久節點,那麼這個屬性值為0 |
dataLength | 該節點的資料長度 |
numChildren | 該節點擁有子節點的數量,隻統計直接子節點的數量 |
節點監聽
客戶添加-w參數可實時監聽節點與子節點的變化,并且實時收到通知。
指令 | 描述 |
ls -w path | 監聽子節點的變化(增,删) |
get -w path | 監聽節點資料的變化 |
stat -w path | 監聽節點屬性的變化 |
printwatches on|off | 觸發監聽後,是否列印監聽事件(預設on) |
用戶端指令行
檢視所有指令
通過zkClient進入zookeeper用戶端指令行,輸入help檢視zookeeper用戶端的指令
java複制代碼localhost:2181 $ help
ZooKeeper -server host:port cmd args
stat path [watch]
set path data [version]
ls path [watch]
delquota [-n|-b] path
ls2 path [watch]
setAcl path acl
setquota -n|-b val path
history
redo cmdno
printwatches on|off
delete path [version]
sync path
listquota path
rmr path
get path [watch]
create [-s] [-e] path data acl
addauth scheme auth
getAcl path
指令說明
檢視某個路徑下目錄清單
java複制代碼ls [-s] [-w] [-R] path
path:代表路徑,完整路徑
-s:傳回狀态資訊
-w:監聽節點變化
-R:遞歸檢視某路徑下目錄清單
建立節點并指派
java複制代碼create [-s] [-e] [-c] [-t ttl] path [data] [acl]
[-s] [-e]:-s 和 -e 都是可選的,-s 代表順序節點, -e 代表臨時節點,注意其中 -s 和 -e 可以同時使用的,并且臨時節點不能再建立子節點
path:指定要建立節點的路徑,比如 /runoob
data:要在此節點存儲的資料
acl:通路權限相關,預設是 world,相當于全世界都能通路
修改節點存儲的資料
java複制代碼set [-s] [-v version] path data
path:節點路徑。
data:需要存儲的資料。
[version]:可選項,版本号(可用作樂觀鎖)
擷取節點資料和狀态資訊
java複制代碼get [-s] [-w] path
-s:傳回結果帶上狀态資訊
-w:傳回資料并對對節點進行事件監聽
檢視節點狀态資訊
java複制代碼stat [-w] path
path:代表路徑
-w:對節點進行事件監聽
删除某節點
java複制代碼delete [-v version] path
deleteall path [-b batch size]
如果某節點不為空,則不能用delete指令删除
檢視節點狀态
java複制代碼stat path [watch]
設定節點的值
java複制代碼set path data [version]
檢視目前znode中所包含的内容
java複制代碼ls path [watch]
檢視目前節點資料并能看到更新次數等資料
java複制代碼ls2 path [watch]
建立節點 -s含有序列 -e臨時
java複制代碼create [-s] [-e] path data acl
獲得節點的值
java複制代碼get path [watch]
删除節點
java複制代碼delete path [version]
遞歸删除節點
java複制代碼rmr path
acl權限設定
ACL全稱為Access Control List(通路控制清單),用于控制資源的通路權限。ZooKeeper使用ACL來控制對其znode的防問。
基于scheme:id:permission的方式進行權限控制。scheme表示授權模式、id模式對應值、permission即具體的增删改權限位。
注意:在使用ACL時,權限僅對目前節點有效,不會讓子節點繼承。
scheme認證模型
方案 | 描述 |
world | 開放模式,world表示全世界都可以通路(這是預設設定) |
ip | ip模式,限定用戶端IP防問 |
auth | 使用者密碼認證模式,隻有在會話中添加了認證才可以防問 |
digest | 與auth類似,差別在于auth用明文密碼,而digest 用sha-1+base64加密後的密碼。在實際使用中digest 更常見。 |
permission權限位
權限位 | 權限 | 描述 |
c | CREATE | 可以建立子節點 |
d | DELETE | 可以删除子節點(僅下一級節點) |
r | READ | 可以讀取節點資料及顯示子節點清單 |
w | WRITE | 可以設定節點資料 |
a | ADMIN | 可以設定節點通路控制清單權限 |
acl相關指令
指令 | 使用方式 | 描述 |
getAcl | getAcl | 讀取ACL權限 |
setAcl | setAcl | 設定ACL權限 |
addauth | addauth | 添加認證使用者 |
ACL使用示例
權限僅對目前節點有效,不會讓子節點繼承。如限制了IP防問A節點,但不妨礙該IP防問A的子節點
world權限
文法: setAcl <path> world:anyone:<權限位>
檢視預設節點權限
java複制代碼# 建立一個節點
$ create -e /test
Created /test
# 檢視節點權限
# 傳回的預設權限表示 ,所有人擁有所有權限
$ getAcl /test
'world,'anyone
: cdrwa
修改預設權限為讀寫
java複制代碼# 設定為rw權限
setAcl /test world:anyone:rw
# 可以正常讀
get /test
# 無法正常建立子節點
create -e /test/t "rw"
# 傳回沒有權限的異常
Authentication is not valid : /test/t
IP權限示例:
文法:setAcl <path> ip:<ip位址|位址段>:<權限位>
auth模式示例: 文法:
setAcl <path> auth:<使用者名>:<密碼>:<權限位>
addauth digest <使用者名>:<密碼>
digest 權限示例:
文法:
setAcl <path> digest :<使用者名>:<密鑰>:<權限位>
addauth digest <使用者名>:<密碼>
java複制代碼# 通過sha1與base64組合加密碼生成密鑰
echo -n <使用者名>:<密碼> | openssl dgst -binary -sha1 | openssl base64
# 先 sha1 加密,然後base64加密
echo -n test:123456 | openssl dgst -binary -sha1 | openssl base64
# 傳回密鑰
PbXQT4DQMDcaYC1X0EY0B2RZCwM=
設定digest 權限
java複制代碼setAcl /test digest:test:PbXQT4DQMDcaYC1X0EY0B2RZCwM=:cdrw
檢視節點将顯示沒有權限
java複制代碼#檢視節點
get /test
# 顯示沒有權限通路
Authentication is not valid : /test
給目前會話添加認證後再檢視
為節點設定digest 權限後,通路前必須執行addauth,目前會話才可以防問。
java複制代碼# 給目前會話添權重限帳戶
addauth digest test:123456
# 再次檢視即可成功檢視
get /test
用戶端工具
ZooInspector
下載下傳位址: https://issues.apache.org/jira/secure/attachment/12436620/ZooInspector.zip
解壓進入ZooInspector\build目錄,執行指令:
makefile複制代碼D:\Development\ZooInspector\build>java -jar zookeeper-dev-ZooInspector.jar
PrettyZoo
下載下傳位址: https://github.com/vran-dev/PrettyZoo