redission分布式鎖--紅鎖


參考鏈接:①Redis分布式鎖:單機Redis實現分布式鎖、Redission可重入鎖、Redission紅鎖機制(解決分布式redis單點宕機故障轉移存在的遺留問題)

                 ②5台redis實現紅鎖(完整demo)

問題

最近看一些redis分布式鎖的資料,大體思路都是一致,而且基本上都是用的Redission

這個本身也沒啥問題,但是奇怪的是,在介紹分布式鎖的缺點時,總是千篇一律的介紹了一種異常情況,是分布式鎖redission無法處理的。具體發生的過程介紹如下:

1)redis的部署方式為一主多從

2)如果客戶端1給redis主節點加了分布式鎖,但是redis主節點在異步復制給從節點之前就掛了,導致分布式鎖丟失

3)某個從節點自動成為新的主節點后,因為同步鎖丟失的原因,並不知道客戶端1已經加鎖,這時客戶端2也來了加鎖行為,這時客戶端2自然加鎖成功!!!

問題的關鍵是,客戶端1沒有主動釋放鎖,也沒有因為過期而釋放鎖,這時客戶端2就能得到鎖,這不是很大的問題嗎?我們的分布式鎖,在這種情況下,不是失去意義了嗎???

完善辦法

我剛開始也覺得,基於這種情況,說的挺有道理,實在是無解,畢竟數據丟了,沒有辦法。

但是(注意我要開始ZB了),我覺得肯定會有其他解決方案,或者更進一步完善的方案,對不對?

果然,就發現了另一個神奇的東西:紅鎖(RedLock),redission里對應RedissonRedLock 

紅鎖的關鍵思想:

1)加鎖時,嘗試給每個redis節點都加鎖

2)必須有超過一半的redis加鎖成功,才算本次加鎖成功(加鎖成功含義:成功獲取到鎖,且耗時時間小於鎖失效時間)

比如有1個主redis節點、4個從節點,那么總共有5個節點,紅鎖加鎖時,會同時往5個節點都加鎖,並且至少3個節點加鎖成功,才算最終加鎖成功。

如果加了紅鎖機制后,主從情況下,分布式鎖剛加完,主節點掛掉,那么新的從節點大概率會持有分布式鎖。

為什么會是大概率?因為可能當時紅鎖加鎖也成功了,但是其實5節點中,有一個從節點掛掉了,所以改從節點沒有分布式鎖,但是之后又被實施人員啟動了,這種時候,如果主節點掛掉,而剛啟動起來的從節點又剛好被作為新的主節點,那么還有會有問題。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM