副本數據一致性的一些分析

目錄

一致性模型分析

線性一致性(強一致性,strict consistency)

順序一致性(Sequential Consistency)

因果一致性(Casual Consistency)

騰訊朋友圈的例子

參考資料


一致性模型分析

線性一致性(強一致性,strict consistency)

對一致性的要求:

  • 任何一次讀都能讀到某個數據的最近一次寫的數據。
  • 系統中的所有進程,看到的操作順序,都和全局時鐘下的順序一致。

顯然這兩個條件都對全局時鐘有非常高的要求。強一致性只是存在理論中的一致性模型,比它要求更弱一些的,是順序一致性。

順序一致性(Sequential Consistency)

對一致性的要求:

  • 任何一次讀都能讀到某個數據的最近一次寫的數據。
  • 允許系統中的所有進程形成自己合理的統一的一致性,不需要與全局時鐘下的順序都一致。

在設計和證明運行在該計算機上的多進程算法[1]-[3]的正確性時,通常基於如下假設:執行結果與這些處理器以某一串行順序執行的結果相同,同時每個處理器內部操作的執行看起來又與程序描述的順序一致。滿足該條件的多處理器系統我們就認爲是sequential consistent的"。這裏的處理器就代表了一個獨立的執行進程(或線程),每個進程(線程)內部是串行執行的。如果並行執行的結果與某個合法的串行執行順序(在這個執行順序中每個線程內部的執行順序要保留)的執行結果一致,我們就認爲它是符合順序一致性的

  • 圖a是滿足順序一致性,但是不滿足強一致性的。原因在於,從全局時鐘的觀點來看,P2進程對變量X的讀操作在P1進程對變量X的寫操作之後,然而讀出來的卻是舊的數據。但是這個圖卻是滿足順序一致性的,因爲兩個進程P1,P2的一致性並沒有衝突。從這兩個進程的角度來看,順序應該是這樣的:Write(y,2) , Read(x,0) , Write(x,4), Read(y,2),每個進程內部的讀寫順序都是合理的,但是顯然這個順序與全局時鐘下看到的順序並不一樣。
     
  • 圖b滿足強一致性,因爲每個讀操作都讀到了該變量的最新寫的結果,同時兩個進程看到的操作順序與全局時鐘的順序一樣,都是Write(y,2) , Read(x,4) , Write(x,4), Read(y,2)。
  • 圖c不滿足順序一致性,當然也就不滿足強一致性了。因爲從進程P1的角度看,它對變量Y的讀操作返回了結果0。那麼就是說,P1進程的對變量Y的讀操作在P2進程對變量Y的寫操作之前,這意味着它認爲的順序是這樣的:write(x,4) , Read(y,0) , Write(y,2), Read(x,0),顯然這個順序又是不能被滿足的,因爲最後一個對變量x的讀操作讀出來也是舊的數據。因此這個順序是有衝突的,不滿足順序一致性。

因果一致性(Casual Consistency)

又比順序一致性降低:它僅要求有因果關係的操作順序得到保證,非因果關係的操作順序則無所謂。
因果相關的要求是這樣的:

  • 本地順序:本進程中,事件執行的順序即爲本地因果順序。
  • 異地順序:如果讀操作返回的是寫操作的值,那麼該寫操作在順序上一定在讀操作之前。
  • 閉包傳遞:和時鐘向量裏面定義的一樣,如果a->b,b->c,那麼肯定也有a->c。

圖a滿足順序一致性,因此也滿足因果一致性,因爲從這個系統中的四個進程的角度看,它們都有相同的順序也有相同的因果關係。
圖b滿足因果一致性但是不滿足順序一致性,這是因爲從進程P3、P4看來,進程P1、P2上的操作因果有序,因爲P1、P2上的寫操作不存在因果關係,所以它們可以任意執行。不滿足一致性的原因,同上面一樣是可以推導出衝突的情況來。

騰訊朋友圈的例子

    在infoq分享的騰訊朋友圈的設計中,他們在設計數據一致性的時候,使用了因果一致性這個模型。用於保證對同一條朋友圈的回覆的一致性,比如這樣的情況:

  A發了朋友圈內容爲梅里雪山的圖片。

  B針對內容a回覆了評論:“這裏是哪裏?”

  C針對B的評論進行了回覆:”這裏是梅里雪山“。

  那麼,這條朋友圈的顯示中,顯然C針對B的評論,應該在B的評論之後,這是一個因果關係,而其他沒有因果關係的數據,可以允許不一致。

  微信的做法是:

  每個數據中心,都自己生成唯一的、遞增的數據ID,確保能排重。在下圖的示例中,有三個數據中心,數據中心1生成的數據ID模1爲0,數據中心1生成的數據ID模2爲0,數據中心1生成的數據ID模3爲0,這樣保證了三個數據中心的數據ID不會重複全局唯一。

  每條評論都比本地看到所有全局ID大,這樣來確保因果關係,這部分的原理前面提到的向量時鐘一樣。

 



  有了這個模型和原理,就很好處理前面針對評論的評論的順序問題了。

  假設B在數據中心1上,上面的ID都滿足模1爲0,那麼當B看到A的朋友圈時,發表了評論,此時給這個評論分配的ID是1,因此B的時鐘向量數據是[1]。

  假設C在數據中心2上,上面的ID都滿足模2爲0,當C看到了B的評論時,針對這個評論做了評論,此時需要給這個評論分配的ID肯定要滿足模2爲0以及大於1,評論完畢之後C上面的時鐘向量是[1,2]。

  假設A在數據中心3上,上面的ID都滿足模3爲0,當A看到B、C給自己的評論時,很容易按照ID進行排序和合並--即使A在收到C的數據[1,2]之後再收到B的數據[1],也能順利的完成合並。

 

參考資料


微信朋友圈技術之道 http://www.infoq.com/cn/presenta ... y-of-weixin-moments

《分佈式計算-原理、算法與系統》

《分佈式系統一致性的發展歷史 (一)》

https://blog.csdn.net/hit_shaoqi/article/details/79515335

http://udn.yyuap.com/thread-109249-1-1.html

https://www.jianshu.com/p/dcead11b3da9

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章