时间不对会连锁出事:NTP 同步与证书、日志、数据库的关系
时间是最容易被忽略的基础设施。差 5 分钟,HTTPS 证书可能校验失败,JWT 直接过期,数据库主从延迟判断出错。
虚拟机和容器还多一层问题:宿主机休眠后时间跳变,容器内时钟跟着漂。
先说结论
先看当前偏差,再确认同步服务,最后固定时区。 别用 date -s 手动改,会打乱日志与定时任务。
- timedatectl 看 NTP 是否 active、时区是否正确
- chronyc tracking 看偏移量与源
- 容器内确认 /etc/localtime 与 TZ
- 硬件时钟用 hwclock 校准
- 监控加时间偏移告警
先把问题说清楚
证书校验依赖时间:客户端时间偏差超过证书有效期窗口就会报「证书未生效」。
数据库的时间戳由服务器生成,主从时间不一致会让「最后写入胜出」的合并逻辑出错。
具体怎么做
按顺序执行,每步都验证完再进下一步:
- timedatectl 查看 NTP synchronized 与 Time zone
- chronyc tracking 看 System time 偏移(正常应小于 0.1 秒)
- chrony 源不通时换国内可用 NTP,或指向内网时间服务器
- 容器里设置 TZ 环境变量并挂载 /etc/localtime
- 把时间偏差纳入监控:超过 1 秒告警
参数与成本对照
把关键数值摊开,方便判断该选哪条路:
| 偏差 | 影响 | 处理 |
|---|---|---|
| < 1 秒 | 基本无感 | 保持 NTP |
| 1-60 秒 | 日志顺序、锁超时 | 立即校时 |
| 几分钟 | 证书、JWT 失效 | 校时 + 排查原因 |
| 小时级 | 定时任务错乱 | 查时区与硬件时钟 |

几个容易踩的坑
下面这些是最常见的错误做法:
- 用 date -s 手动设时间:会跳变,影响数据库与日志
- 只改时区不改 NTP:时间还是漂
- 容器内跑 ntpd:需要特权且与宿主机冲突
- 忽略虚拟机快照恢复后的时间跳变
最后补两句
时间是最便宜的基础设施投入:配好 NTP,加一条偏移告警,比事后解释日志顺序容易得多。
工具是手段,理解机制才是能力。命令记不住没关系,知道「该看什么」就够了。
评论 (3)
照着做了一遍,确实少走弯路。第二步最容易漏,建议顺手加个检查清单。
比「一键脚本」有用多了,知道为什么比知道怎么做重要。
补充一句:不同版本行为会变,动手前先确认自己的版本号。
发表评论