時間同步和漂移
1)為什麼時間是建築組成部分
時間遍及所有層次:令牌和證書的TTL,RPC截止日期,事件順序,邏輯和分析以及共識和鎖定。數十到數百毫秒的錯誤可能:- 打破Kerberos/OAuth/JWT(「iat/nbf/exp」字段);
- 扭曲度量/軌跡和變量;
- 輪流經紀人/客戶(taymauts,retrai,指數回落);
- 擾亂分布式場景中的順序和冪等性。
- Offset(位移)-本地時間與基準的差。
- Skew(壁板)是節點之間的離線差。
- 漂移(漂移)-在沒有校正的情況下時鐘的離開速度(ppm)。
- Jitter-延遲/測量變異性。
2)時間來源和協議
2.1 NTP (Network Time Protocol)
平流(Stratum 1直接來自GNSS/radio,Stratum 2直接來自Stratum 1等)。
通過兩種方式進行校正:- slew(平穩的頻率子結構,適用於應用程序);
- 步伐(時間飛躍;不希望出售)。
- 實現:chrony,ntpd,systemd-timesyncd。對於服務器-最好是chrony。
2.2 NTS (NTP over TLS)
經過驗證的同步(MITM保護和時間替換)。
建議使用外部時間服務器。
2.3 PTP / IEEE 1588
NIC/ToR中的硬件時間標簽(硬件計時器),毫秒和微秒精度。
模式:邊界/透明時鐘,電信/企業配置文件。
用於p99訂單的硬SLO,HFT/電信/行業。
2.4 GNSS(GPS/GLONASS)和PPS
本地接收器為Stratum 1提供了PPS(脈沖對秒)基準。
重要的是要考慮欺騙/幹擾-放置天線並監視完整性。
2.5個雲
雲源(內部的stratum池)減少了VPC內部的離網和抖動。
對於混合環境-結合本地和雲參考。
3)操作系統和硬件中的時間
TSC/HPET/RTC:現代CPU將TSC保持為快速單調計數器;固定頻率(invariant TSC)。
虛擬化/容器:更頻繁地漂移和「跳躍」。在Hypervisor上-嚴格的超時服務;來訪-chrony。
節能可能會幹擾計時器的單調-檢查BIOS/UEFI選項。
4)單調和「壁」手表
Wall clock(實時,TZ/UTC)-用於日誌、事件標簽、人員。
單調時鐘-用於測量間隔/時間間隔。
- Linux: `CLOCK_MONOTONIC`.
- C++: `std::chrono::steady_clock`.
- Go:時代的內置單調部分。時間間隔。
- Java: `System.nanoTime()'用於持續時間,不用於日歷。
規則:截止日期和retrai-單調手表;序列化/生成-在UTC上。
5)Leap 第二/」leap smear」和日歷陷阱
Leap second可以在計時器/度量標準中調用「00:59:60」或重復循環→秒。
方法:- Smear(N小時內光滑「塗抹」秒)。
- 步驟(不需要)。
- 永遠不要依靠本地TZ/夏季時間來實現邏輯;存儲UTC,在用戶的TZ中顯示。
- 更新TZDB(時區基礎)-發生政治變化。
6)同意對「墻壁」沒有信任的秩序"
Lamport clocks和Vector clocks是沒有物理時鐘的因果關系。
Hybrid Logical Clocks (HLC)-結合物理時間和計數器,可抵抗小型滑行。
類似於TrueTime的模型-返回「[earliest, latest]」間隔,並要求進行序列化。
7)時間對協議和系統的影響
安全性:Kerberos允許少量skew(通常± 5分鐘),TLS/證書對 'notBefore/notAfter',JWT到'exp/nbf/iat'敏感。
經紀人/隊列:任務截止日期/可視性時間取決於正確的時間。
DBMS/群集:通過「updated_at」/s引入版本沖突-輸入HLC/版本,而不比較「原始」wall-timestamps。
流媒體:區分活動時間和處理時間;調整水上樂園和水上樂園。
克朗/計劃者:漂移導致「翻轉」/雙發射。使用單調間隔和去角鍵。
8)觀察力和時間SLO
8.1個指標
`time.offset_ms'(離職到裁判),時間。jitter_ms`, `stratum`, `root_delay`, `root_dispersion`.
Для PTP: `path_delay`, `grandmaster_offset`, `gm_identity`, `clock_class`.
Alerts: offset>閾值(例如100-500毫秒),源丟失,步進校正。
8.2個診斷
`chronyc tracking/sources/sourcestats`
`ntpq -p`, `ntpstat`
PTP:「pmc」,NIC/ToR供應商實用程序。
8.3 SLO/預算錯誤
SLO示例: "Median offset ≤ 1 ms,p99 offset ≤ 25 ms,無插槽節點步驟;PTP grandmaster failover ≤ 2 s».
9)配置實踐(Linux/containers/K8s)
9.1 chrony(推薦)
示例('/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個容器和節點
在主機上進行同步;容器使用核心。
K8s是具有chrony或node-level超時代理的DaemonSet;禁止應用程序帶來時間。
9.3個PTP堆棧
帶有硬件計時器的NIC,PTP守護程序,ToR上的邊界塊。
PTP域分隔(配置文件),防止「不良」大師。
10)時間安全
NTS/身份驗證的 NTP,過濾器和限值(NTP增益-DDoS矢量)。
PTP安全性:L2隔離、ACL多種分類、GM間諜監控。
GNSS:具有良好視野的天線,欺騙/跳躍的細節,倒退源。
11)工程模式和代碼
11.1 截止日期/taymouts
將截止日期存儲為「單調開始+三角洲」而不是絕對的wall-timestamp。
始終在skew上添加庫存(例如2 ×預期p99-skew到TTL令牌)。
11.2版本比較
不要依賴節點之間的「updated_at」。使用:- 考試/ETag;
- HLC/seq;
- 樂觀的封鎖。
11.3個日誌和跟蹤
始終是UTC;在代理日誌中啟用「time_offset_ms」節點字段。
在跟蹤事件中應用事件時間。
11.4 leap second處理
在所有節點上統一選擇策略(smear/step)。
測試:指標不必在重復二秒鐘「打破」。
12)對域的影響
Auth:令牌-考慮「clock skew allowance」(例如,± 2-5分鐘)。
Payments/時間段:四舍五入間隔而不是絕對時間。
經紀人:中繼時間表-單調小時。
DB/TTL:Redis/DB中的TTL-依靠本地時鐘:放下庫存。
分析:時間聚合-使用單個UTC和註入同步。
13)花花公子(Game Days)
漂移噴射:人為地將手表移至+/− Δ;檢查auth,經紀人,SLO。
NTP外觀:禁用源,跟蹤漂移和自動轉換。
Leap second/Smear:模擬進攻,評估圖表/計時器。
PTP GM failover:檢查切換時間和後退。
VM suspend/resume:確保客人沒有「跳躍」和跳躍。
14)反模式
在沒有HLC/seq的情況下比較不同節點在墻壁時間上的事件。
將時間(帶有TZ)的「字符串本地」聚集在DB而不是UTC中。
允許應用程序做「日期」/「timedatectl設置時間」。
在沒有計劃的情況下在銷售中啟用步驟校正。
忽略TZDB更新和夏令時規則。
將wall clock用於backoff/taymauts/token-TTL,而無需在skew上存貨。
嘗試用物理時間而不是邏輯時間來「治療順序」。
15)實施支票
- 單一政策:NTP(帶有NTS)或PTP;可信源列表。
- 節點設置為slew,僅在開始時步。
- 所有群集上的單個leap second (smear/step)策略。
- 監視offset,jitter,stratum/PTP指標;Alertes。
- 應用程序使用單調時鐘進行間隔/截止日期。
- 對於順序/沖突-HLC/版本,不是wall-timestamps。
- TTL代幣、證書、時間表中的skew庫存。
[K8s/VM]:在主機上同步,容器無權更改時間。
- CI/CD日歷中的時間故障文檔和運行手冊。
- 定期更新TZDB,檢查DST/leap事件中的行為。
16) FAQ
Q: 什麼時候需要PTP而不是NTP?
答:當SLO需要微秒數十微秒(電信/HFT/行業)並且在網絡/卡上支持硬件標簽時,則需要。
Q: clock skew上有多少書簽?
答:對於DC中的典型NTP,數十到數百毫秒(p99);放置2個×庫存。帶有PTP-單位到數十個iss。
Q:如何生存跳躍第二?
答:到處都使用微笑和相同的政策;測試圖形/聚合器和計時器。
Q: 可以依靠墻鐘作為截止日期嗎?
答:沒有。只有單調的手表+skew上的股票。
問:如何在DB中存儲「時間」?
A:在UTC(「timestamptz」)中,以及用於解決沖突的版本/HLC;不要將本地區域存儲在數據中。
17)結果
可靠的時間是協議+策略+代碼中的紀律。同步節點(NTP/NTS或PTP),使用月球時鐘進行間隔,使用UTC進行數據,使用HLC/版本進行順序,在skew上放置庫存,監視offset並定期進行比賽。因此,您將避免身份驗證錯誤,事件差異和不穩定的SLO。