復(fù)習(xí)
zookeeper的節(jié)點類型:
1. 持久節(jié)點
2. 臨時節(jié)點
3. 持久順序節(jié)點
4. 臨時順序節(jié)點
基于zookeeper的分布式鎖使用了【臨時順序節(jié)點】
臨時順序節(jié)點
在創(chuàng)建節(jié)點的時候燎竖,zookeeper根據(jù)創(chuàng)建的時間順序給該節(jié)點進(jìn)行編號芹枷,
當(dāng)創(chuàng)建節(jié)點的客戶端與zk斷開連接后,臨時節(jié)點會被刪除
zk實現(xiàn)分布式鎖原理 - 加鎖
1. 首先創(chuàng)建一個跟節(jié)點:parent-lock
2. 如果有3個client對同一個資源-resource進(jìn)行鎖定。分別是client1, client2, client3
3. client1嘗試對resource進(jìn)行鎖定,在/parent-lock下創(chuàng)建了一個臨時順序節(jié)點lock-1,
然后client1查找/parent-lock下所有的臨時節(jié)點并進(jìn)行排序,判斷自己創(chuàng)建的節(jié)點lock-1是不是順序最靠前的一個,如果是第一個沛膳,就成功獲取了鎖。
4. 之后client2在/parent-lock創(chuàng)建臨時順序節(jié)點lock-2, 之后查找這個節(jié)點是不是最靠前的一個汛聚,
發(fā)現(xiàn)不是锹安,那么client2會向lock-1注冊watcher,用于監(jiān)聽lock-1是否存在倚舀,同時client2搶鎖失敗叹哭,進(jìn)入等待狀態(tài)。
5. 之后client3也會嘗試獲取鎖瞄桨,由于不是最靠前的一個话速,會采取client2一樣的操作讶踪。
zk實現(xiàn)分布式鎖原理 - 解鎖
1. 客戶端顯式的刪除自己創(chuàng)建的節(jié)點芯侥,釋放鎖,如果刪除成功乳讥,那么其他client對其注冊的watcher會通知其他節(jié)點柱查,
告訴其他節(jié)點該節(jié)點已經(jīng)刪除,可以重試獲取鎖云石。
2. 如果client崩潰了唉工,那么就對斷開zk,其自己創(chuàng)建的節(jié)點就會自動刪除汹忠。