zookeeper(3)分布式鎖

2021-09-27 05:12:17 字數 1603 閱讀 3312

在乙個分布式系統中,如何保證乙個操作,同一時間只有乙個執行緒可以執行,這就是分布式鎖的使用場景,同一時間,只有乙個執行緒可以獲得鎖的使用權。

實現乙個分布式鎖,可以有以下3種方法。

1、在mysql中,使用悲觀鎖"select from t where id = for update"可以對行資料進行加鎖,來實現分布式鎖。

2、同乙個時間內,只會有乙個執行緒加鎖成功,其他執行緒必須等待。

3、資料庫要保證是全域性的,每一把鎖所對應的行資料也是唯一的。

1、實現簡單,方便。

1、基於資料庫的悲觀鎖,效能比較差。

2、等待中的執行緒是自旋的或者等待狀態,需要等待持有鎖的執行緒處理完,多個執行緒再一起去競爭同一把鎖。

3、異常無法處理,當持有鎖的執行緒還沒有釋放鎖,意外退出,鎖資源將無法釋放,應用程式將無法繼續進行。

1、使用redis的setnx命令,可以模擬分布式鎖,setnx保證操作乙個key值,如果沒有則返回true,如果存在則返回false。

2、為了解決程式意外退出導致無法釋放鎖資源,需要給key增加乙個超時時間。

3、redis提供了帶引數的命令,可以保證設定key值和設定超時時間這2個操作的原子性

set key value [ex seconds] [px milliseconds] [nx|xx]
4、假如有如下情況:

a獲取了鎖,設定了超時時間為10秒,但是a執行了15秒,在10秒的時候鎖失效了。

b在11秒的時候獲取了鎖,執行了5秒,那麼a在15秒的時候會誤刪掉b的鎖。

為了解決以上問題,每個加鎖的執行緒都需要設定自己的value值,當刪除的時候也要校驗是自己的鎖,才可以刪除。

1、實現簡單,方便。

2、基於redis的高效能,效率高。

1、無法解決超時鎖失效問題,邏輯處理的時間超過了設定的超時時間,那麼這個時候就會導致,另乙個也可以拿到鎖繼續執行。

為了解決這個問題,一般的方法是啟動乙個守護執行緒,時刻監控失效時間,當鎖時間超過一定的執行時間比例之後,自動續約一定的時間,當然這個總時間是有最大閾值限制的。

2、等待中的執行緒是自旋的後者等待狀態,需要等待持有鎖的執行緒處理完,多個執行緒再一起去競爭同一把鎖。

1、使用臨時節點實現分布式鎖,第乙個建立臨時節點成功的執行緒,獲取鎖成功。

2、其他建立臨時節點的執行緒會失敗,那麼監聽鎖的臨時節點。

3、當鎖釋放的時候,刪除臨時節點,會通知到監聽的執行緒,收到通知的執行緒繼續嘗試建立臨時鎖節點,誰建立成功誰獲得鎖。

解決了鎖失效問題,通知機制可以完美解決,即使建立臨時節點的執行緒掛掉,臨時節點會自動刪除。

1、當有大量執行緒,等待鎖資源的時候,鎖資源釋放會涉及到大量的通知,並且大量的執行緒需要一起競爭鎖資源。

1、在乙個目錄下,各個執行緒建立順序的臨時節點,節點編號1、2、3、4、5等。

2、目錄下建立的節點最小的執行緒獲取鎖。

3、等待鎖資源的執行緒,不再一起全部監聽鎖節點,而是只監聽比自己小的上乙個節點。

4、當監聽的比自己小的鎖節點被刪除後,繼續改為監聽上乙個比自己小的節點。

4、當鎖釋放的時候,只需要通知監聽鎖節點的乙個獲幾個執行緒,避免了大量的通知。

zookeeper實現的樂觀鎖,是比較合理的分布式鎖方式,感興趣的朋友可以用**實現一下。

分布式鎖 3 分布式鎖租約續期

redis分布式鎖在加鎖的時候,我們一般都會給乙個鎖的過期時間 ttl 這是為了防止加鎖後client宕機,鎖無法被釋放的問題。但是所有這種姿勢的用法都會面臨同乙個問題,就是沒發保證client的執行時間一定小於鎖的ttl。雖然大多數程式設計師都會樂觀的認為這種情況不可能發生,但是各種異常情況都會導...

ZooKeeper實踐方案 (7) 分布式鎖

分布式鎖是控制分布式系統之間同步訪問共享資源的一種方式,須要相互排斥來防止彼此干擾來保證一致性。利用zookeeper的強一致性能夠完畢鎖服務。zookeeper的官方文件是列舉了兩種鎖。獨佔鎖和共享鎖。獨佔鎖保證不論什麼時候都僅僅有乙個程序能或者資源的讀寫許可權。共享鎖能夠同一時候有多個讀,可是同...

zookeeper分布式鎖

方案1 演算法思路 利用名稱唯一性,加鎖操作時,只需要所有客戶端一起建立 test lock節點,只有乙個建立成功,成功者獲得鎖。解鎖時,只需刪除 test lock節點,其餘客戶端再次進入競爭建立節點,直到所有客戶端都獲得鎖。特點 這種方案的正確性和可靠性是zookeeper機制保證的,實現簡單。...