




























"在数字世界里,时间可以同步,但你的头发可能永远不会再同步了"
之前有过一篇简要的文章,大家可以先看看
最近,公司遇到一个案例:"数据库主从同步延迟 10 分钟"。在大家努力排查半小时后,我们发现了一个令人哭笑不得的事实——从库服务器的时间比主库快了整整 10 分钟。是的,这台服务器正在 "穿越" 到未来,而我们的数据还在过去徘徊。
graph LR A[主库] -->|数据同步| B[从库] C[现实时间] -->|时间流| A C -->|时间流| B B-.->|时间快10分钟| C style B fill:#ff9999
这让我想一句经典名言:"服务器的时间可以不准,但你的排查思路必须准"。
今天,我们就来聊聊甲骨文云(Oracle Cloud)Ubuntu 系统的时间同步——这个看似简单,却能让无数运维人深夜加班的 "小问题"。
在分布式系统中,时间同步不是 "可有可无" 的装饰品,而是基础设施的基石。想象一下:
💡 真实案例:某电商公司 "双 11" 大促期间,由于负载均衡器时间偏差 5 分钟,导致大量用户会话提前失效,直接损失订单数百万元。
用一句话总结:时间不同步,系统就变成了 "薛定谔的猫"——你永远不知道它现在处于什么状态。
Ubuntu 16.04 之后,systemd-timesyncd 成为默认的时间同步服务。它就像那个 "默默无闻但很靠谱" 的同事——平时不声不响,但工作从不掉链子。
# 检查状态(看看这位同事今天状态如何)
timedatectl status
输出示例:
Local time: 一 2026-01-19 10:30:00 CST
Universal time: 一 2026-01-19 02:30:00 UTC
RTC time: 一 2026-01-19 02:30:00
Time zone: Asia/Shanghai (CST, +0800)
System clock synchronized: yes ← 关键指标:同步状态
NTP service: active ← 关键指标:服务状态
RTC in local TZ: no
如果看到 System clock synchronized: no ,别慌,先问问它:"兄弟,你还好吗?"
# 查看详细服务状态
systemctl status systemd-timesyncd
如果你对时间精度有 "强迫症"(比如金融交易系统要求毫秒级同步),或者 systemd-timesyncd"罢工" 了,chrony 是你的不二之选。
graph TD A[选择时间同步方案] --> B{对精度要求高?} B -->|是| C[使用chrony] B -->|否| D[使用systemd-timesyncd] C --> E[安装并配置chrony] D --> F[检查systemd-timesyncd状态] E --> G[chronyc tracking检查同步] F --> H[timedatectl status检查同步]
安装 chrony(给系统换个 "时间管家"):
sudo apt update && sudo apt install chrony
配置 NTP 服务器(告诉 chrony 该找谁对表):
sudo nano /etc/chrony/chrony.conf
在甲骨文云中,有个 "秘密武器"——实例元数据服务(169.254.169.254),这是云平台内部的高精度时间源:
# 添加这行到配置文件
server 169.254.169.254 iburst prefer
🎯 专业提示:
iburst参数表示初始同步时会发送多个请求快速同步,prefer表示优先使用这个服务器。
重启并检查(看看新管家工作得怎么样):
sudo systemctl restart chrony
chronyc sources -v
输出中的 ^* 标记表示当前同步的源。如果没有看到 ^*,嗯... 可能需要请这位 "管家" 喝杯咖啡(重启服务)或者换个 "管家"(检查配置)。
甲骨文云实例默认从 169.254.169.254 获取时间。这个 IP 是实例元数据服务的地址,不是公网 NTP 服务器。好处多多:
| 特性 | 优势 | 说明 |
|---|---|---|
| ⏱️ 延迟低 | 云内网络,延迟通常在毫秒级 | 公网 NTP 通常 10-50ms,这个<1ms |
| 🎯 精度高 | 云平台统一时间源 | 避免网络抖动影响 |
| 💰 免费 | 不消耗公网流量 | 省钱就是硬道理 |
| 🔒 安全 | 内部网络,更安全 | 避免 NTP 放大攻击 |
但要注意:这个服务只在云实例内部可用。如果你在本地环境测试,或者需要其他 NTP 服务器,需要手动配置。
时间同步使用 UDP 123 端口。如果发现时间不同步,先检查这三道 "门":
# 第一道门:系统防火墙
sudo ufw status
# 如果启用了ufw,确保有:
# 123/udp ALLOW Anywhere
# 第二道门:安全组规则(甲骨文云控制台)
# 检查出站规则:是否允许UDP 123端口
# 第三道门:网络ACL
# 甲骨文云网络ACL:确保出站流量允许
记住:时间同步是 "单向" 的——客户端主动请求服务器,所以只需要出站规则。别把防火墙配置成 "只进不出",那样时间就真的 "停滞" 了。
症状:timedatectl status 显示 System clock synchronized: no
修复步骤(急救三部曲):
flowchart TD A[时间不同步告警] --> B[检查timedatectl status] B --> C{System clock synchronized?} C -->|是| D[正常 ✅] C -->|否| E[第一步: 临时手动同步] E --> F[第二步: 检查服务状态和日志] F --> G{问题解决?} G -->|是| D G -->|否| H[第三步: 切换到chrony] H --> I[重新检查同步状态] I --> D
# 先停用自动同步
sudo timedatectl set-ntp false
# 手动同步(紧急止血)
sudo ntpdate -u pool.ntp.org
# 重新启用自动同步
sudo timedatectl set-ntp true
# 查看服务状态
systemctl status systemd-timesyncd
# 查看最近日志(重点看错误信息)
journalctl -u systemd-timesyncd --since "5 minutes ago" | tail -20
# 优雅切换:先停用旧的,再启用新的
sudo systemctl stop systemd-timesyncd
sudo systemctl disable systemd-timesyncd
sudo apt install chrony -y
sudo systemctl enable --now chrony
# 配置甲骨文云专用NTP
echo "server 169.254.169.254 iburst prefer" | sudo tee -a /etc/chrony/chrony.conf
sudo systemctl restart chrony
症状:时间显示正确,但时区是 UTC 或其他时区,日志时间戳让人困惑。
修复:
# 查看所有可用时区(找找你所在的城市)
timedatectl list-timezones | grep -i shanghai
# 设置时区(以上海为例)
sudo timedatectl set-timezone Asia/Shanghai
# 验证设置
date
💡 小贴士:生产环境建议统一使用 UTC 时区,避免时区转换带来的混乱。应用层根据业务需求显示本地时间。这样做的优点:
- 避免夏令时问题
- 日志时间统一
- 跨时区协作更方便
如果你对时间同步有极致追求,chrony 提供了更多 "调优" 选项:
在 /etc/chrony/chrony.conf 中,可以配置不同的同步策略:
# 方案A:更激进的同步策略(适合网络不稳定的环境)
maxchange 1000 0 # 允许更大的时间跳变
makestep 1 3 # 如果偏差超过1秒,立即步进调整
# 方案B:更保守的策略(适合对时间敏感的应用)
maxpoll 12 # 最大轮询间隔(4096秒)
minpoll 6 # 最小轮询间隔(64秒)
参数解释:
maxchange:允许的最大时间调整量makestep:时间偏差超过阈值时是否"跳变"maxpoll/minpoll:轮询间隔,值越大同步频率越低# 查看详细的同步状态
chronyc tracking
输出示例:
Reference ID : C0A80101 (169.254.169.254)
Stratum : 3
Ref time (UTC) : Mon Jan 19 02:30:00 2026
System time : 0.000123 seconds fast of NTP time
Last offset : +0.000045 seconds
RMS offset : 0.000078 seconds
Frequency : 1.234 ppm fast
Residual freq : +0.001 ppm
Skew : 0.123 ppm
Root delay : 0.012345 seconds
Root dispersion : 0.023456 seconds
Update interval : 64.2 seconds
Leap status : Normal
📊 看懂关键指标:
System time:正数表示系统时间快了,负数表示慢了Last offset:最近一次同步的偏移量Stratum:时间源层级,数字越小越接近源头- 理想状态:offset < 1ms,stratum ≤ 5
如果需要更直观的监控,可以配置 Prometheus+Grafana 监控时间偏移:
# node_exporter的textfile收集器配置
# 创建收集脚本
cat > /usr/local/bin/ntp_offset.sh << 'EOF'
#!/bin/bash
offset=$(chronyc tracking | grep 'System time' | awk '{print $4}')
echo "ntp_offset" $offset
EOF
# 添加到crontab每分钟执行
echo "* * * * * /usr/local/bin/ntp_offset.sh > /var/lib/node_exporter/ntp_offset.prom" | sudo tee -a /etc/crontab

