1.7.5 时间同步与时区管理

时间同步与时区管理是计划任务稳定性的基础。时间漂移会导致定时任务错过窗口、日志顺序错乱、分布式系统认证失败等问题,因此需要统一时间源并规范时区策略。

时间同步原理与架构草图

文章图片

工具选择与安装
- Chrony:推荐,适合虚拟化与云环境,支持快速收敛与抗抖动。
- systemd-timesyncd:轻量级,适合最小化系统。

安装与启用(以 CentOS/RHEL 为例)

# 安装 chrony
yum install -y chrony

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

# 检查服务状态
systemctl status chronyd

安装与启用(以 Ubuntu/Debian 为例)

# 安装 chrony
apt-get update && apt-get install -y chrony

# 启动并设置开机自启
systemctl enable --now chrony

# 检查服务状态
systemctl status chrony

关键配置示例(/etc/chrony.conf)

# 使用内网 NTP 服务器,生产建议优先内网
server ntp1.internal.local iburst
server ntp2.internal.local iburst

# 允许本机作为时间源被内网客户端访问(按需开启)
allow 10.0.0.0/8

# 记录漂移数据
driftfile /var/lib/chrony/drift

# 首次启动时允许大步调整
makestep 1.0 3

核心命令与解释

# 查看时间同步整体状态(是否同步、NTP服务)
timedatectl status

# 查看同步源与偏移(+/- 偏差、延迟)
chronyc sources -v

# 查看本机时钟跟踪详情(频率偏移/最后校时)
chronyc tracking

# 强制立即校时(解决明显时间漂移)
chronyc makestep

# 将系统时钟写入硬件时钟,重启后仍一致
hwclock --systohc

时区管理

# 查看当前时区
timedatectl

# 设置时区(示例:上海)
timedatectl set-timezone Asia/Shanghai

# 验证当前时间
date

容器环境时区示例

# 运行容器时显式设置时区
docker run -e TZ=Asia/Shanghai ubuntu:22.04 date

# 或挂载宿主机时区文件(推荐)
docker run -v /etc/localtime:/etc/localtime:ro ubuntu:22.04 date

排错与巡检
- 时间不同步:检查 NTP 服务、网络、防火墙、DNS。
- 时间跳变导致 cron 异常:检查时区/DST设置,建议统一 UTC。

排错示例

# 1) 检查服务
systemctl status chronyd

# 2) 检查端口连通性(NTP 123/UDP)
ss -anu | grep 123

# 3) 快速校时并确认
chronyc makestep
chronyc tracking

常见错误与修复
- 无法同步:NTP 源不可达
- 处理:更换内网 NTP、检查 DNS、放行 123/UDP
- 漂移过大:虚拟化环境时钟不稳
- 处理:启用 makestep,减少虚拟机暂停/迁移

计划任务与时区联动风险
- cron 使用系统时区,变更时区会影响触发时间
- DST 可能导致重复或遗漏,建议统一 UTC
- 分布式集群需保证时间偏差可控(建议 < 100ms)

练习
1. 安装并启用 chrony,配置内网 NTP 源后验证同步状态。
2. 将系统时区从 UTC 切换为 Asia/Shanghai,观察 cron 触发时间变化。
3. 人为调整系统时间 5 分钟,使用 chronyc makestep 恢复并记录偏移。
4. 在容器中设置时区并比对宿主机时间一致性。