時間同期とドリフト
1)時間が建築部品である理由
TTLトークンと証明書、RPC期限、イベントオーダー、ログと分析、コンセンサスとロック。数十から数百ミリ秒のエラーは次のことができます:- break Kerberos/OAuth/JWT ('iat/nbf/exp'フィールド);
- メトリクス/トレイルとアラートを歪めます。
- ドロップブローカー/クライアント(タイムアウト、レトレイ、指数関数バックオフ);
- 分散されたシナリオで秩序と偶像性を破壊します。
- オフセット-参照からの現地時間の差。
- スキュー-ノード間のオフセットの違い。
- ドリフト-補正がない場合のクロックドリフト速度(ppm)。
- ジッタ-遅延/測定の可変性。
2)ソースとタイムプロトコル
2.1 NTP(ネットワークタイムプロトコル)
Strata (Stratum 1-GNSS/ラジオから直接、Stratum 2-Stratum 1など)。
2つの方法で修正:- slw(適用のために安全な滑らかな頻度調節);
- ステップ(タイムジャンプ;prodaで望ましくない)。
- 実装:chrony、 ntpd、 systemd-timesyncd。サーバーの場合は、chronyが好ましいです。
2.2 NTS (NTP over TLS)
認証された同期(MITM保護とタイムスプーフィング)。
外部タイムサーバにおすすめです。
2.3 PTP/IEEE 1588
NIC/ToR、ミリ秒、マイクロ秒精度のハードウェアタイムスタンプ。
モード:境界/透明な時計、電気通信/企業のプロフィール。
p99-order、 HFT/telecom/industryのハードSLOに使用します。
2.4 GNSS (GPS/GLONASS)およびPPS
ローカルレシーバは、Stratum 1のPPS(パルス/秒)参照を提供します。
なりすまし/詰め込むことを考慮することは重要です-アンテナを取付け、完全性を監視して下さい。
2.5雲
クラウドソース(内部層プール)は、VPC内のオフセットとジッタを削減します。
ハイブリッド環境では、ローカル参照とクラウド参照を組み合わせます。
3) OSおよびハードウェアの時間
TSC/HPET/RTC:現代CPUは高速モノトーンカウンターとしてTSCを保持します。周波数(不変TSC)を修正します。
仮想化/コンテナ:より頻繁にドリフトと「ジャンプ」。ハイパーバイザ-厳格なタイムサービス。離れて-クロニー。
省電力はタイマーの単調さを妨げる可能性があります-BIOS/UEFIオプションを確認してください。
4)単調および「壁」の腕時計
ウォールクロック(リアルタイム、TZ/UTC)-ログ、イベントタグ、人々のために。
モノトニッククロック-間隔/タイムアウトを測定します。
- Linux: 'CLOCK_MONOTONIC'。
- C++: 'std:: chrono:: steady_clock'。
- Go:組み込みのモノトーン部品の時間。時間の間隔。
- Java:'システム。nanoTime()'は、カレンダーではなく、
ルール:締め切りと後退-単調な時計に;シリアライズ/ロギング-UTCで。
5)跳躍の第2/」跳躍の汚れ」およびカレンダートラップ
2番目の跳躍は「00:59:60」を引き起こしたり、タイマー/メトリックで2番目の→ループを繰り返す可能性があります。
アプローチ:- スミア(N時間で秒の滑らかな塗り)。
- ステップ(望ましくない)。
- ロジックのためのローカルTZ/daylightの保存時間に決して頼りません;UTCを保存し、ユーザーのTZに表示します。
- TZDB(タイムゾーンベース)を更新する-政治的変化が起こる。
6)「壁」の信頼のない順序の調整"
ランポート時計とベクトル時計は物理時計なしの因果関係です。
ハイブリッド論理クロック(HLC)-物理的な時間とカウンタを組み合わせ、小さなスキューに耐性があります。
TrueTime-likeモデル-間隔'[earliest、 latest]'を返し、シリアル化のためにコミット待ちが必要です。
7)プロトコルおよびシステムへの時間の影響
セキュリティ:Kerberosは小さなスキュー(通常± 5分)を許可し、TLS/証明書は'notBefore/notAfter'、 JWTは'exp/nbf/iat'に敏感です。
ブローカー/キュー:タスクの締め切り/表示タイムアウトは、正しい時間に依存します。
DBMS/クラスタ: 'updated_at '/tsによるバージョン競合-HLC/versionsと入力し「、raw」ウォールタイムスタンプを比較しません。
ストリーミング:イベント時間と処理時間を区別します。透かしと遅延を設定します。
Kron/planners:ドリフトは「スティッキング「/ダブルスタートにつながります。モノトーン間隔とデダップキーを使用します。
8)観察可能性および時間SLO
8.1メトリクス
時間だよ。offset_ms'(参照にオフセット)、'time。jitter_ms'、 'stratum'、 'root_delay'、 'root_dispersion'。
PTP: 'path_delay'、 'grandmaster_offset'、 'gm_identity'、 'clock_class'。
アラート:offset> threshold(例えば、100-500 ms)、 source loss、 step correction。
8.2 Diagnostics
'chronyc tracking/sourcestats'
'ntpq -p'、 'ntpstat'
PTP: 'pmc'、ベンダーNIC/ToRユーティリティ。
8.3 SLO/誤った予算
SLOの例: "中央オフセット≤ 1ミリ秒、p99オフセット≤ 25ミリ秒、本番ノードのステップなし;PTP grandmasterフェイルオーバー≤ 2秒"
9)コンフィギュレーションプラクティス(Linux/containers/K8s)
9.1クロニー(推奨)
例('/etc/chrony/chrony。conf'):
pool time. example. org iburst maxsamples 9 nts makestep 0. 5 1 # one step at big error at start rtcsync # synchronize hardware clock leapsectz right/UTC # leap seconds from tzdata driftfile/var/lib/chrony/drift
便利なオプション:
- 'maxsources'、 'minsamples/maxsamples'、 'maxslewrate'。
- 絶縁DCの場合-ローカルリファレンス+GPS/PPS。
9.2コンテナとアセンブリ
ホスト上で同期します。コンテナはコアを使用します。
In K8s-DaemonSetとクロニーまたはノードレベルのタイムエージェント;アプリケーションが時間を追加するのを防ぎます。
9.3 PTPスタック
ハードウェアタイムスタンプ、PTPデーモン、ToRの境界クロックを備えたNIC。
PTPドメインの多様性(プロファイル)、「悪い」グランドマスターに対する保護。
10)時間の保証
NTS/認証されたNTP、フィルタおよびレートリミット(NTPゲイン-DDoSベクトル)。
PTPセキュリティ:L2分離、マルチキャストACL、 GMスプーフィング監視。
GNSS:良好な可視性を持つアンテナ、なりすまし/検出器を詰め込む、フォールバック源。
11)工学パターンおよびコード
11.1締め切り/タイムアウト
絶対的なウォールタイムスタンプではなく、「monotone start+delta」として期限を保存します。
常にskewにstockを追加します(例えば、期待されるp99-skewの2 ×をTTLトークンに追加します)。
11.2バージョン比較
ノード間で'updated_at'に依存しないでください。使用して下さい:- バージョン管理/ETag;
- HLC/seq;
- 楽観的な閉塞。
11.3ログとトレース
常にUTC;エージェント・ログにホストの'time_offset_ms'フィールドを含める。
トレースイベントでイベントタイムを接着します。
11.4跳躍秒の処理
すべてのノードでポリシー(smear/step)を均一に選択します。
Test:メトリクスは1秒間に「ブレーク」すべきではありません。
12)ドメインへの影響
Auth:トークン-「クロックスキュー手当」を考慮してください(例:± 2-5分)。
支払い/タイムセグメント:絶対的な時間ではなく、間隔を丸めます。
ブローカー:リトレイスケジュール-単調な時計に。
DB/TTL: Redis/DBのTTL-ローカル・クロックに依存します。
Analytics-Time Aggregation-単一のUTCとingestion同期を使用します。
13)テストプレイブック(ゲーム日)
ドリフト注入:人工的に+/− Δに時計を取ります;認証、ブローカー、SLOをチェックしてください。
NTP停止:ソース、トレース・ドリフト、自動スイッチを無効にします。
Leap second/smear:飛躍的な発生のシミュレーション、スケジュール/タイマーの評価。
PTP GMフェイルオーバー:スイッチ時間をチェックし、後にオフセットします。
VM suspend/resume:「ジャンプ」がないことを確認し、ゲストをステップします。
14)アンチパターン
HLC/seqなしで、壁の時間に異なるノードのイベントを比較します。
UTCではなくデータベースに時刻の「string locales」 (TZ付き)を入れます。
アプリケーションが'date -s'/'timedatectl set-time'を実行できるようにします。
計画なしで製品のステップ修正を含める。
TZDBの更新と夏時間のルールを無視します。
バックオフ/タイムアウト/トークンTTLにはウォールクロックを使用します。
論理的な時計の代わりに物理的な時間で「秩序を癒す」ことを試みる。
15)実装チェックリスト
- 単一の方針:NTP (NTSと)またはPTP;信頼できるソースのリスト。
- ノードはslew、 stepのみ開始時に設定されます。
- クラスタ間でのシングルリープセコンド(smear/step)ポリシー。
- オフセット、ジッタ、stratum/PTPインジケータの監視。警告します。
- アプリケーションは、間隔/締め切りにモノトーン時間を使用します。
- 注文/競合の場合-HLC/バージョン、ウォールタイムスタンプではありません。
- TTLトークン、証明書、スケジュールのスキューの株式。
- K8s/VM:ホストの同期、時間を変更する権利のないコンテナ。
- 時間の失敗、CI/CDカレンダーのゲーム日に関するドキュメントとランブック。
- 通常のTZDBの更新、DST/leapイベントの動作のチェック。
16) FAQ
Q: NTPの代わりにPTPが必要なのはいつですか?
A: SLOがマイクロ秒数十マイクロ秒(テレコム/HFT/業界)を必要とする場合、ネットワーク/カードにハードウェアラベルがサポートされています。
Q:どの位時計のスキューに置くためにか?
A: DCの典型的なNTPのため-数十から数百のms (p99);2つの在庫×を置いて下さい。PTPで-単位数μ秒。
Q: 2番目の飛躍を生き残るには?
A: smearおよび同じ方針をどこでも使用して下さい;スケジュール/アグリゲーターとタイマーをテストします。
Q:締め切りのための壁時計に頼ることができますか?
A:いいえ。モノトーン時間のみ+スキューあたりの在庫。
Q:データベースに「時間」を保存するには?
A: UTC ('timestamptz')では、競合解決のためのプラス/HLCバージョン。ローカルゾーンをデータに保存しないでください。
17)合計
信頼できる時間は、プロトコル+ポリシー+規律です。ノード(NTP/NTSまたはPTP)を同期させ、間隔にモノトーン時間を使用し、データにはUTC、注文にはHLC/バージョンを使用し、スキューに在庫を置き、オフセットを監視し、ゲーム日を定期的に過ごす。これにより、「神秘的な」認証バグ、イベントの不一致、および不安定なSLOが回避されます。