回家再修文,先發ㄌ
晚點要補一下前一篇的 failure detectors
介紹分散式系統中的時間,主要分為
這篇筆記在物理時間 3.1 3.2 不做太多著墨,
只需要知道因為誤差的關係,
分散式系統間的訊息傳遞不能以物理時間當作時戳,
否則可能會有時空旅行的可能。
3.3 會介紹邏輯時間的數學關係,以迎接第 4 章: Logical clock。
對於分散式系統來說,物理時間較少使用。
根據 atomic 時間,但會依據地球自轉而有所校正。
校正 UTC 來大致符合地球自轉。
每年可能 +- 1 秒,會提前公告。
而這個東西會造成很大的問題!!
通常程式會直接忽略 leap seconds,對於一些系統來說這是很嚴重的事情。
如果兩個時鐘都有各自的 drift,那他們的 skew 隨著時間增加,所以需要 sync。
i.e. a時鐘慢了1秒,b時鐘快了1秒,每秒這兩個時鐘差就多2秒。
clock server 的層級:
根據 client 和 server 的時間差,調整 client 時鐘的策略有 3 種:
所以單個電腦上要對某個動作計時,應該使用 monotonic clock。
如果是分散式系統,不得已得用 physical clock 來比較不同電腦的時間,則用 time-of-day clock。
再怎麼努力與 NTP sync,每個電腦上的物理時間還是有可能會有一點點誤差。
若以物理時間來重新排序訊息,一個不小心就可能時空旅行。
time skew > one way network delay?? 不太懂 3:27
定義 happens-before relation
a ->
b 代表 a happens-before
b iff
:
happens-before 是個 partial order,
有可能 既不是 a -> b 也不是 b -> a,稱之 concurrent。
a || b。
什麼?為什麼可以不是 a-> b 也不是 b-> a?
這可能小小的違反我們的直覺,
但 happens-before 關係是一種相對關係,
而我們直覺是基於物理時間的。
在分散式系統上,
如果不能使用物理時間,
那若沒有訊息傳遞,例如兩個 nodes 之間完全不聯繫,
我們無從去比較出兩個 node 上事件的 happens before relation 的。
concurrent 不代表 spontaneous!!
只是這兩個 events 不知道對方先發生還是後發生、無法比較而已。
happens-before relation 是一種可以討論分散式系統上事件之間因果關係的數學關係。
a -> b: a 可能 have caused b
a || b: a 不可能 have caused b
causal order
是代表
若 a causes b, then a happens before b?
似乎是從物理借鏡來的概念。
如果今天兩個事件發生的「距離夠遠」,就算時間很相近,但他們卻不會有關係,a 不可能影響 b。
分散式系統注重訊息的順序,其中也有同樣的概念,就是如果 a 跟 b 沒有 causal 關係的話,或許我們並不是很在意他們實際是不是在差不多的時間發生。
a || b : a 不可能 have caused b!