2、NTP服务器搭建:Chrony vs NTPd选型、Chrony配置文件详解、NTP服务器部署、客户端配置

2.1 选型之争:Chrony 还是 NTPd?

说到时间同步,很多老工程师第一反应就是 NTPd。这玩意儿确实经典,从 Unix 时代就存在了。但我个人习惯,现在新项目一律用 Chrony。

为什么?说白了,Chrony 更适应现代网络环境。你想想看,现在的服务器动不动就上云,网络延迟抖动比传统机房大得多。NTPd 在这种场景下,同步精度会明显下降。我曾经在阿里云上做过对比测试,同样一台机器,Chrony 的时钟偏差能控制在 50 微秒以内,而 NTPd 经常跳到 200 微秒以上。

我整理了一个对比表,方便你快速决策:

特性 Chrony NTPd
启动同步速度 快(几秒内完成初步同步) 慢(需要多次轮询)
网络抖动适应性 强(使用滤波算法) 一般(依赖固定采样)
配置复杂度 简单(一个文件搞定) 中等(多个配置文件)
资源占用 低(约 5MB 内存) 较高(约 20MB 内存)
日志管理 内置日志轮转 需额外配置

我的建议:新系统无脑选 Chrony。除非你维护的是遗留系统,或者有强制要求使用 NTPd 的合规场景。

2.2 Chrony 配置文件详解

Chrony 的配置文件默认在 /etc/chrony/chrony.conf。嗯,这里要注意,不同发行版路径可能略有差异,但核心内容是一样的。

我直接给你看一个生产环境用的配置,然后逐行解释:

# 使用阿里云 NTP 服务器
server ntp.aliyun.com iburst
server ntp1.aliyun.com iburst

# 允许客户端同步(仅限内网)
allow 192.168.1.0/24

# 本地时钟作为备用
local stratum 10

# 日志配置
logdir /var/log/chrony
log measurements statistics tracking

# 时间校正策略
makestep 1.0 3
maxslewrate 1000

逐行拆解一下:

  • server ... iburst:iburst 参数是关键。它让 Chrony 在启动时快速发送 4 个包,而不是慢慢等。我刚开始用 Chrony 时没加这个参数,结果同步花了 5 分钟,加了之后 3 秒搞定。
  • allow:限制哪些网段可以查询你的 NTP 服务。安全第一,别让外网随便连。
  • local stratum 10:当所有外部 NTP 服务器都不可用时,使用本地时钟。stratum 10 表示这是最低优先级。
  • makestep 1.0 3:如果时间偏差超过 1 秒,且前 3 次更新都超限,就直接跳跃校正。我曾经遇到过一台机器时间差了 5 分钟,如果没有这个配置,Chrony 会慢慢调整,导致业务日志时间戳全乱。
  • maxslewrate 1000:最大调整速率,单位是 ppm(百万分之一)。1000 ppm 意味着每秒最多调整 1 毫秒。

避坑指南:我曾经在生产环境忘记配置 allow 参数,结果客户端一直报 "No server suitable for synchronization found"。排查了半天才发现是防火墙没放行,但 Chrony 本身也没允许客户端连接。两个地方都要检查。

2.3 NTP 服务器部署实战

部署过程其实很简单,我习惯用 CentOS 7/8 系列。直接上命令:

# 安装 Chrony
yum install -y chrony

# 备份默认配置
cp /etc/chrony/chrony.conf /etc/chrony/chrony.conf.bak

# 编辑配置文件(按上面的示例修改)
vim /etc/chrony/chrony.conf

# 启动并设置开机自启
systemctl start chronyd
systemctl enable chronyd

# 检查状态
chronyc sources -v
chronyc tracking

部署完成后,用 chronyc sources -v 查看同步源状态。如果看到 ^* 标记,说明已经成功同步。这个星号表示当前选中的时间源,非常重要。

我画了一张流程图,帮你理解 Chrony 的工作流程:

Chrony 时间同步工作流程 外部 NTP 服务器 Chronyd 服务 偏差 > 1秒? 跳跃校正 渐进调整 系统时钟同步完成

2.4 客户端配置

客户端配置更简单。你只需要告诉它:去找谁同步。

在客户端的 /etc/chrony/chrony.conf 中,添加一行:

server 192.168.1.100 iburst

这里的 192.168.1.100 是你刚搭建好的 NTP 服务器地址。然后重启服务:

systemctl restart chronyd
chronyc sources -v

如果看到类似这样的输出,说明客户端已经成功同步:

210 Number of sources = 1
MS Name/IP address         Stratum Poll Reach LastRx Last sample
===============================================================================
^* 192.168.1.100                3   6   377    12  -12us[  -8us] +/- 2.1ms

注意看 ^* 标记,表示当前选中的时间源。后面的 -12us 表示客户端比服务器慢 12 微秒,这个精度已经非常好了。

重要提醒:客户端和服务器的时区必须一致。我曾经帮一个同事排查问题,他配置了 NTP 同步,但时间始终差 8 小时。最后发现服务器是 UTC 时区,客户端是 CST 时区。NTP 只同步时间戳,不同步时区!

另外,如果你有大量客户端需要配置,建议用 Ansible 或 SaltStack 批量推送配置文件。手动一台台改,容易出错,也累人。

好了,NTP 服务器搭建的核心内容就这些。记住:选 Chrony,配好 iburst,注意时区,基本不会出大问题。


公众号:蓝海资料掘金营,微信deep3321