Vector Clock理解
背景
近期在重讀“Dynamo: Amazon’s Highly Available Key-value Store”(經(jīng)典好文,推薦!)。文章4.4 中聊到了Data Version
為了提高可用性,Dynamo同意“更新”操作異步的傳播到其他副本,當(dāng)出現(xiàn)多個(gè)寫事件并發(fā)運(yùn)行時(shí),可能會導(dǎo)致系統(tǒng)中出現(xiàn)多個(gè)版本號的對象。
因?yàn)槲覀儫o法保證分布式系統(tǒng)中的多個(gè)結(jié)點(diǎn)的物理時(shí)鐘是完美同步的,所以通過物理時(shí)鐘來確定事件的時(shí)序是不靠譜的,但我們能夠通過基于事件的邏輯時(shí)鐘來構(gòu)建部分有序的事件時(shí)序集合
Dynamo通過Vector Clock來構(gòu)建同一對象多個(gè)事件的部分有序的時(shí)序集合
須要特別說明的是,Vector Clock能解決分布式系統(tǒng)多版本號合并的問題,可是對于確實(shí)發(fā)生沖突的版本號,它無法合并,而須要用戶自己去做合并
另外,lamport大神寫的“Time Clocks and the Ordering of Events in a Distributed System”能夠覺得是Vector Clock的理論基礎(chǔ)。有興趣同學(xué)能夠看看
簡述
Vector Clock是一個(gè)向量。向量的每一個(gè)分量為(node,count),node即為分布式系統(tǒng)的節(jié)點(diǎn),count為相應(yīng)節(jié)點(diǎn)上的版本號,在處理事件前count會對將該值遞增,當(dāng)它須要和其他節(jié)點(diǎn)進(jìn)行同步的時(shí)候也會把count帶上。
通過比較這些向量的大小。來確定事件發(fā)生的順序。
假如一個(gè)向量的全部分享量的count值都小于或等于還有一個(gè)向量。能夠覺得后者并前者更"新"
否則。存在沖突
演示樣例
1.“用戶A在N1節(jié)點(diǎn)上設(shè)置x=100” ? ------------ ?節(jié)點(diǎn)N1生成向量<(N1,1)>
2.“用戶A在N1節(jié)點(diǎn)上設(shè)置x=200” ? ------------ ?節(jié)點(diǎn)N1生成向量<(N1,2)>
3.“N1將x=200傳播到N2” ----------- ?節(jié)點(diǎn)N2生成向量<(N1,2)>
4.“N1將x=200傳播到N3” ----------- ? 節(jié)點(diǎn)N3生成向量<(N1,2)>
5.“用戶A在N2節(jié)點(diǎn)上設(shè)置x=300” ? ------------ ?節(jié)點(diǎn)N2生成向量<(N1,2), (N2,1)>
6.“用戶B在N3節(jié)點(diǎn)上設(shè)置x=400” ??----------- ?節(jié)點(diǎn)N3生成向量<(N1,2), (N3,1)>
此時(shí)各個(gè)節(jié)點(diǎn)的向量
N1:?<(N1,2)>
N2:<(N1,2), (N2,1)>
N3:<(N1,2), (N3,1)>
插入一個(gè)知識點(diǎn)Quorum NRW模型:
N: 復(fù)制的節(jié)點(diǎn)數(shù)量
R: 成功讀操作的最小節(jié)點(diǎn)數(shù)
W: 成功寫操作的最小節(jié)點(diǎn)數(shù)
僅僅需W + R > N。就能夠保證強(qiáng)一致性。
此處我們的N=3
當(dāng)須要高可寫的系統(tǒng)時(shí),能夠設(shè)置W=1 R=3
當(dāng)須要高可讀的系統(tǒng)時(shí)。能夠設(shè)置W=3 R=1
如果此處R=3 W=1
7.有個(gè)讀x的事件
client其拿到N1,N2,N3上的向量,通過比較可知,N1上的是舊數(shù)據(jù),N2/N3版本號存在沖突,此時(shí)須要用戶自己去解決沖突
轉(zhuǎn)載于:https://www.cnblogs.com/bhlsheji/p/5092591.html
總結(jié)
以上是生活随笔為你收集整理的Vector Clock理解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [bzoj2055]80人环游世界[网络
- 下一篇: Jmeter教程索引贴