# TrueTime ## 定義 TrueTime は Google が Spanner のために開発した時刻 API であり、時刻を単一値ではなく**不確実性区間 `[earliest, latest]`** として返すことを特徴とする。標準的な時刻インターフェースがクライアントに不確実性の概念を与えないのに対し、TrueTime はその区間を明示的に公開することで、分散システムが時刻の不確実性を正確に扱えるようにする。(Source: [[@2013__TOCS__Spanner - Google's Globally Distributed Database]]) **TrueTime API**: | メソッド | 戻り値 | |---|---| | `TT.now()` | `TTinterval: [earliest, latest]` — 現在の絶対時刻を必ず含む区間 | | `TT.after(t)` | t が確実に過去なら true | | `TT.before(t)` | t が確実に未来なら true | ε = 区間幅の半分。`TT.now()` 呼び出し時の絶対時刻 `tabs(enow)` について `tt.earliest ≤ tabs(enow) ≤ tt.latest` が保証される。 ## 実装 - **タイムマスターマシン**: データセンターごとに配置。大半は GPS レシーバを持ち、残りは原子時計(「Armageddon マスター」)を持つ。GPS と原子時計を組み合わせることで、それぞれの障害モードが非相関となる。 - **タイムスレーブデーモン**: 各マシンに 1 つ。Marzullo のアルゴリズムで嘘つき(liars)を排除し、正確なマスターの時刻に同期する。 - ドリフトレートの上限: 200μs/秒 - ポーリング間隔: 30 秒 - ε の典型値: 1〜7ms を鋸歯状に推移。平均 4ms。 - TrueTime の信頼性: 機械統計上、故障 CPU は故障クロックの 6 倍多く、クロックの問題は相対的に極めて稀。 ## 横断的知見 - **DDIA 第9章は TrueTime を「クロック信頼区間という一般設計原則の具体例」として相対化する**: Spanner 原論文([[@2013__TOCS__Spanner - Google's Globally Distributed Database]])は TrueTime を Spanner 固有の API 仕様として詳述するが、DDIA 第9章([[@2026__OReilly__Designing Data-Intensive Applications 2E - Chapter 9 The Trouble with Distributed Systems]] "Synchronized clocks for global snapshots")は「GPS/原子時計は ε を小さく保つための手段にすぎず、本質的に重要なのは不確実性区間そのものを持つこと」だと明言し、Amazon ClockBound や YugabyteDB の ClockBound 採用を「同じ設計原則の別実装」として並置する。原論文が実装の詳細(タイムマスターマシン・Marzullo のアルゴリズム)を主眼とするのに対し、教科書は「なぜこの設計が有効か」という一般原則として抽象化しており、両者は詳細レベルと一般化レベルで補完する。(Source: [[@2013__TOCS__Spanner - Google's Globally Distributed Database]], [[@2026__OReilly__Designing Data-Intensive Applications 2E - Chapter 9 The Trouble with Distributed Systems]] "Synchronized clocks for global snapshots") - **commit wait のコストは「区間の重なりを避けるための待機」という一般原則の具体化として再説明される**: DDIA 第9章は commit wait を「2 つの信頼区間が重ならなければ順序は確実に判定できる」という一般命題(*A<sub>earliest</sub> < A<sub>latest</sub> < B<sub>earliest</sub> < B<sub>latest</sub>* なら B は A の後)から導出し、Spanner がこの重なり回避のために区間長だけコミットを待機すると説明する。本ページの「実装」節が示す ε ≈ 4ms という具体値は、この一般原則のもとでの commit wait の実測コストと解釈できる。(Source: [[@2026__OReilly__Designing Data-Intensive Applications 2E - Chapter 9 The Trouble with Distributed Systems]] "Synchronized clocks for global snapshots") - **commit wait は「外部一貫性の保証」だけでなく「通信を伴わない線形化可能な ID 生成」という別の目的にも転用できる**: DDIA 第10章は、TrueTime のような不確実性区間を持つ物理クロックを使えば、ノード間の通信なしに線形化可能な ID を生成できると位置づける([[ID生成器と論理クロック]] を参照)。これは commit wait という同一の機構(`TT.after(s)` が真になるまで待機する)が、Spanner のトランザクションコミット順序の保証(外部一貫性)と、より一般的な ID 生成問題の両方を解く汎用プリミティブであることを示す。TiDB/TiKV のタイムスタンプオラクルが同じ問題を単一ノードの fetch-and-add で解くのとは対照的な、専用ハードウェア前提の解法である。(Source: [[@2026__OReilly__Designing Data-Intensive Applications 2E - Chapter 10 Consistency and Consensus]] "Implementing a linearizable ID generator") - **3 つ目の独立教科書が TrueTime の用途分類を裏付ける**: [[@2021__OReillyJapan__詳説 データベース - Chapter 13 分散トランザクション]]は Spanner の解説の中で TrueTime を「不確実性の境界を明らかにする高精度ウォールクロック API」と要約し、ローカル操作が不確実性の境界を過ぎるまで意図的に減速できると述べる。これは原論文([[@2013__TOCS__Spanner - Google's Globally Distributed Database]])の commit wait の説明と同じ機構を指しており、原論文・DDIA(第9章の一般原則としての抽象化)に続き 3 つ目の独立ソースが同一の用途理解に収束したことになる。ただし詳説 データベースはタイムマスターマシンや Marzullo のアルゴリズムなど実装細部には踏み込まず、Spanner のアーキテクチャ解説の一部として簡潔に触れるにとどまる。(Source: [[@2021__OReillyJapan__詳説 データベース - Chapter 13 分散トランザクション]] §13.5, [[@2013__TOCS__Spanner - Google's Globally Distributed Database]]) ## 未解決の問い - GPS と原子時計を持たない環境(パブリッククラウド、エッジ環境)で同等の不確実性保証を達成する手法は存在するか? - ε を 1ms 以下に安定させることは現実的か? 論文は「不可能な障害はない」と述べるが具体的な実験値は未公開。 - TrueTime の設計は Google が特許取得しているか? 他社の類似システム(Amazon Time Sync Service 等)との比較は? - DDIA が並置する Amazon ClockBound・YugabyteDB は、TrueTime と同じ「信頼区間 API」という設計原則を採用しつつ ε の実測値がどの程度異なるか。専用ハードウェアなしでの信頼区間の実用的な下限はどこにあるか([[クロック同期と信頼性]] も参照)。 ## Spanner での用途 [[@2013__TOCS__Spanner - Google's Globally Distributed Database]]では以下の用途に使われる: 1. **外部一貫性保証**: Commit wait(`TT.after(s)` が真になるまで待機)で `s < tabs(e^commit)` を確保。 2. **Paxos リーダーリースの不整合性証明**: リース区間の disjointness を TrueTime で証明し、余分なログ書き込みを不要にする。 3. **アトミックスキーマ変更**: 未来のタイムスタンプを `TT.now().latest` を超えた値で登録し、その時刻に達するまでの操作との整合性を確保する。 ## 関連 - ソース: [[@2013__TOCS__Spanner - Google's Globally Distributed Database]] / [[@2026__OReilly__Designing Data-Intensive Applications 2E - Chapter 9 The Trouble with Distributed Systems]] / [[@2026__OReilly__Designing Data-Intensive Applications 2E - Chapter 10 Consistency and Consensus]] / [[@2021__OReillyJapan__詳説 データベース - Chapter 13 分散トランザクション]] - 概念: [[外部一貫性]] / [[分散トランザクション]] / [[クロック同期と信頼性]] / [[ID生成器と論理クロック]] - エンティティ: [[Google]] / [[James C. Corbett]] / [[Jeffrey Dean]] / [[Spanner]] ## 出典 - [[@2013__TOCS__Spanner - Google's Globally Distributed Database]](TOCS 2013 / OSDI 2012) - [[@2026__OReilly__Designing Data-Intensive Applications 2E - Chapter 9 The Trouble with Distributed Systems]] "Clock readings with a confidence interval", "Synchronized clocks for global snapshots" - [[@2026__OReilly__Designing Data-Intensive Applications 2E - Chapter 10 Consistency and Consensus]] "Implementing a linearizable ID generator" - [[@2021__OReillyJapan__詳説 データベース - Chapter 13 分散トランザクション]](§13.5 Spanner アーキテクチャ解説内での TrueTime の用途要約)