一 zk 實現分布式鎖
1.1 zk分布式操作命令
1.指令:
?? ??? ?ls /
?? ??? ?get /zookeeper?
?? ??? ?create /aa "test"
?? ??? ?delete /aa?
?? ??? ?set /aa "test1"
2..znode節點類型:
?? ??? ?永久節點:create /path content
?? ??? ?臨時節點:create -e /path content 。只要客戶端程序斷開鏈接自動刪除
?? ??? ?永久序列化節點:create -s /path content?
?? ??? ?臨時序列化節點:create -s -e /path content?
1.2 zk的4種目錄樹
ookeeper提供一個多層級的節點命名空間(節點稱為znode),每個節點都用一個以斜杠(/)分隔的路徑表示,而且每個節點都有父節點(根節點除外),非常類似于文件系統。并且每個節點都是唯一的。znode節點有四種類型:
1.PERSISTENT:永久節點。客戶端與zookeeper斷開連接后,該節點依舊存在
2.EPHEMERAL:臨時節點。客戶端與zookeeper斷開連接后,該節點被刪除
3.PERSISTENT_SEQUENTIAL:永久節點、序列化。客戶端與zookeeper斷開連接后,該節點依舊存在,只是Zookeeper給該節點名稱進行順序編號
4.EPHEMERAL_SEQUENTIAL:臨時節點、序列化。客戶端與zookeeper斷開連接后,該節點被刪除,只是Zookeeper給該節點名稱進行順序編號
1.3 實戰操作
1.進入zk客戶端
./zkCli.sh? ? ? ? # 查看zk客戶端
2.創建節點命令
[zk: localhost:2181(CONNECTED) 12] get /sz
test
[zk: localhost:2181(CONNECTED) 13] set /sz test123
[zk: localhost:2181(CONNECTED) 14] get /sz
test123
[zk: localhost:2181(CONNECTED) 15]?
3.案例
[zk: localhost:2181(CONNECTED) 0] create /aa test ?# 創建持久化節點
Created /aa
[zk: localhost:2181(CONNECTED) 1] create -s /bb test ?# 創建持久序列化節點
Created /bb0000000001
[zk: localhost:2181(CONNECTED) 2] create -e /cc test ?# 創建臨時節點
Created /cc
[zk: localhost:2181(CONNECTED) 3] create -e -s /dd test ?# 創建臨時序列化節點
Created /dd0000000003
[zk: localhost:2181(CONNECTED) 4] ls / ? # 查看某個節點下的子節點
[aa, bb0000000001, cc, dd0000000003, zookeeper]
[zk: localhost:2181(CONNECTED) 5] stat / ?# 查看某個節點的狀態
cZxid = 0x0
ctime = Thu Jan 01 08:00:00 CST 1970
mZxid = 0x0
mtime = Thu Jan 01 08:00:00 CST 1970
pZxid = 0x5
cversion = 3
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 0
numChildren = 5
[zk: localhost:2181(CONNECTED) 6] get /aa ?# 查看某個節點的內容
test
[zk: localhost:2181(CONNECTED) 11] delete /aa ?# 刪除某個節點
[zk: localhost:2181(CONNECTED) 7] ls / ?# 再次查看
[bb0000000001, cc, dd0000000003, zookeeper]
1.4 zk的監聽事件
在讀取數據時,我們可以同時對節點設置事件監聽,當節點數據或結構變化時,zookeeper會通知客戶端。當前zookeeper針對節點的監聽有如下四種事件:
??5.節點的事件監聽:一次性
?? ??? ?1.節點創建:NodeCreated
?? ??? ??? ?stat -w /xx?
?? ??? ?2.節點刪除:NodeDeleted
?? ??? ??? ?stat -w /xx
?? ??? ?3.節點數據變化:NodeDataChanged
?? ??? ??? ?get -w /xx
?? ??? ?4.子節點變化:NodeChildrenChanged
?? ??? ??? ?ls -w /xx
1.客戶端
[zk: localhost:2181(CONNECTED) 28] set /teng 1234
[zk: localhost:2181(CONNECTED) 29]?
2.客戶端2:會提示目錄/teng 發生了改變