Mímisbrunnr知恵の泉

← 分散システム 一覧

🎓 レベル:標準 | 重要度:B(重要)

📎 前提:分散システムとは・なぜ難しいか | 関連:論理時計(Lamportタイムスタンプ)

要点(BLUF)

問題設定 ── 時計はなぜ信用できないか

水晶発振子の周波数は温度・電圧・個体差でわずかに違い、1日で数秒ずれることもあります(クロックドリフト)。さらにうるう秒やNTP補正で時刻が飛ぶ・巻き戻ることすらある。「サーバAの 10:00:00.100 はサーバBの 10:00:00.100 と同じ瞬間か?」は、原理的に保証できません。

仕組み ── NTPの往復推定

NTPはクライアントとサーバ間で4つのタイムスタンプを取り、**ネットワークが対称(行きと帰りが同遅延)**と仮定して片道遅延とオフセットを推定します。

sequenceDiagram
    participant C as クライアント
    participant S as NTPサーバ
    C->>S: 要求(送信時刻 t1)
    Note over S: 受信 t2、応答送信 t3
    S->>C: 応答(t1,t2,t3 を含む)
    Note over C: 受信 t4

往復遅延 δ とオフセット θ(クライアント時計をどれだけ進めるべきか):

δ=(t4t1)(t3t2)\delta = (t_4 - t_1) - (t_3 - t_2) θ=(t2t1)+(t3t4)2\theta = \frac{(t_2 - t_1) + (t_3 - t_4)}{2}

要するに何か:往復時間から「処理時間」を引いて純粋なネットワーク往復を出し、半分を片道とみなしてオフセットを補正する。対称性の仮定が崩れる(行きと帰りで経路が違う)と誤差が出ます。

正しさの観点 ── 同期では順序を保証できない

NTP同期後でも残差 ε(数ms)があります。2つのイベントの実時刻差が ε より小さいと、タイムスタンプの大小が実際の前後と逆になりえます。

tAtB<ε    順序は判定不能|t_A - t_B| < \varepsilon \;\Rightarrow\; \text{順序は判定不能}

つまり物理時計は「だいたいの時刻」には使えても、「因果の順序づけ」には使えない。ここが論理時計が必要になる分岐点です。

他手法との比較 ── 物理 / 論理 / TrueTime

方式何を保証代償
物理時計(NTP)実時刻に近い値順序づけ不可(誤差内は逆転)
論理時計(論理時計(Lamportタイムスタンプ)因果の順序実時刻とは無関係
TrueTime(Spanner)時刻を区間 [earliest, latest] で持ち、区間が重ならなければ順序確定専用GPS/原子時計・区間幅ぶん待つ(commit-wait)

TrueTime の発想は秀逸で、「誤差を消す」のでなく「誤差を明示して、重なる間だけ待つ」。これで物理時計を強一貫トランザクションに使えるようにしています。

なぜ分散だと難しいか(直観)

単一マシンなら1つの時計を全スレッドが共有でき、now() の順序=実際の順序。分散では時計がN個独立にずれ、しかも観測(同期)にネットワーク遅延が混ざる。「共通の今」という概念自体が無い、というのが核心です。

⚠️ よくある誤解・落とし穴

対応ラボ

なし(概念回)。順序づけは 論理時計(Lamportタイムスタンプ) のラボで論理時計として実証します。

関連

第2章 時間と順序 目次