在分布式系统与服务器集群环境中,时间同步是确保系统稳定运行的关键基础。日志时间戳错乱、SSL/TLS证书验证失败、数据库主从复制异常等常见问题,其根源往往在于集群内各节点之间存在数秒甚至更大的时间差。虽然Linux系统通常自带systemd-timesyncd服务,但它仅是一个轻量级的NTP客户端,无法作为时间服务器为集群内其他节点提供同步服务。要彻底解决集群内的时间一致性问题,最佳实践是部署chronyd服务,将其配置为一台主时间源服务器,让集群内所有其他服务器节点都指向它进行同步。

为何选择 chronyd 而非 ntpd 或 systemd-timesyncd
首先,传统的ntpd服务在主流新版Linux发行版中已逐渐被取代。例如,RHEL 8、CentOS 8及Ubuntu 20.04等系统默认不再预装ntpd。其配置相对复杂,且时钟调整策略偏向“渐进式”,收敛速度较慢,难以满足集群环境对快速时间对齐的需求。
至于systemd-timesyncd,其设计定位是轻量、低资源消耗的客户端,仅具备同步外部时间源的能力,而无法响应来自局域网内其他服务器的NTP请求。这意味着它无法在集群内部构建一个本地的、可靠的时间锚点。
因此,对于构建高可用的集群时间同步架构,chronyd是目前的首选方案。它同时集成了服务端与客户端功能,时间收敛速度快,对虚拟化及网络不稳定的环境有更好的适应性。但在配置时,需特别注意以下几个易错点:
chronyd服务启动后默认监听UDP 323端口,但若未在配置中明确使用bindcmdaddress和allow指令,它将拒绝处理来自其他主机的查询请求。- 若服务器部署在防火墙或NAT网络之后,请务必放行
UDP 323端口,而非传统的NTPUDP 123端口。 - 切勿尝试在
systemd-timesyncd的配置文件(如/etc/systemd/timesyncd.conf)中将其指向chrony服务器。因为systemd-timesyncd仅支持标准的NTP v4协议,且不识别服务器池(pool)配置,无法与chronyd服务端正常协作。
主服务器配置:将 chronyd 设置为集群内时间源
配置主服务器的核心目标,是将其打造为一个稳定、可信的本地时间基准。编辑/etc/chrony.conf配置文件,确保包含以下关键指令(顺序可调,但内容不可或缺):
server 216.239.35.0 iburst minpoll 4 maxpoll 6 keyfile /etc/chrony.keys driftfile /var/lib/chrony/drift logdir /var/log/chrony bindcmdaddress 127.0.0.1 bindcmdaddress ::1 allow 192.168.10.0/24 # 请替换为您的实际集群网络段 local stratum 10
配置解析与注意事项:
allow指令配置:必须指定明确的集群内网段,例如192.168.10.0/24。出于安全考虑,不建议使用allow 0.0.0.0/0开放至所有IP地址。local stratum 10的作用:此指令至关重要。它告知chronyd,即使未连接外部高精度时间源(如GPS),也以“层级10”(stratum 10)的身份对外宣告自身为有效的时间源。若缺少此配置,客户端可能因认为该源层级过高(即不够精确)而拒绝同步。- 上游时间源处理:作为集群的“时间锚点”,主服务器自身应停止同步外部公共NTP服务器。因此,需将配置文件中所有指向外部地址的
pool或server行注释或删除。
配置完成后,重启并设置服务开机自启:sudo systemctl restart chronyd && sudo systemctl enable chronyd。
客户端配置:强制仅从集群主服务器同步时间
客户端配置的目标是确保其“专心致志”地仅从指定的主服务器同步时间。同样使用chronyd,但配置文件需进行更严格的约束。
pool 192.168.10.1 iburst minpoll 4 maxpoll 6 # 主服务器的IP地址 keyfile /etc/chrony.keys driftfile /var/lib/chrony/drift logdir /var/log/chrony rtcsync makestep 1.0 -1 # 请务必注释或删除所有其他 server/pool 配置行
客户端配置核心要点:
- 强制快速时间校正:
makestep 1.0 -1参数是关键。它指示chronyd在检测到系统时间偏差超过1秒时,立即执行“步进”式校正,而非缓慢平滑调整。这对于新启动的服务器或从休眠恢复的虚拟机,能实现时间的快速对齐。 - 同步至硬件时钟:
rtcsync指令使chronyd定期将校准后的系统时间回写至硬件时钟(RTC),防止服务器重启后系统时间回退至错误状态。 - 保持配置单一性:必须注释或删除配置文件中所有其他指向外部NTP服务器的
server或pool行,确保同步源的唯一性。
配置验证:执行chronyc tracking命令查看同步状态,确认System time显示为OK。使用chronyc sources -v可查看详细信息,确保列表中仅出现已配置的主服务器IP。
重要冲突提示:请避免使用timedatectl set-ntp true命令。该命令默认会启用systemd-timesyncd服务,可能与chronyd产生冲突,争夺系统时间控制权。
故障排查与高级调试:chronyd默认日志级别较低。如需详细调试,可在配置中添加logchange 0.5以记录更详细的时间变化日志。同时,使用chronyc activity检查NTP连接活动状态。
虚拟化环境特例:在KVM虚拟机中,若宿主机配置了时间同步(如libvirt中设置了clock=host),此机制会干扰虚拟机内chronyd的工作。通常需要在虚拟机内部禁用或调整宿主机提供的时间同步功能,才能保证chronyd正常生效。
