分散式系統閱讀筆記(二十二)-----時鐘和時鐘同步
時鐘的基本概念
時鐘
時鐘在一般意義上指的是一個計算機的物理時間,每個計算機都會包括他們自己的物理時鐘,不同的計算機的物理可能會不同。
時鐘漂移
經過在同個地方的計算機,他們的物理也有可能會不一樣,如果他們從剛剛開始相同的時間計時開始,過了1過月,1年也可能會有快又慢,這在專業名詞上講叫做時間漂移。本質的原因是每秒的時間偏移,經過日記月累之後,就會有可能達到1秒鐘的差距,解決的辦法很簡單,就是過一段時間之後,將時間糾正回來就可以了。
UTC
UTC全稱是Coordinated Universal Time,協調世界時,又稱世界統一時間,用來進行高進度時間的同步。協調世界時以原子時秒長為基礎,在此時刻上儘量接近於世界時的一種時間計量系統。
同步物理時間
同步物理時間的主要手段分為2個External synchronization,靠的是UTC協調世界時,給定一個邊界值D>0, 滿足條件|S(t)-Ci(t)|<D,另外1個是Internal synchronization,同樣給定時間邊界D,相互之間進行同步,|Ci(t)-Cj(t)|<D。
同步系統中的時間同步
我們首先在一般情況下進行考慮,比如2個程序,相互之間只允許進行訊息傳遞來進行通訊,如何進行事件同步,假設傳輸的時間為T(trans),假設傳送程序P1傳送的時間為t,則P2的時間應該設定成t+T(trans),這個很好理解,基於這個思路繼續,傳送的傳輸時間一般不可能是固定的,可能受網路環境的影響或快或慢,所以定義了傳輸的時間上界
Cristian時鐘同步方法
Cristian的方法利用了時間伺服器,連線上裝置並且能夠接受從UTC資源發來的訊號進行同步,以UTC的時間作為同步的時間。定義一個程序p,一個TimeServer s,請求訊息為M(r),接收訊息M(r),M(r)中包含了從時間伺服器中獲取的最新的時間,程序p記錄了收發的總延時T(round),則程序p接收到訊息後,他的時間應該是p(t)=M(r)中的時間t+T(round)/2。方法大體的思路就是如此,重新體會一下這個方法有什麼弊端,明顯的一點是單點瓶頸問題,因為伺服器是單一伺服器,隨時都可能掛,所以我們可以聯想到的解決辦法是提供伺服器叢集組的方式處理,這時單點問題解決了,但是萬一有些程序故意發錯的時間給接收程序呢,如何處理,這是一個典型的拜占庭將軍問題了,這個暫時不討論,下面的演算法可以幫我們解決這個問題。
The Berkeley Algorithm
這個演算法用的是Internal synchronization的方法,給定一組計算機,選出一個作為Coordinator,作為master,這個master選擇機器中將要被同步的機器,叫做slave,通過計算與這些機器之間進行時間交換,平均快的和慢的時間,最終達到時間一致性,在比較的過程中,就可以排除明顯偏差大的時間了。
The Network Time Protocol
Cristian和Berkeley演算法都是偏向於用於小規模的內網中,而Network Time Protocol則是一種在因特網上的分散式時間服務。他定義了Time Service的結構。NTP有下面幾個特點。
1、NTP提供了一個客戶端可以從網路中精準同步UTC時間的客戶端。
2、服務端通過介面的形式方便客戶端的呼叫。
3、NTP伺服器與伺服器之間的時間同步是以層級控制的方式構成。1級節點同步2個2級節點,2(1)可能又同步2個3級節點,2(2)也可能2個3級節點。其中的時間互動協議通過資訊之間的交換。
邏輯時間和時鐘
邏輯時間,從字面上理解當然不同於物理時間,在分散式系統中,運用邏輯時間的例子也不少,假設L(i)表示的是訊息事件的發生事件,當p1程序接收到的時候,就需要對時間做遞增操作,L(i) = L(i) + 1,邏輯意義上的時間增加。
全域性有序邏輯時間--Vector Clock
Vector Clock是向量時鐘,可以可以保證全域性有序的邏輯時間,通過V<t1, t2, t3....>ti儲存了Pi程序的當前進行到的時間,當程序Pi接收到相應的訊息事件時,則在對應的位置上ti上進行ti = ti + 1的操作,當做Vector Clock向量比較的時候,需要對V每個位置上進行比較,如果V1中的ti全部小於V2中的ti時,才算事件1早於事件2發生。
參考文獻:<<Distributed
Sysytems Concepts And Design>>原版第五版,author:George Coulouris,Jean Dollimore, Tim Kindberg,Gordon Blair