<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    jinfeng_wang

    G-G-S,D-D-U!

    BlogJava 首頁 新隨筆 聯系 聚合 管理
      400 Posts :: 0 Stories :: 296 Comments :: 0 Trackbacks
    http://www.cnblogs.com/bangerlee/p/5448766.html

     

    十六號…… 四月十六號。一九六零年四月十六號下午三點之前的一分鐘你和我在一起,因為你我會記住這一分鐘。從現在開始我們就是一分鐘的朋友,這是事實,你改變不了,因為已經過去了。我明天會再來。

        —— 《阿飛正傳》

     

    現實生活中時間是很重要的概念,時間可以記錄事情發生的時刻、比較事情發生的先后順序。分布式系統的一些場景也需要記錄和比較不同節點間事件發生的順序,但不同于日常生活使用物理時鐘記錄時間,分布式系統使用邏輯時鐘記錄事件順序關系,下面我們來看分布式系統中幾種常見的邏輯時鐘。

     

    物理時鐘 vs 邏輯時鐘

    可能有人會問,為什么分布式系統不使用物理時鐘(physical clock)記錄事件?每個事件對應打上一個時間戳,當需要比較順序的時候比較相應時間戳就好了。

     

    這是因為現實生活中物理時間有統一的標準,而分布式系統中每個節點記錄的時間并不一樣,即使設置了 NTP 時間同步節點間也存在毫秒級別的偏差[1][2]。因而分布式系統需要有另外的方法記錄事件順序關系,這就是邏輯時鐘(logical clock)。

     

     

    Lamport timestamps

    Leslie Lamport 在1978年提出邏輯時鐘的概念,并描述了一種邏輯時鐘的表示方法,這個方法被稱為Lamport時間戳(Lamport timestamps)[3]

    分布式系統中按是否存在節點交互可分為三類事件,一類發生于節點內部,二是發送事件,三是接收事件。Lamport時間戳原理如下:

    圖1: Lamport timestamps space time (圖片來源: wikipedia)

    1. 每個事件對應一個Lamport時間戳,初始值為0
    2. 如果事件在節點內發生,時間戳加1
    3. 如果事件屬于發送事件,時間戳加1并在消息中帶上該時間戳
    4. 如果事件屬于接收事件,時間戳 = Max(本地時間戳,消息中的時間戳) + 1

     

    假設有事件a、b,C(a)、C(b)分別表示事件a、b對應的Lamport時間戳,如果C(a) < C(b),則有a發生在b之前(happened before),記作 a -> b,例如圖1中有 C1 -> B1。通過該定義,事件集中Lamport時間戳不等的事件可進行比較,我們獲得事件的偏序關系(partial order)。

     

    如果C(a) = C(b),那a、b事件的順序又是怎樣的?假設a、b分別在節點P、Q上發生,Pi、Qj分別表示我們給P、Q的編號,如果 C(a) = C(b) 并且 Pi< Qj,同樣定義為a發生在b之前,記作 a => b。假如我們對圖1的A、B、C分別編號Ai = 1、Bj = 2、Ck = 3,因 C(B4) = C(C3) 并且 Bj < Ck,則 B4 => C3。

     

    通過以上定義,我們可以對所有事件排序、獲得事件的全序關系(total order)。上圖例子,我們可以從C1到A4進行排序。

     

    Vector clock

    Lamport時間戳幫助我們得到事件順序關系,但還有一種順序關系不能用Lamport時間戳很好地表示出來,那就是同時發生關系(concurrent)[4]。例如圖1中事件B4和事件C3沒有因果關系,屬于同時發生事件,但Lamport時間戳定義兩者有先后順序。

     

    Vector clock是在Lamport時間戳基礎上演進的另一種邏輯時鐘方法,它通過vector結構不但記錄本節點的Lamport時間戳,同時也記錄了其他節點的Lamport時間戳[5][6]。Vector clock的原理與Lamport時間戳類似,使用圖例如下:

     

    圖2: Vector clock space time (圖片來源: wikipedia)

     

    假設有事件a、b分別在節點P、Q上發生,Vector clock分別為Ta、Tb,如果 Tb[Q] > Ta[Q] 并且 Tb[P] >= Ta[P],則a發生于b之前,記作 a -> b。到目前為止還和Lamport時間戳差別不大,那Vector clock怎么判別同時發生關系呢?

     

    如果 Tb[Q] > Ta[Q] 并且 Tb[P] < Ta[P],則認為a、b同時發生,記作 a <-> b。例如圖2中節點B上的第4個事件 (A:2,B:4,C:1) 與節點C上的第2個事件 (B:3,C:2) 沒有因果關系、屬于同時發生事件。

     

    Version vector

    基于Vector clock我們可以獲得任意兩個事件的順序關系,結果或為先后順序或為同時發生,識別事件順序在工程實踐中有很重要的引申應用,最常見的應用是發現數據沖突(detect conflict)。

     

    分布式系統中數據一般存在多個副本(replication),多個副本可能被同時更新,這會引起副本間數據不一致[7],Version vector的實現與Vector clock非常類似[8],目的用于發現數據沖突[9]。下面通過一個例子說明Version vector的用法[10]

    圖3: Version vector

     

    • client端寫入數據,該請求被Sx處理并創建相應的vector ([Sx, 1]),記為數據D1
    • 第2次請求也被Sx處理,數據修改為D2,vector修改為([Sx, 2])
    • 第3、第4次請求分別被Sy、Sz處理,client端先讀取到D2,然后D3、D4被寫入Sy、Sz
    • 第5次更新時client端讀取到D2、D3和D4 3個數據版本,通過類似Vector clock判斷同時發生關系的方法可判斷D3、D4存在數據沖突,最終通過一定方法解決數據沖突并寫入D5

     

    Vector clock只用于發現數據沖突,不能解決數據沖突。如何解決數據沖突因場景而異,具體方法有以最后更新為準(last write win),或將沖突的數據交給client由client端決定如何處理,或通過quorum決議事先避免數據沖突的情況發生[11]

     

    由于記錄了所有數據在所有節點上的邏輯時鐘信息,Vector clock和Version vector在實際應用中可能面臨的一個問題是vector過大,用于數據管理的元數據(meta data)甚至大于數據本身[12]

     

    解決該問題的方法是使用server id取代client id創建vector (因為server的數量相對client穩定),或設定最大的size、如果超過該size值則淘汰最舊的vector信息[10][13]

     

    小結

    以上介紹了分布式系統里邏輯時鐘的表示方法,通過Lamport timestamps可以建立事件的全序關系,通過Vector clock可以比較任意兩個事件的順序關系并且能表示無因果關系的事件,將Vector clock的方法用于發現數據版本沖突,于是有了Version vector。

     

    [1] Time is an illusion, George Neville-Neil, 2016

    [2] There is No Now, Justin Sheehy, 2015

    [3] Time, Clocks, and the Ordering of Events in a Distributed System, Leslie Lamport, 1978

    [4] Timestamps in Message-Passing Systems That Preserve the Partial Ordering, Colin J. Fidge, 1988

    [5] Virtual Time and Global States of Distributed Systems, Friedemann Mattern, 1988

    [6] Why Vector Clocks are Easy, Bryan Fink, 2010

    [7] Conflict Management, CouchDB

    [8] Version Vectors are not Vector Clocks, Carlos Baquero, 2011

    [9] Detection of Mutual Inconsistency in Distributed Systems, IEEE Transactions on Software Engineering , 1983

    [10] Dynamo: Amazon’s Highly Available Key-value Store, Amazon, 2007

    [11] Conflict Resolution, Jeff Darcy , 2010

    [12] Why Vector Clocks Are Hard, Justin Sheehy, 2010

    [13] Causality Is Expensive (and What To Do About It), Peter Bailis ,2014

     

    posted on 2017-02-03 15:44 jinfeng_wang 閱讀(237) 評論(0)  編輯  收藏 所屬分類: 2016-thinking2016-zookeeper
    主站蜘蛛池模板: 亚洲一区精品无码| 97无码免费人妻超级碰碰夜夜| 国产成人一区二区三区免费视频| 2020久久精品亚洲热综合一本| 青草草色A免费观看在线| 亚洲酒色1314狠狠做| 色猫咪免费人成网站在线观看| 久久亚洲国产视频| 免费无码VA一区二区三区| 91亚洲精品第一综合不卡播放| 99久久国产免费中文无字幕| 亚洲国产精品一区二区久久| 97av免费视频| 亚洲xxxx18| 国产精品国产午夜免费福利看 | 亚洲福利在线播放| 性生大片视频免费观看一级| 亚洲国产电影av在线网址| 中文字幕无码免费久久9一区9| 久久综合九九亚洲一区| 无码精品国产一区二区三区免费 | 四虎永久免费影院| 有码人妻在线免费看片| 亚洲中文字幕日产乱码高清app| 国产免费一区二区视频| 亚洲日本在线观看网址| 卡1卡2卡3卡4卡5免费视频| 黄色一级毛片免费| 亚洲国产高清人在线| 成人午夜免费福利| japanese色国产在线看免费| 久久久亚洲AV波多野结衣| 暖暖在线日本免费中文| eeuss在线兵区免费观看| 麻豆亚洲AV永久无码精品久久| 成年在线观看免费人视频草莓| 99re6在线精品免费观看| 国产日本亚洲一区二区三区| 亚洲成a人片在线观看日本麻豆 | 国产免费高清69式视频在线观看 | 一级特黄录像视频免费|