分布式鎖-RedLock

Unsafe Lock by Martin Kleppmann

先大膽下一個結(jié)論搅轿。

由于分布式環(huán)境的復雜性目前是沒有完美的分布式鎖實現(xiàn)方案的恨锚。無論是基于redis的RedLock還是基于zookeeper的分布式鎖大猛。

這一篇主要討論RedLock

簡介

基于redis集群的分布式鎖??

簡單實現(xiàn)

算法1

1 set lock_key fix_value NX

2 expire lock_key time

問題

a 假設(shè)client A 執(zhí)行到步驟1务蝠,然后client A掛掉匹耕,那么永遠無法執(zhí)行到步驟2了渔呵,也就是說形成了死鎖-安全性問題

b client A 執(zhí)行完整個步驟怒竿,還未進入臨界區(qū),然后因為gc停頓或者其他原因停頓扩氢,然后鎖自動過期了耕驰;client B執(zhí)行完整個步驟,拿到鎖录豺,此時client A和client B都獲得了??朦肘;更加嚴重的是,client A從阻塞狀態(tài)恢復了巩检,會去釋放掉??厚骗,導致B的??也被釋放了-安全性問題

c 單節(jié)點的redis存在掛掉的情況-活性問題

d 主備形式的redis集群,當主掛掉之后兢哭,備會頂上领舰,但是redis的異步復制的,備頂上可能此時還沒有主的數(shù)數(shù)據(jù)-安全性問題

初步解決

a 將步驟1和步驟2合并成一個原子操作

算法2

set lock_key fix_value NX PX time

b 將fix_value 換成 random value

釋放鎖的操作變成如下

算法3

unlock(key, value){

if(redis.call(“get”, key) == value) then

return redis.call(“del”, key)

else

return 0

}

上述操作是利用lua完成迟螺,為原子操作冲秽,含義為先查看下lock對應的value是否還是自己set進去的值,如果是則可以釋放鎖矩父,否則認為鎖已經(jīng)被別人占用

上述方式還是無法解決b的第一個問題锉桑,但是可以解決b的第二個問題

c 和 d的問題需要完成巨大的變更才有可能解決

RedLock

算法描述

基于多master的redis集群,保證在大多數(shù)節(jié)點存活的情況下鎖的活性和安全性問題

定義

a 鎖的超時時間timeout-client需要在這個給定時間內(nèi)獲取到鎖窍株,否則認為是超時的

b 鎖的有效時間lock validity time-client獲得鎖后民轴,在這個時間段后需要釋放鎖

a是遠小于b的

c 鎖節(jié)點的個數(shù)

加鎖過程

1 記錄下當前時間戳

2 依次向redis集群中執(zhí)行算法2的操作,對于單個節(jié)點來說球订,如果在a的時間內(nèi)獲得??后裸,則認為獲得此節(jié)點的鎖,反之亦然冒滩。

3 判斷是否獲得大多數(shù)??微驶,并將此時的時間戳減去步驟1的時間戳得到b1,如果b1大于b的時間开睡,則認為獲取失敗因苹,觸發(fā)釋放鎖邏輯,否則認為獲取鎖成功篇恒,鎖的時間長度為b的時間減去b1的時間長度扶檐。

釋放鎖過程

依次向每個redis節(jié)點發(fā)出算法3的邏輯

問題分析

1 b的第一個問題還是無法解決

2 由于時鐘跳躍會引發(fā)新的問題,某個節(jié)點已經(jīng)被client獲取了鎖婚度,但是因為時鐘跳躍問題蘸秘,鎖迅速的過期了官卡,那么可能存在另一個client來獲取鎖時,此節(jié)點會將鎖分配給他醋虏,那么等于說一個節(jié)點被兩個client同時成功獲取鎖了寻咒。

Martin認為

出于效率來使用分布式鎖,允許偶爾的??失敗颈嚼,僅僅需要簡單的分布式鎖實現(xiàn)方案就可以了毛秘,RedLock的實現(xiàn)偏重

出于正確性來使用分布式鎖,redLock會因為這樣那樣的分布式問題阻课,而無法達到正確性的要求

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末叫挟,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子限煞,更是在濱河造成了極大的恐慌抹恳,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,084評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件署驻,死亡現(xiàn)場離奇詭異奋献,居然都是意外死亡,警方通過查閱死者的電腦和手機旺上,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,623評論 3 392
  • 文/潘曉璐 我一進店門瓶蚂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人宣吱,你說我怎么就攤上這事窃这。” “怎么了征候?”我有些...
    開封第一講書人閱讀 163,450評論 0 353
  • 文/不壞的土叔 我叫張陵杭攻,是天一觀的道長。 經(jīng)常有香客問我疤坝,道長朴上,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,322評論 1 293
  • 正文 為了忘掉前任卒煞,我火速辦了婚禮,結(jié)果婚禮上叼架,老公的妹妹穿的比我還像新娘畔裕。我一直安慰自己,他們只是感情好乖订,可當我...
    茶點故事閱讀 67,370評論 6 390
  • 文/花漫 我一把揭開白布扮饶。 她就那樣靜靜地躺著,像睡著了一般乍构。 火紅的嫁衣襯著肌膚如雪甜无。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,274評論 1 300
  • 那天,我揣著相機與錄音岂丘,去河邊找鬼陵究。 笑死,一個胖子當著我的面吹牛奥帘,可吹牛的內(nèi)容都是我干的铜邮。 我是一名探鬼主播,決...
    沈念sama閱讀 40,126評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼寨蹋,長吁一口氣:“原來是場噩夢啊……” “哼松蒜!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起已旧,我...
    開封第一講書人閱讀 38,980評論 0 275
  • 序言:老撾萬榮一對情侶失蹤秸苗,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后运褪,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體惊楼,經(jīng)...
    沈念sama閱讀 45,414評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,599評論 3 334
  • 正文 我和宋清朗相戀三年吐句,在試婚紗的時候發(fā)現(xiàn)自己被綠了胁后。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,773評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡嗦枢,死狀恐怖攀芯,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情文虏,我是刑警寧澤侣诺,帶...
    沈念sama閱讀 35,470評論 5 344
  • 正文 年R本政府宣布,位于F島的核電站氧秘,受9級特大地震影響年鸳,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜丸相,卻給世界環(huán)境...
    茶點故事閱讀 41,080評論 3 327
  • 文/蒙蒙 一搔确、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧灭忠,春花似錦膳算、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,713評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至映琳,卻和暖如春机隙,著一層夾襖步出監(jiān)牢的瞬間蜘拉,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,852評論 1 269
  • 我被黑心中介騙來泰國打工有鹿, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留旭旭,地道東北人。 一個月前我還...
    沈念sama閱讀 47,865評論 2 370
  • 正文 我出身青樓印颤,卻偏偏與公主長得像您机,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子年局,可洞房花燭夜當晚...
    茶點故事閱讀 44,689評論 2 354

推薦閱讀更多精彩內(nèi)容