《每日一命令20:chrony——时间同步的正确姿势》
本期摘要
服务器时间不准,看似小事,实则能引发连锁反应:K8s证书失效、JWT验证失败、定时任务错乱、分布式系统数据不一致。NTP(网络时间协议)是解决时间同步的标准方案,而chrony是新一代的NTP实现,比传统ntpd更精确、更快收敛。本文从零开始,教你安装配置chrony:指定上游时间源、查看同步状态、手动强制同步、以及如何排查时间不同步问题。读完你就能给所有服务器加上一个精准的时间钟。
为什么需要时间同步?
服务器时间不准的危害:
| 场景 | 后果 |
|---|---|
| K8s证书 | 证书有效期校验失败,服务不可用 |
| JWT Token | 令牌被判定为过期或未生效 |
| 定时任务 | crontab 在错误的时间执行 |
| 分布式系统 | 日志排序错乱,跨节点事务失败 |
| 数据库主从 | 复制可能中断 |
chrony vs ntpd
| 特性 | ntpd | chrony |
|---|---|---|
| 收敛速度 | 慢(需要数分钟到数小时) | 快(秒级) |
| 对断网适应性 | 差,恢复后需长时间追赶 | 好,可快速校准 |
| 对时钟跳变的处理 | 只能平滑调整 | 可平滑或步进 |
| 默认状态 | 旧系统默认 | 新系统默认(CentOS 8+) |
建议:新部署的系统直接用 chrony,老系统也可以迁移。
安装与配置
安装:
bash
# CentOS/RHEL yum install chrony -y # Ubuntu/Debian apt install chrony -y
配置文件: /etc/chrony.conf
bash
# 使用国内可靠的时间源 server ntp.aliyun.com iburst server ntp.tencent.com iburst server ntp.ustc.edu.cn iburst # 允许哪些客户端访问(本地NTP服务器场景) allow 192.168.0.0/16 # 本地时钟作为后备(电脑无网络时) local stratum 10 # 日志文件 logdir /var/log/chrony
iburst 参数表示初期快速发送多个请求,加快首次同步速度。
最常用的5种姿势
1. 启动并设置开机自启
bash
systemctl start chronyd systemctl enable chronyd
2. 查看同步状态
bash
chronyc sources -v
输出示例:
text
MS Name/IP address Stratum Poll Reach LastRx Last sample =============================================================================== ^* ntp.aliyun.com 2 6 17 43 +237us[ +237us] +/- 19ms
-
^*表示当前同步的时间源 -
Stratum距离原子钟的层数(越小越准) -
Last sample时间偏差,微秒级
3. 查看详细同步信息
bash
chronyc tracking
输出示例:
text
Reference ID : C0A80101 (ntp.aliyun.com) Stratum : 3 Ref time (UTC) : Wed May 10 10:20:30 2026 System time : 0.000237 seconds fast of NTP time Last offset : -0.000001 seconds RMS offset : 0.000023 seconds Frequency : 2.123 ppm fast
关注 System time 和 Last offset,正常应在几毫秒内。
4. 手动强制同步
bash
chronyc -a makestep
立即调整时间,而不是平滑调整。适用于时间偏差较大时。
5. 查看时间源统计
bash
chronyc sourcestats -v
显示每个时间源的响应时间和偏差范围。
真实场景
场景1:服务器时间偏差了5分钟,如何快速校准
bash
# 先停止chrony同步 systemctl stop chronyd # 手动设置时间(谨慎) date -s "2026-05-11 10:30:00" # 启动chrony systemctl start chronyd # 或直接强制同步 chronyc -a makestep
场景2:搭建内网NTP服务器
让内网所有机器从一台可靠的NTP服务器同步,避免每台都访问公网。
配置内网服务器 /etc/chrony.conf 允许其他客户端访问:
bash
allow 10.0.0.0/8
其他客户端配置:
bash
server 10.0.0.1 iburst
场景3:检查时间同步是否正常
bash
# 查看是否有选中的时间源 chronyc sources | grep "^*" # 查看时间偏差 chronyc tracking | grep "System time"
排查时间同步问题
问题1:chrony无法同步
bash
# 检查上游时间源是否可达 ping ntp.aliyun.com # 检查防火墙是否开放UDP 123端口 firewall-cmd --list-all | grep 123 # 查看chrony日志 journalctl -u chronyd -n 20
问题2:时间一直跳变
可能是硬件时钟(RTC)不准。同步到系统时间:
bash
# 将系统时间写入硬件时钟 hwclock --systohc
问题3:容器内时间不同步
容器共享宿主机内核时间,但可能时区不对。解决:
bash
# 在宿主机设置时区 timedatectl set-timezone Asia/Shanghai # 容器内同步时区文件 ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
监控告警脚本
bash
#!/bin/bash
# 检查时间偏差是否超过1秒
OFFSET=$(chronyc tracking | grep "System time" | awk '{print $4}')
THRESHOLD=1.0
if (( $(echo "$OFFSET > $THRESHOLD" | bc -l) )); then
echo "警告:系统时间偏差 ${OFFSET} 秒"
# 发送告警
fi
常用参数速查
| 命令 | 含义 |
|---|---|
chronyc sources -v | 查看时间源 |
chronyc tracking | 查看同步详情 |
chronyc -a makestep | 强制步进时间 |
chronyc sourcestats -v | 查看时间源统计 |
chronyc activity | 查看活动中的时间源数量 |
hwclock --systohc | 系统时间写入硬件时钟 |
下期预告
《每日一命令21:journalctl——日志查看神器》
更多推荐
所有评论(0)