天天看點

zookeeper之znode節點與acl權限設定

作者:馬士兵教育CTO

zookeeper

ZooKeeper是Apache軟體基金會的一個軟體項目,是一個分布式的,開放源碼的分布式應用程式協調服務。它為大型分布式計算提供開源的分布式配置服務、同步服務和命名注冊。
ZooKeeper是一個典型的分布式資料一緻性的解決方案,分布式應用程式可以基于它實作諸如資料釋出/訂閱、負載均衡、命名服務、分布式協調/通知、叢集管理、Master 選舉、分布式 鎖和分布式隊列等功能

資料結構

ZooKeeper資料模型的結構與Unix檔案系統很類似,整體上可以看作是一棵樹,每個節點稱做一個ZNode,每個ZNode都可以通過其路徑唯一辨別
zookeeper之znode節點與acl權限設定
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
           
zookeeper之znode節點與acl權限設定

PrettyZoo

下載下傳位址: https://github.com/vran-dev/PrettyZoo

zookeeper之znode節點與acl權限設定