时间同步看似简单,实则暗藏玄机。经过多年的 "血泪教训",我总结了几个关键点:
| 指标 | 优秀 | 良好 | 需要关注 | 紧急 |
|---|---|---|---|---|
| 时间偏移 | <1ms | 1-10ms | 10-100ms | >100ms |
| stratum 层级 | 1-2 | 3-4 | 5-6 | >6 |
| 同步间隔 | 稳定 | 偶尔抖动 | 频繁重连 | 不同步 |
"时间是相对的,但服务 SLA 是绝对的。别让你的服务器在' 时间旅行 '中迷失方向。"
"好的时间同步,用户无感知;坏的时间同步,运维跑断腿。"
"配置时间同步只需要 5 分钟,排查时间不同步可能需要 5 小时。你选哪个?"
# 基础检查
timedatectl status # 查看时间同步状态(首选)
timedatectl show-timesync # 显示详细时间同步信息
timedatectl set-ntp true # 启用自动时间同步
# systemd-timesyncd相关
systemctl status systemd-timesyncd # 检查服务状态
journalctl -u systemd-timesyncd # 查看服务日志
systemctl restart systemd-timesyncd # 重启服务
# chrony相关(如使用)
chronyc tracking # 查看同步状态
chronyc sources -v # 查看NTP源详情
chronyc sourcestats # 查看统计信息
chronyc activity # 查看活动状态
# 网络诊断
ss -tuln | grep :123 # 检查NTP端口监听
ping 169.254.169.254 -c 3 # 测试元数据服务连通性
sudo tcpdump -i any port 123 -c 10 # 抓包分析NTP流量
# 时区管理
timedatectl list-timezones # 列出所有时区
timedatectl set-timezone Asia/Shanghai # 设置时区
cat /etc/timezone # 查看当前时区文件
| 服务 | 主配置文件 | 日志位置 | 状态文件 |
|---|---|---|---|
| systemd-timesyncd | /etc/systemd/timesyncd.conf |
journalctl -u systemd-timesyncd |
无 |
| chrony | /etc/chrony/chrony.conf |
/var/log/chrony/ |
/var/lib/chrony/ |
| ntp (传统) | /etc/ntp.conf |
/var/log/ntp.log |
/var/lib/ntp/ |
#!/bin/bash
# 文件名: fix_time_sync.sh
# 描述: 时间同步紧急恢复脚本
# 用法: sudo bash fix_time_sync.sh
set -e
echo "🕐 开始检查时间同步状态..."
echo "========================================"
# 检查当前时间
echo "当前系统时间: $(date)"
echo "UTC时间: $(date -u)"
timedatectl status
echo ""
echo "🔧 尝试修复..."
echo "========================================"
# 停止自动同步
sudo timedatectl set-ntp false
echo "✅ 已停止自动时间同步"
# 安装ntpdate(如未安装)
if ! command -v ntpdate &> /dev/null; then
echo "📦 安装ntpdate..."
sudo apt update && sudo apt install -y ntpdate
fi
# 手动同步
echo "⏰ 手动同步时间..."
sudo ntpdate -u pool.ntp.org
# 重新启用自动同步
echo "🔄 重新启用自动同步..."
sudo timedatectl set-ntp true
# 检查结果
echo ""
echo "✅ 修复完成,检查状态:"
sleep 2
timedatectl status
if timedatectl status | grep -q "System clock synchronized: yes"; then
echo "🎉 时间同步已恢复!"
else
echo "⚠️ 时间同步仍存在问题,建议检查日志: journalctl -u systemd-timesyncd"
fi
我的博客即将同步至腾讯云开发者社区,邀请大家一同入驻:
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。