时间同步和漂移
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。