服务器集群时间同步实战:Chrony精准授时与NTP平滑切换配置

分布式集群中服务器时间偏差超过几十毫秒,就会引发日志排序混乱、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/

(0)
小编小编
上一篇 2小时前
下一篇 2小时前

相关推荐