本文講解了zk的節點類型、zk的常用命令包含acl權限方面的。
Zookeeper節點類型
1、Znode 有兩種類型:
臨時(ephemeral)(create -e /app1/test1 “test1” 客戶端斷開連接, zk 將刪除 ephemeral 類型節點)
持久(persistent) (create -s /app1/test2 “test2” 客戶端斷開連接 zk 不刪除 persistent 類型節點)
2、Znode 有四種形式的目錄節點(默認是 persistent )
PERSISTENT持久、PERSISTENT_SEQUENTIAL(持久序列/test20000000001 )、EPHEMERAL臨時、EPHEMERAL_SEQUENTIAL臨時序列
3、創建 znode 時設置順序標識,znode 名稱後會附加一個值,順序號是一個單調遞增的計數器,由父節點維護
4、在分佈式系統中,順序號可以被用於為所有的事件進行全局排序,這樣客戶端可以通過順序號推斷事件的順序
注:app1節點必須是持久節點,臨時節點無法創建子節點,臨時節點創建子節點會報:<strong>Ephemerals cannot have children: /app1/test1
Zookeeper 節點狀態屬性
服務端常用命令
啟動 ZK 服務: sh bin/zkServer.sh start
查看 ZK 服務狀態: sh bin/zkServer.sh status
停止 ZK 服務: sh bin/zkServer.sh stop
重啟 ZK 服務: sh bin/zkServer.sh restar
客戶端常用命令
使用 zkCli.sh -server 127.0.0.1:2181 連接到 ZooKeeper 服務,連接成功後,系統會輸出 ZooKeeper 的相關環境以及配置信息。 命令行工具的一些簡單操作如下:
顯示根目錄下、文件: ls / 使用 ls 命令來查看當前 ZooKeeper 中所包含的內容
顯示根目錄下、文件: ls2 / 查看當前節點數據並能看到更新次數等數據
創建文件,並設置初始內容: create /zk "test" 創建一個新的 znode 節點“ zk ”以及與它關聯的字符串 [-e] [-s] 【-e 臨時節點】 【-s 順序節點】
獲取文件內容:get /zk 確認 znode 是否包含我們所創建的字符串 [watch] 【watch 監聽】
修改文件內容: set /zk "zkbak" 對 zk 所關聯的字符串進行設置
刪除文件: delete /zk 將剛才創建的 znode 刪除,如果存在子節點刪除失敗
遞歸刪除:rmr /zk 或者 deleteall /zk將剛才創建的 znode 刪除,子節點同時刪除,推薦使用deleteall
退出客戶端: quit
幫助命令: help
ACL保障數據的安全(先了解本篇不做重點講)
ACL 機制,表示為 scheme:id:permissions,第一個字段表示採用哪一種機制,第二個 id 表示用戶,permissions 表示相關權限(如只讀,讀寫,管理等)。
zookeeper 提供瞭如下幾種機制(scheme):
world: 它下面只有一個 id, 叫 anyone, world:anyone 代表任何人,zookeeper 中對所有人有權限的結點就是屬於 world:anyone 的
auth: 它不需要 id, 只要是通過 authentication 的 user 都有權限(zookeeper 支持通過 kerberos來進行 authencation, 也支持 username/password 形式的 authentication)
digest: 它對應的 id 為 username:BASE64(SHA1(password)),它需要先通過 username:password形式的 authentication
ip: 它對應的 id 為客戶機的 IP 地址,設置的時候可以設置一個 ip 段,比如 ip:192.168.1.0/16,表示匹配前 16 個 bit 的 IP 段
ID是驗證模式:
id 是驗證模式,不同的 scheme,id 的值也不一樣。
scheme 為 auth 時:username:password
scheme 為 digest 時:username:BASE64(SHA1(password))
scheme 為 ip 時:客戶端的 ip 地址。
scheme 為 world 時anyone。
Permission:
CREATE、READ、WRITE、DELETE、ADMIN 也就是 增、刪、改、查、管理權限,這 5 種權限簡寫為 crwda(即:每個單詞的首字符縮寫)
CREATE(c):創建子節點的權限
DELETE(d):刪除節點的權限
READ(r):讀取節點數據的權限
WRITE(w):修改節點數據的權限
ADMIN(a):設置子節點權限的權限
ACL 命令
getAcl /app1/testAcl 獲取節點acl權限信息
setAcl /app1/testAcl world:anyone:crwa # 設置該節點的 acl 權限
getAcl /app1/testAcl # 獲取該節點的 acl 權限信息,成功後,該節點就少了 d 權限
create /app1/testAcl/xyz xyz-data # 創建子節點
delete /app1/testAcl/xyz # 由於沒有 d 權限,所以提示無法刪除
addauth digest user1:123456 # 需要先添加一個用戶
setAcl /app1/testAcl auth:user1:123456:crwa # 然後才可以拿著這個用戶去設置權限
getAcl /app1/testAcl # 密碼是以密文的形式存儲的
create /app1/testAcl/testa aaa
delete /app1/testAcl/testa # 由於沒有 d 權限,所以提示無法刪除
退出客戶端後:
ls /app1/testAcl #沒有權限無法訪問
create /app1/testAcl/testb bbb #沒有權限無法訪問
addauth digest user1:123456 # 重新新增權限後可以訪問了
auth 與 digest 的區別就是,前者使用明文密碼進行登錄,後者使用密文密碼進行登錄
create /app1/testDigest data
addauth digest user1:123456
setAcl /app1/testDigest digest:user1:HYGa7IZRm2PUBFiFFu8xY2pPP/s=:crwa # 使用 digest來設置權限
注意:這裡如果使用明文,會導致該 znode 不可訪問
通過明文獲得密文
shell>
java -Djava.ext.dirs=/soft/zookeeper-3.4.12/lib -cp /soft/zookeeper-3.4.12/zookeeper-3.4.12.jar
org.apache.zookeeper.server.auth.DigestAuthenticationProvider deer:123456
deer:123456->deer:ACFm5rWnnKn9K9RN/Oc8qEYGYDs=
create /app1/testIp data
setAcl /app1/testIp ip:192.168.30.10:cdrwa
getAcl /app1/testIp
閱讀更多 JAVA破局之路 的文章