譯文-Is Redlock safe? - <antirez>
Redlock是安全的嗎?
antirez 1973 天前. 316555次瀏覽。
分布式系統(tǒng)研究員Martin Kleppmann昨天發(fā)表了一篇對(duì)Redlock(http://redis.io/topics/distlock)的分析村怪,你可以在這里找到:http://martin.kleppmann.com/2016/02/08/how-to-do-distributed-locking.html
Redlock是我設(shè)計(jì)的一種客戶端分布式鎖算法,可以和Redis一起使用浮庐,但該算法在客戶端協(xié)調(diào)了一組實(shí)現(xiàn)具有一定能力的數(shù)據(jù)存儲(chǔ)的節(jié)點(diǎn)甚负,以創(chuàng)建一個(gè)多主站容錯(cuò)的,并希望是安全的审残,具有自動(dòng)釋放能力的分布式鎖梭域。
例如,你可以使用MySQL而不是Redis來(lái)實(shí)現(xiàn)Redlock维苔。
該算法的目標(biāo)是讓那些使用單個(gè)Redis實(shí)例或帶有故障轉(zhuǎn)移的主從設(shè)置來(lái)實(shí)現(xiàn)分布式鎖的人轉(zhuǎn)向更可靠碰辅、更安全懂昂,但復(fù)雜度很低且性能良好的東西介时。
自從我發(fā)布Redlock后,人們用多種語(yǔ)言實(shí)現(xiàn)了它凌彬,并將其用于不同的目的沸柔。
Martin對(duì)該算法的分析得出結(jié)論:Redlock并不安全。Martin發(fā)表了分析報(bào)告铲敛,這很好褐澎,我在這里的原始Redlock規(guī)范中要求進(jìn)行分析:http://redis.io/topics/distlock。所以謝謝你伐蒋,Martin工三。然而我并不同意這個(gè)分析迁酸。好在分布式系統(tǒng)與其他領(lǐng)域的編程不同,在數(shù)學(xué)上是相當(dāng)精確的俭正,或者說(shuō)是不精確的奸鬓,所以一組給定的屬性可以由一個(gè)算法來(lái)保證,或者在某些假設(shè)下算法可能無(wú)法保證掸读。在這個(gè)分析中串远,我將分析Martin的分析,以便該領(lǐng)域的其他專家可以檢查這兩份文件(分析和反分析)儿惫,最終我們可以了解Redlock是否可以被視為安全澡罚。
為什么Martin認(rèn)為Redlock不安全
分析中的論點(diǎn)主要有兩個(gè)。
具有自動(dòng)釋放功能的分布式鎖(互斥鎖屬性只在獲得鎖后的固定時(shí)間內(nèi)有效)需要一種方法來(lái)避免客戶在過(guò)期后使用鎖肾请,在訪問(wèn)共享資源時(shí)違反互斥的問(wèn)題留搔。Martin說(shuō)晕换,Redlock沒(méi)有這樣的機(jī)制矫限。
Martin說(shuō),即使不管上述問(wèn)題1呜舒,該算法本質(zhì)上是不安全的避归,因?yàn)樗鼘?duì)系統(tǒng)模型做了假設(shè)荣月,而這些假設(shè)在實(shí)際系統(tǒng)中無(wú)法保證。
為了清楚起見(jiàn)梳毙,我將分別討論這兩個(gè)問(wèn)題哺窄,從第一個(gè)問(wèn)題 "1 "開(kāi)始。
分布式鎖账锹、自動(dòng)釋放和tokens
一個(gè)沒(méi)有自動(dòng)釋放機(jī)制的分布式鎖萌业,鎖的主人將無(wú)限期地持有它,基本上是沒(méi)有用的奸柬。如果持有鎖的客戶端崩潰了生年,并且沒(méi)有在很短的時(shí)間內(nèi)恢復(fù)完整的狀態(tài),就會(huì)產(chǎn)生一個(gè)死鎖廓奕,即分布式鎖試圖保護(hù)的共享資源永遠(yuǎn)無(wú)法訪問(wèn)抱婉。這就產(chǎn)生了一個(gè)在大多數(shù)情況下不可接受的有效性問(wèn)題,所以一個(gè)合理的分布式鎖必須能夠自動(dòng)釋放自己桌粉。
因此蒸绩,實(shí)用的鎖是提供給客戶的,有一個(gè)最大的生存時(shí)間铃肯。在過(guò)期后患亿,作為鎖的*主要屬性的互斥保證就沒(méi)有了:另一個(gè)客戶端可能已經(jīng)擁有了這個(gè)鎖。如果兩個(gè)客戶端在兩個(gè)不同的時(shí)間獲得了鎖押逼,但由于GC暫筒脚海或其他調(diào)度問(wèn)題惦界,第一個(gè)客戶端的速度非常慢,它將試圖在共享資源的上下文中與第二個(gè)獲得鎖的客戶端同時(shí)進(jìn)行工作咙冗,會(huì)發(fā)生什么情況表锻?
Martin說(shuō),這個(gè)問(wèn)題可以通過(guò)讓分布式鎖服務(wù)器為每個(gè)鎖提供一個(gè)令牌來(lái)避免乞娄,在他的例子中瞬逊,令牌只是一個(gè)數(shù)字,保證總是遞增的仪或。馬丁使用令牌的理由是确镊,這樣一來(lái),當(dāng)兩個(gè)不同的客戶同時(shí)訪問(wèn)被鎖的資源時(shí)范删,我們可以在數(shù)據(jù)庫(kù)寫(xiě)入事務(wù)中使用令牌(假定將客戶的工作具體化):只有擁有最大鎖號(hào)的客戶才能寫(xiě)入數(shù)據(jù)庫(kù)蕾域。
用馬丁的話說(shuō)。
"這個(gè)問(wèn)題的解決方法其實(shí)很簡(jiǎn)單:你需要在向存儲(chǔ)服務(wù)的每個(gè)寫(xiě)請(qǐng)求中包含一個(gè)防護(hù)令牌到旦。在這種情況下旨巷,防護(hù)令牌只是一個(gè)數(shù)字,每次客戶端獲得鎖的時(shí)候添忘,這個(gè)數(shù)字就會(huì)增加(例如由鎖服務(wù)增加)"
......剪輯......
"請(qǐng)注意采呐,這需要存儲(chǔ)服務(wù)器在檢查令牌方面發(fā)揮積極作用,并拒絕任何令牌已經(jīng)倒退的寫(xiě)入"搁骑。
我認(rèn)為這種說(shuō)法有很多問(wèn)題斧吐。
大多數(shù)時(shí)候,當(dāng)你需要一個(gè)能夠保證相互排他性的分布式鎖系統(tǒng)時(shí)仲器,當(dāng)這個(gè)屬性被違反時(shí)煤率,你已經(jīng)輸了。分布式鎖正是在我們對(duì)共享資源沒(méi)有其他控制的時(shí)候非常有用乏冀。在他的分析中蝶糯,Martin假設(shè)當(dāng)鎖的互斥性被違反時(shí),你總是有一些其他的方法來(lái)避免競(jìng)爭(zhēng)條件辆沦。我認(rèn)為這是一種非常奇怪的方式來(lái)推理具有強(qiáng)保障的分布式鎖昼捍,不清楚為什么你會(huì)使用具有強(qiáng)屬性的鎖,如果你能以不同的方式解決競(jìng)爭(zhēng)众辨。然而端三,我將繼續(xù)下面的其他觀點(diǎn)舷礼,只是為了說(shuō)明Redlock在這種非人為的情況下可以很好地工作鹃彻。
如果你的數(shù)據(jù)存儲(chǔ)總是在你的令牌大于所有過(guò)去的令牌時(shí)才接受寫(xiě)入,那么它就是一個(gè)可線性化存儲(chǔ)妻献。如果你有一個(gè)可線性化的存儲(chǔ)蛛株,你就可以為每一個(gè)Redlock獲得的ID生成一個(gè)增量团赁,所以這將使Redlock等同于另一個(gè)分布式鎖系統(tǒng),在每一個(gè)新的鎖中提供一個(gè)增量的令牌ID谨履。然而在下一點(diǎn)中欢摄,我將說(shuō)明這一點(diǎn)是不需要的。
然而 "2 "并不是一個(gè)明智的選擇:大多數(shù)時(shí)候笋粟,對(duì)共享資源工作的結(jié)果并不是寫(xiě)到一個(gè)可線性化的存儲(chǔ)中怀挠,那么該怎么做?每個(gè)Redlock都與一個(gè)大的隨機(jī)令牌相關(guān)聯(lián)(該令牌的生成方式可以忽略碰撞害捕。Redlock規(guī)范的文字假設(shè)是 "來(lái)自/dev/urandom的20字節(jié)")绿淋。) 你對(duì)一個(gè)唯一的令牌做什么?例如尝盼,你可以實(shí)現(xiàn)Check和Set吞滞。當(dāng)開(kāi)始處理一個(gè)共享資源時(shí),我們把它的狀態(tài)設(shè)置為"
<token>
"盾沫,然后我們只在寫(xiě)入時(shí)令牌仍然相同的情況下操作讀-修改-寫(xiě)入裁赠。請(qǐng)注意,在某些用例中赴精,人們可以說(shuō)佩捞,無(wú)論如何,有秩序的令牌是很有用的蕾哟。雖然很難想出一個(gè)用例失尖,但請(qǐng)注意,對(duì)于Martin提到的同樣的GC暫停渐苏,獲得令牌的順序掀潮,并不一定尊重客戶嘗試對(duì)共享資源工作的順序,所以鎖的順序可能與對(duì)共享資源工作的效果不隨便相關(guān)琼富。
大多數(shù)時(shí)候仪吧,鎖被用來(lái)訪問(wèn)那些以非事務(wù)性方式更新的資源。有時(shí)我們使用分布式鎖來(lái)移動(dòng)物理對(duì)象鞠眉,比如說(shuō)薯鼠。或者與另一個(gè)外部API進(jìn)行交互械蹋,等等出皇。
我想再次提到,這一切的奇怪之處在于哗戈,它假定你總是必須有一種方法來(lái)處理相互排斥被違反的事實(shí)郊艘。事實(shí)上,如果你有這樣一個(gè)系統(tǒng)來(lái)避免競(jìng)爭(zhēng)條件下的問(wèn)題,你可能根本不需要一個(gè)分布式鎖纱注,或者至少你不需要一個(gè)有強(qiáng)大保證的鎖畏浆,而只是一個(gè)弱鎖來(lái)避免,大多數(shù)時(shí)候狞贱,由于性能原因的并發(fā)訪問(wèn)刻获。
然而,即使你碰巧同意Martin關(guān)于上述事實(shí)是非常有用的瞎嬉,底線是每個(gè)鎖的唯一標(biāo)識(shí)符可以用于相同的目標(biāo)蝎毡,但在不要求存儲(chǔ)的強(qiáng)一致方面更實(shí)用。
我們來(lái)談?wù)勏到y(tǒng)模型
上面的批評(píng)基本上是所有的東西都有的氧枣,它是一個(gè)自動(dòng)釋放的分布式鎖顶掉,而不是在每個(gè)鎖上提供一個(gè)單調(diào)增加的計(jì)數(shù)器。然而挑胸,Martin的另一個(gè)批評(píng)是針對(duì)Redlock的痒筒。在這里,Martin真正分析了這個(gè)算法茬贵,得出的結(jié)論是它被破壞了簿透。
Redlock假設(shè)了一個(gè)半同步的系統(tǒng)模型,不同的進(jìn)程可以以差不多的 "速度 "計(jì)算時(shí)間解藻。不同的進(jìn)程不需要以任何方式在絕對(duì)時(shí)間上有一個(gè)約束誤差老充。他們需要做的只是,例如螟左,能夠以最大10%的誤差計(jì)算5秒啡浊。因此,一個(gè)人計(jì)算實(shí)際4.5秒胶背,另一個(gè)人計(jì)算5.5秒巷嚣,我們就可以了。
Martin還指出钳吟,Redlock需要約束信息的最大延遲廷粒,就我所知,這并不正確(我將在后面解釋他的推理有什么問(wèn)題)红且。
因此坝茎,讓我們從不同進(jìn)程無(wú)法以相同的速度計(jì)算時(shí)間的問(wèn)題開(kāi)始。
Martin說(shuō)暇番,由于兩個(gè)問(wèn)題嗤放,時(shí)鐘會(huì)在系統(tǒng)中隨機(jī)跳躍。
系統(tǒng)管理員手動(dòng)改變了時(shí)鐘壁酬。
ntpd守護(hù)進(jìn)程因?yàn)槭盏礁露?jīng)常改變時(shí)鐘次酌。
上述兩個(gè)問(wèn)題可以通過(guò)以下方式來(lái)避免:"1 "不這樣做(否則即使用 "echo foo > /my/raft/log.bin "來(lái)破壞Raft日志也是一個(gè)問(wèn)題)恨课;"2 "使用ntpd,它不通過(guò)直接跳轉(zhuǎn)來(lái)改變時(shí)間和措,而是在較大的時(shí)間跨度內(nèi)分布改變。
然而我認(rèn)為Martin是對(duì)的蜕煌,Redis和Redlock的實(shí)現(xiàn)應(yīng)該改用大多數(shù)操作系統(tǒng)提供的單調(diào)的時(shí)間API派阱,以使上述問(wèn)題不那么嚴(yán)重。這在過(guò)去被提出過(guò)幾次斜纪,在Redis內(nèi)部增加了一些復(fù)雜性贫母,但卻是一個(gè)好主意:我將在未來(lái)幾周內(nèi)實(shí)現(xiàn)這個(gè)想法。然而盒刚,雖然我們將切換到單調(diào)的時(shí)間API腺劣,因?yàn)橛袃?yōu)勢(shì),在沒(méi)有軟件(時(shí)間服務(wù)器)或人類(系統(tǒng)管理員)元素改變時(shí)鐘的操作系統(tǒng)中運(yùn)行的進(jìn)程因块,可以計(jì)算相對(duì)時(shí)間橘原,即使使用gettimeofday()也會(huì)有邊界錯(cuò)誤。
請(qǐng)注意涡上,過(guò)去曾有過(guò)實(shí)現(xiàn)分布式系統(tǒng)的嘗試趾断,甚至假設(shè)絕對(duì)時(shí)間的誤差是有限的(通過(guò)使用GPS裝置)。Redlock不需要這樣的東西吩愧,只需要不同的進(jìn)程能夠?qū)?0秒算作9.5秒或11.2秒(在例子中最多+/-2秒)芋酌,例如。
那么雁佳,Redlock到底安不安全脐帝?這取決于上述情況。讓我們假設(shè)我們使用單調(diào)增長(zhǎng)的時(shí)間API糖权,為了簡(jiǎn)單起見(jiàn)堵腹,排除實(shí)施細(xì)節(jié)(對(duì)POKE和時(shí)間服務(wù)器情有獨(dú)鐘的系統(tǒng)管理員)。一個(gè)進(jìn)程可以用最大誤差的固定百分比來(lái)計(jì)算相對(duì)時(shí)間嗎星澳?我認(rèn)為這是一個(gè)響當(dāng)當(dāng)?shù)腨ES秸滴,對(duì)這個(gè)問(wèn)題的回答是比對(duì)的更簡(jiǎn)單。"一個(gè)進(jìn)程能否在不破壞日志的情況下寫(xiě)入日志"募判?
網(wǎng)絡(luò)延遲與合作
Martin說(shuō)荡含,Redlock不僅僅取決于進(jìn)程可以在大約同一時(shí)間計(jì)算時(shí)間,他說(shuō)届垫。
"然而释液,Redlock不是這樣的。它的安全性取決于很多時(shí)間上的假設(shè):它假設(shè)所有Redis節(jié)點(diǎn)在過(guò)期前持有密鑰的時(shí)間長(zhǎng)度大致正確装处;網(wǎng)絡(luò)延遲與過(guò)期時(shí)間相比很形笳浸船;進(jìn)程暫停比過(guò)期時(shí)間短很多"。
因此寝蹈,讓我們把上述主張分成不同的部分李命。
Redis節(jié)點(diǎn)持有密鑰的時(shí)間長(zhǎng)度大致合適。
網(wǎng)絡(luò)延遲與過(guò)期時(shí)間相比是很小的箫老。
進(jìn)程暫停時(shí)間比到期時(shí)間短得多封字。
在Martin說(shuō) "系統(tǒng)時(shí)鐘跳動(dòng) "的所有時(shí)間里,我假設(shè)我們通過(guò)不以對(duì)算法有問(wèn)題的方式探究系統(tǒng)時(shí)間耍鬓,或者為了簡(jiǎn)單起見(jiàn)阔籽,通過(guò)使用單調(diào)的時(shí)間API來(lái)覆蓋這個(gè)問(wèn)題。所以牲蜀。
關(guān)于權(quán)利要求1:這不是一個(gè)問(wèn)題笆制,我們假定我們可以以相同的速度計(jì)算時(shí)間,除非有任何實(shí)際的反對(duì)意見(jiàn)涣达。
關(guān)于權(quán)利要求2:事情要復(fù)雜一些在辆。Martin說(shuō)
"好吧,也許你認(rèn)為時(shí)鐘跳動(dòng)是不現(xiàn)實(shí)的度苔,因?yàn)槟銓?duì)正確配置NTP开缎,使其只進(jìn)行時(shí)鐘回轉(zhuǎn)非常有信心。" (是的林螃,我們?cè)谶@里同意;-)他繼續(xù)說(shuō)...)
"在這種情況下奕删,讓我們看一個(gè)例子,說(shuō)明進(jìn)程暫土迫希可能導(dǎo)致算法失敗完残。
客戶端1請(qǐng)求鎖定節(jié)點(diǎn)A、B横漏、C谨设、D、E缎浇。
當(dāng)對(duì)客戶端1的響應(yīng)在路途中時(shí)扎拣,客戶端1進(jìn)入停止世界的GC。
所有Redis節(jié)點(diǎn)的鎖都過(guò)期了素跺。
客戶端2獲得了節(jié)點(diǎn)A二蓝、B、C指厌、D刊愚、E的鎖。
客戶端1完成了GC踩验,并收到了來(lái)自Redis節(jié)點(diǎn)的響應(yīng)鸥诽,表明它成功獲得了鎖(當(dāng)進(jìn)程暫停時(shí)商玫,它們被保存在客戶端1的內(nèi)核網(wǎng)絡(luò)緩沖區(qū))。
客戶端1和2現(xiàn)在都認(rèn)為他們持有該鎖牡借。"
如果你閱讀了我?guī)讉€(gè)月沒(méi)碰過(guò)的Redlock規(guī)范拳昌,你可以看到獲取鎖的步驟是。
獲取當(dāng)前時(shí)間钠龙。
...獲取鎖所需的所有步驟...
再次獲取當(dāng)前時(shí)間炬藤。
檢查我們是否已經(jīng)沒(méi)有時(shí)間了,或者我們是否足夠快地獲得了鎖俊鱼。
用你的鎖做一些工作刻像。
注意步驟1和3畅买。無(wú)論網(wǎng)絡(luò)或相關(guān)進(jìn)程中發(fā)生什么延遲并闲,在獲得大多數(shù)人之后,我們再次檢查我們是否超出了時(shí)間谷羞。延遲只能發(fā)生在步驟3之后帝火,導(dǎo)致鎖被認(rèn)為是可以的,而實(shí)際上已經(jīng)過(guò)期了湃缎,也就是說(shuō)犀填,我們又回到了Martin發(fā)現(xiàn)的分布式鎖的第一個(gè)問(wèn)題,即客戶未能在鎖有效期過(guò)期之前停止對(duì)共享資源的工作嗓违。讓我再講講這個(gè)問(wèn)題是如何在所有的分布式鎖實(shí)現(xiàn)中普遍存在的九巡,以及作為解決方案的令牌是如何既不現(xiàn)實(shí)又可以用于Redlock的。
請(qǐng)注意蹂季,無(wú)論在1和3之間發(fā)生什么冕广,你都可以添加你想要的網(wǎng)絡(luò)延遲,如果時(shí)間過(guò)長(zhǎng)偿洁,鎖將永遠(yuǎn)被認(rèn)為是無(wú)效的撒汉,所以Redlock看起來(lái)完全不受進(jìn)程之間有非綁定延遲的消息的影響。它在設(shè)計(jì)時(shí)就考慮到了這一目標(biāo)涕滋,我看不出上述的競(jìng)賽條件會(huì)發(fā)生睬辐。
然而Martin的博文也被多位DS專家審閱過(guò),所以我不確定我在這里是否遺漏了什么宾肺,或者僅僅是Redlock的工作方式被很多人同時(shí)忽略了溯饵。我很樂(lè)意收到一些關(guān)于這方面的澄清。
上述內(nèi)容也解決了 "過(guò)程暫停 "的關(guān)注點(diǎn)3锨用。在獲取鎖的過(guò)程中瓣喊,暫停不會(huì)對(duì)算法的正確性產(chǎn)生影響。然而黔酥,它們會(huì)影響客戶端在指定的鎖時(shí)間內(nèi)進(jìn)行工作的能力藻三,就像上面已經(jīng)提到的任何其他自動(dòng)釋放的分布式鎖一樣洪橘。
關(guān)于網(wǎng)絡(luò)延遲的題外話
只是一個(gè)簡(jiǎn)單的說(shuō)明。在帶有自動(dòng)釋放功能的分布式鎖的服務(wù)器端實(shí)現(xiàn)中棵帽,客戶端可能會(huì)要求獲得一個(gè)鎖熄求,服務(wù)器可能會(huì)允許客戶端這樣做,但進(jìn)程可能會(huì)停止進(jìn)入GC暫停逗概,或者網(wǎng)絡(luò)可能很慢或其他什么原因弟晚,所以客戶端可能會(huì)在鎖已經(jīng)過(guò)期的情況下收到 "OK,鎖是你的 "的消息逾苫,這已經(jīng)太晚了卿城。然而,你可以做很多事情來(lái)避免你的進(jìn)程沉睡很長(zhǎng)時(shí)間铅搓,你也不能做很多事情來(lái)避免網(wǎng)絡(luò)延遲瑟押,所以在獲得鎖之前/之后檢查時(shí)間的步驟,看看還有多少時(shí)間星掰,實(shí)際上應(yīng)該是常見(jiàn)的做法多望,即使是在使用其他實(shí)現(xiàn)過(guò)期鎖的系統(tǒng)。
是否同步氢烘?
在某些時(shí)候怀偷,Martin談到了Redlock使用延遲重啟節(jié)點(diǎn)的事實(shí)。這同樣需要能夠或多或少地等待指定的時(shí)間播玖,如上文所述椎工。再次重復(fù)同樣的事情是沒(méi)有用的。
然而關(guān)于這一點(diǎn)蜀踏,重要的是维蒙,這一步是可選的。你可以配置每個(gè)Redis節(jié)點(diǎn)在每次操作時(shí)進(jìn)行fsync脓斩,這樣木西,當(dāng)客戶端收到回復(fù)時(shí),它就知道鎖已經(jīng)持久化在磁盤(pán)上了随静。這就是其他大多數(shù)提供強(qiáng)擔(dān)保的系統(tǒng)的工作方式八千。Redlock非常有趣的一點(diǎn)是,你可以通過(guò)實(shí)現(xiàn)延遲重啟來(lái)選擇不涉及任何磁盤(pán)燎猛。這意味著用幾個(gè)Redis實(shí)例就可以每秒處理幾十萬(wàn)個(gè)鎖恋捆,這在其他系統(tǒng)中是無(wú)法實(shí)現(xiàn)的。
GPS裝置與本地計(jì)算機(jī)時(shí)鐘的對(duì)比
回到系統(tǒng)模型重绷,使Redlock系統(tǒng)模型實(shí)用的一點(diǎn)是沸停,你可以假設(shè)一個(gè)進(jìn)程永遠(yuǎn)不會(huì)與系統(tǒng)時(shí)鐘發(fā)生分區(qū)。請(qǐng)注意昭卓,這與其他使用GPS單元的半同步模型不同愤钾,因?yàn)樵谶@種情況下瘟滨,有兩種非明顯的分區(qū)可能發(fā)生。
GPS被隔斷在GPS網(wǎng)絡(luò)之外能颁,所以它不能獲得一個(gè)固定值杂瘸。
進(jìn)程和GPS不能交換信息,或者交換的信息有延遲伙菊。
上述問(wèn)題可能會(huì)導(dǎo)致失效或安全違規(guī)败玉,這取決于系統(tǒng)的協(xié)調(diào)方式(安全問(wèn)題只有在設(shè)計(jì)錯(cuò)誤時(shí)才會(huì)發(fā)生,例如镜硕,如果GPS異步更新系統(tǒng)時(shí)間运翼,那么,當(dāng)GPS不工作時(shí)兴枯,絕對(duì)時(shí)間誤差可能會(huì)超過(guò)最大界限)血淌。
Redlock系統(tǒng)模型沒(méi)有這些復(fù)雜性,也不需要額外的硬件念恍,只需要計(jì)算機(jī)時(shí)鐘六剥,甚至是一個(gè)非常便宜的時(shí)鐘晚顷,由于晶體溫度和其他影響精度的東西峰伙,會(huì)有所有明顯的偏差。
結(jié)論
我認(rèn)為Martin對(duì)于單調(diào)的API是有道理的该默,Redis和Redlock的實(shí)現(xiàn)應(yīng)該使用它來(lái)避免由于系統(tǒng)時(shí)鐘被改變而引起的問(wèn)題瞳氓。然而,我無(wú)法確定影響Redlock安全性的其他分析點(diǎn)栓袖,正如上面所解釋的那樣匣摘,我也不認(rèn)為他的最后結(jié)論是合理的,即在需要互斥保證時(shí)人們不應(yīng)該使用Redlock裹刮。
如果能從專家那里得到更多的反饋音榜,并且用Jepsen或類似的工具測(cè)試該算法,以積累更多的數(shù)據(jù)捧弃,那將是非常好的赠叼。
衷心感謝幫助我審核這篇文章的朋友。
blog comments powered by Disqus