













"在數字世界裡,時間可以同步,但你的頭髮可能永遠不會再同步了"
之前有過一篇簡要的文章,大家可以先看看
最近,公司遇到一個案例:"數據庫主從同步延遲 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閱讀器)自動聚合整理,僅供閱讀參考。 原文來自 — 版權歸原作者所有。