分散式與網路作業系統

時鐘同步(clock synchronization)

每台電腦都有自己的一個小時鐘在嘀嗒走著,而這裡有個出人意料之處:沒有任何兩個時鐘是一致的。便宜的時鐘會漂移——一個一天快幾秒、另一個慢幾秒——所以在一個網路裡,每台機器對「現在」的認知都略有不同。聽起來無害,直到你試著去比較跨機器的事件:伺服器 A 上的下單,是發生在伺服器 B 上的付款之前還是之後?如果它們的時鐘不一致,時間戳記就在說謊。時鐘同步就是設法把所有這些各自獨立的實體時鐘,拉近到對真正的牆上時間取得一致。

最常見的工具是 NTP,網路時間協定。粗略地說,你的機器問一台更準確的時間伺服器「現在幾點?」,記下它送出問題與收到答案的時刻,再用這段來回時間去估計回覆在路上花了多久。然後它把自己的時鐘朝伺服器的時間調整,並針對那段估計出的網路延遲做修正。作業系統通常不會把時鐘往回猛拉(那可能讓時間看起來倒流、把程式弄壞),而是緩調它——溫和地讓它走快一點或慢一點,直到追上為止。時間伺服器形成一個階層,從頂端非常精準的參考時鐘(原子鐘、GPS)往下分層。

為什麼重要,以及那條硬限制:同步過的實體時鐘確實很有用——用於日誌時間戳記、用於會過期的安全憑證、用於排程。但你永遠無法讓它們完全相等,因為你永遠無法知道準確的「單向」網路延遲(你只能量出來回,而兩個方向可能不同)。所以總是留有至少幾毫秒的殘餘不確定性。這正是為什麼分散式系統在替事件排序時,常常乾脆放棄實體時間、改用邏輯時鐘(例如蘭波特時鐘),它捕捉因果順序,根本不需要同步過的牆上時間。

你筆電的時鐘漂移、慢了 4 秒。它向一台 NTP 伺服器問時間;來回花了 40 毫秒,於是它估計回覆抵達時大約已經是 20 毫秒前的,把這段加上去,再在接下來幾秒內溫和地把時鐘往前緩調、而不是直接跳過去,這樣就不會有任何程式看到時間像是倒流。

估計網路延遲,好把一個漂移中的時鐘輕推向真正的時間——但永遠不會完美。

同步過的時鐘是接近、絕非精確的,因為單向延遲是無法得知的。所以絕不要依賴來自不同機器的實體時間戳記去判定兩個相近事件的精確順序——那種事,請用邏輯時鐘。

又称
physical clock synchronization時鐘同步NTP (Network Time Protocol)