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 的工作流程:
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