本期摘要

服务器时间不准,看似小事,实则能引发连锁反应:K8s证书失效、JWT验证失败、定时任务错乱、分布式系统数据不一致。NTP(网络时间协议)是解决时间同步的标准方案,而chrony是新一代的NTP实现,比传统ntpd更精确、更快收敛。本文从零开始,教你安装配置chrony:指定上游时间源、查看同步状态、手动强制同步、以及如何排查时间不同步问题。读完你就能给所有服务器加上一个精准的时间钟。

为什么需要时间同步?

服务器时间不准的危害:

场景后果
K8s证书证书有效期校验失败,服务不可用
JWT Token令牌被判定为过期或未生效
定时任务crontab 在错误的时间执行
分布式系统日志排序错乱,跨节点事务失败
数据库主从复制可能中断

chrony vs ntpd

特性ntpdchrony
收敛速度慢(需要数分钟到数小时)快(秒级)
对断网适应性差,恢复后需长时间追赶好,可快速校准
对时钟跳变的处理只能平滑调整可平滑或步进
默认状态旧系统默认新系统默认(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——日志查看神器》

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