分布式集群中服务器时间偏差超过几十毫秒,就会引发日志排序混乱、TLS证书校验失败、分布式锁误判、数据库主从数据不一致等一系列问题。Chrony作为NTP的现代化替代方案,在同步精度、收敛速度和资源占用上全面优于传统ntpd。本文给出服务器集群从ntpd迁移到Chrony的完整配置与时间偏差监控方案。
NTP时间偏差为何会影响集群稳定性
服务器主板上RTC晶振的精度通常在几十ppm(百万分之几),一天累积偏差可达数秒。没有外部授时源的情况下,集群内各服务器时间会逐渐分叉。实际运维中受影响较重的场景:
- MySQL半同步复制:binlog事件依赖时间戳排序,主从时钟偏差会导致复制冲突;
- Kerberos认证:票据有效期默认5分钟,时钟偏差超过阈值直接认证失败;
- 分布式追踪:Span时间戳来自不同服务,偏差导致调用链重组错乱;
- 日志审计:安全合规要求日志时间连续,跨服务器时间跳变影响审计链。
Chrony与ntpd的核心差异
ntpd采用连续调整策略,每次微调时钟频率逐步逼近真实时间,收敛慢但平滑。Chrony支持两种模式:slew模式做微调,step模式直接跳变。网络抖动大时Chrony的step模式能快速纠偏,ntpd只能慢慢追,偏差期间服务异常持续存在。
Chrony的另一个优势是硬件时间戳支持。开启后授时精度可达亚微秒级,而ntpd对硬件时间戳支持有限。资源占用上Chrony常驻内存不到2MB,CPU占用可忽略不计。
Chrony部署配置:服务端与客户端
选择一台能访问外部授时源的服务器作为内部NTP server,其余服务器同步到这台。服务端配置:
# /etc/chrony/chrony.conf(服务端)
# 上游授时源
server ntp.aliyun.com iburst minpoll 4 maxpoll 10
server cn.pool.ntp.org iburst
# 允许内网客户端同步
allow 10.0.0.0/8
local stratum 10
# 开启硬件时间戳(网卡支持时)
hwtimestamp *
# 日志路径
logdir /var/log/chrony
makestep 1.0 3
客户端配置更简洁,只需指向内部NTP server:
# /etc/chrony/chrony.conf(客户端)
server 10.0.1.100 iburst minpoll 4 maxpoll 8
driftfile /var/lib/chrony/drift
makestep 1.0 3
rtcsync
logdir /var/log/chrony
makestep 1.0 3的含义是:启动后前3次同步中,偏差超过1秒直接跳变(step),之后转为连续微调(slew)。iburst选项让Chrony在启动时快速发送4个探测包加速初始同步。minpoll和maxpoll控制轮询间隔为2的4次方到2的8次方秒。
从ntpd平滑迁移到Chrony
线上环境不能直接停ntpd再装Chrony,迁移要分步:
# 1. 先装chrony,不启动
yum install chrony
# 2. 停ntpd
systemctl stop ntpd
systemctl disable ntpd
# 3. 启动chrony
systemctl enable --now chronyd
# 4. 验证同步状态
chronyc sources -v
chronyc tracking
chronyc tracking输出中关注几项:System time行显示当前偏差(正常在正负10ms内),Last offset行是最近一次校准偏差,Leap status应为Normal。如果偏差持续大于100ms,检查防火墙是否放行UDP 123端口,以及上游NTP server是否可达。
时间偏差监控与告警
用Prometheus加chrony_exporter做持续监控,偏差超阈值告警:
# chrony_exporter 采集指标
# chrony_tracking_offset_seconds:当前时间偏差(秒)
# chrony_tracking_stratum:当前时钟层级
# Prometheus告警规则
groups:
- name: chrony
rules:
- alert: ClockDriftHigh
expr: abs(chrony_tracking_offset_seconds) > 0.05
for: 2m
labels:
severity: warning
annotations:
summary: "时钟偏差超过50ms: {{ $labels.instance }}"
- alert: ClockStratumTooHigh
expr: chrony_tracking_stratum > 10
for: 5m
labels:
severity: critical
annotations:
summary: "时钟层级异常,可能上游授时源不可达"
stratum值反映距离原子钟的跳数,直连外部NTP源时stratum为2,通过内部NTP server同步时stratum为3。stratum超过10通常意味着失去上游授时源,时钟进入自由运行状态,必须立即处理。定期审计集群时间同步状态,把chrony配置纳入Ansible批量部署,确保新增服务器自动接入授时体系。
原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/fu-wu-qi-ji-qun-shi-jian-tong-bu-shi-zhan-chrony-jing-zhun/