慣性聚合 高效追蹤和閱讀你感興趣的部落格、新聞、科技資訊
閱讀原文 在慣性聚合中打開

推薦訂閱源

小众软件
小众软件
博客园 - 叶小钗
有赞技术团队
有赞技术团队
大猫的无限游戏
大猫的无限游戏
博客园_首页
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
L
LangChain Blog
Hugging Face - Blog
Hugging Face - Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
aimingoo的专栏
aimingoo的专栏
Blog — PlanetScale
Blog — PlanetScale
爱范儿
爱范儿
T
Tailwind CSS Blog
Jina AI
Jina AI
量子位
Stack Overflow Blog
Stack Overflow Blog
人人都是产品经理
人人都是产品经理
J
Java Code Geeks
V
Visual Studio Blog
月光博客
月光博客

蛋蛋之家

SUMIFS和LET函数——让 Excel 自己动起来 Halo 博客晚间卡顿排查记:从"玄学卡顿"到"真凶落网" 我用这个开源项目,把 AI 绘画提示词变成了"代码"——awesome-gpt-image-2 深度体验报告 群晖部署 LX Music Server:浏览器就是你的音乐播放器【详细版】 500道Word题库太痛苦?于是我写了个智能学习平台 别用一个人的奔跑,耗尽两个人的余生——《你凭什么认为我会一直喜欢你呢》 博客评论自动填充新方案:兼容 Vue/React 响应式绑定与跨架构填充逻辑 2026 生产级指南:Halo 2.x + PostgreSQL 自动化部署与性能优化手册 - 蛋蛋之家 从 Typecho 转向 Halo 2.x:全能型 Nginx 架构与 SEO 无损迁移指南 - 蛋蛋之家 Typecho 迁移 Halo 完整教程:数据库视图解决表前缀 + 自动提取封面图 + 去重检测 - 蛋蛋之家 我的 CodeBuddy 装备库:218个技能全公开 + 使用心得 - 蛋蛋之家 为博客添加自定义评论表情 - 蛋蛋之家 - 一枚蛋蛋的自留地 Comment2Bark:Typecho评论推送到Bark插件 又拍云插件 UpyunFile v1.2 更新:修复 Typecho 1.3.0 兼容性问题 - 蛋蛋之家 手把手修复RSS 403:从PHP警告到Cloudflare拦截的全链路排查 - 蛋蛋之家 - 一枚蛋蛋的自留地 网站被镜像怎么办?2026年反镜像攻防实战指南 - 蛋蛋之家 - 一枚蛋蛋的自留地 VLESS + Reality + Vision:2026 极致隐蔽节点搭建全解析 - 蛋蛋之家 给OpenList和Alist加上液态玻璃效果,颜值直接拉满! - 蛋蛋之家 - 一枚蛋蛋的自留地 网页截图瞬间“赛博飞升”?手把手教你根治 Windows HDR 截图发白 - 蛋蛋之家 群晖 NAS 影音终极方案:Docker Rclone + OpenList 完美挂载 Plex 全攻略 一个简洁高效的SVG图标库 - 蛋蛋之家 - 一枚蛋蛋的自留地 告别重复劳动!一键填充评论的神奇书签脚本 - 蛋蛋之家 - 一枚蛋蛋的自留地 解锁思源笔记的隐藏力量:siyuan-patch 深度体验与技术实现 - 蛋蛋之家 - 一枚蛋蛋的自留地 Oracle Cloud 自救指南:旧手机丢失后如何绕过 MFA 重新登录【更新2026年最新政策】 - 蛋蛋之家 本站已加入“萌国ICP备案”联萌!😄 - 蛋蛋之家 - 一枚蛋蛋的自留地 Excel 月报自动化指南:告别重复劳动,让数据主动为你服务 - 蛋蛋之家 - 一枚蛋蛋的自留地 梦呓:为异地女友准备的2周年惊喜礼物 - 蛋蛋之家 - 一枚蛋蛋的自留地 Typecho 多吉云插件优化:更灵活的存储目录配置 - 蛋蛋之家 - 一枚蛋蛋的自留地 甲骨文云硬盘扩容指南:从50G到200G的“免费午餐”怎么吃? Typecho 又拍云文件管理插件修改版使用指南:新增自定义目录结构功能 华为鸿蒙6.0回退4.2记录 最近小公主情绪不佳 劳动节的家乡景色 烟台山公园一游 群晖搭建ChatGPT Web 推荐脚本:ChatGPT - 提示选择器 Activation Method for JetBrains Products (English version) JetBrains 系列产品激活方法 疫情三年后再进校园 修复searchEngineJump在谷歌搜索页面不生效问题 事情既然发生了,可以是遗憾,不要去后悔。 侄女的试唱会比赛 新一代图片编码格式测试 省科技馆之行 Typora Windows版破解补丁及主题推荐 在Typora中使用PicList上传图片 域名ICP备案之变更网站 Ubuntu 系统如何使用 root 用户登录 中国联通——让一切自由连不通 如何选购适合的口罩?
⏰ 時間同步:當你的服務器開始“穿越”時,如何優雅地把它拉回現實
吴蛋蛋 · 2026-01-19 · via 蛋蛋之家

沙漏

"在數字世界裡,時間可以同步,但你的頭髮可能永遠不會再同步了"


之前有過一篇簡要的文章,大家可以先看看


📅 開篇:一個關於"時間旅行"的真實故事

  最近,公司遇到一個案例:"數據庫主從同步延遲 10 分鐘"。在大家努力排查半小時後,我們發現了一個令人哭笑不得的事實——從庫服務器的時間比主庫快了整整 10 分鐘。是的,這臺服務器正在 "穿越" 到未來,而我們的數據還在過去徘徊。

graph LR A[主庫] -->|數據同步| B[從庫] C[現實時間] -->|時間流| A C -->|時間流| B B-.->|時間快10分鐘| C style B fill:#ff9999

  這讓我想一句經典名言:"服務器的時間可以不準,但你的排查思路必須準"。

  今天,我們就來聊聊甲骨文雲(Oracle Cloud)Ubuntu 系統的時間同步——這個看似簡單,卻能讓無數運維人深夜加班的 "小問題"。


🎯 一、為什麼時間同步如此重要?(不只是"對個表"那麼簡單)

  在分佈式系統中,時間同步不是 "可有可無" 的裝飾品,而是基礎設施的基石。想象一下:

  • 🔄 數據庫主從複製:時間不同步可能導致數據衝突、複製中斷
  • 📊 日誌分析:跨服務器日誌時間戳錯亂,排查問題如同大海撈針
  • 🔐 證書驗證:SSL/TLS 證書依賴時間,偏差過大直接導致服務不可用
  • 🚨 監控告警:告警時間錯亂,你永遠不知道問題到底發生在"昨天"還是"明天"

💡 真實案例:某電商公司 "雙 11" 大促期間,由於負載均衡器時間偏差 5 分鐘,導致大量用戶會話提前失效,直接損失訂單數百萬元。

  用一句話總結:時間不同步,系統就變成了 "薛定諤的貓"——你永遠不知道它現在處於什麼狀態


🧰 二、甲骨文 Ubuntu 的時間同步"工具箱"

2.1 默認配置:systemd-timesyncd(你的"貼心小助手")

  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

2.2 進階選擇:chrony(時間同步界的"瑞士軍刀")

  如果你對時間精度有 "強迫症"(比如金融交易系統要求毫秒級同步),或者 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

  輸出中的 ^* 標記表示當前同步的源。如果沒有看到 ^*,嗯... 可能需要請這位 "管家" 喝杯咖啡(重啟服務)或者換個 "管家"(檢查配置)。


🔧 三、甲骨文雲的特殊"彩蛋"與坑點

3.1 默認時間源:169.254.169.254(不是 IP,是"愛的號碼牌")

  甲骨文雲實例默認從 169.254.169.254 獲取時間。這個 IP 是實例元數據服務的地址,不是公網 NTP 服務器。好處多多:

特性 優勢 說明
⏱️ 延遲低 雲內網絡,延遲通常在毫秒級 公網 NTP 通常 10-50ms,這個<1ms
🎯 精度高 雲平臺統一時間源 避免網絡抖動影響
💰 免費 不消耗公網流量 省錢就是硬道理
🔒 安全 內部網絡,更安全 避免 NTP 放大攻擊

  但要注意:這個服務只在雲實例內部可用。如果你在本地環境測試,或者需要其他 NTP 服務器,需要手動配置。

3.2 防火牆:別讓"門衛"攔住了時間

  時間同步使用 UDP 123 端口。如果發現時間不同步,先檢查這三道 "門":

# 第一道門:系統防火牆
sudo ufw status
# 如果啟用了ufw,確保有:
# 123/udp                     ALLOW       Anywhere

# 第二道門:安全組規則(甲骨文雲控制台)
# 檢查出站規則:是否允許UDP 123端口

# 第三道門:網絡ACL
# 甲骨文雲網絡ACL:確保出站流量允許

  記住:時間同步是 "單向" 的——客戶端主動請求服務器,所以只需要出站規則。別把防火牆配置成 "只進不出",那樣時間就真的 "停滯" 了。


🚑 四、實戰:當時間開始"穿越"時,如何優雅地修復

🆘 場景 1:時間偏差過大(超過 5 分鐘)

  症狀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

  1. 🚨 臨時同步(先救急):
# 先停用自動同步
sudo timedatectl set-ntp false

# 手動同步(緊急止血)
sudo ntpdate -u pool.ntp.org

# 重新啟用自動同步
sudo timedatectl set-ntp true
  1. 🔍 檢查服務狀態
# 查看服務狀態
systemctl status systemd-timesyncd

# 查看最近日誌(重點看錯誤信息)
journalctl -u systemd-timesyncd --since "5 minutes ago" | tail -20
  1. 🔄 如果持續不同步,考慮切換到 chrony:
# 優雅切換:先停用舊的,再啟用新的
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

🕐 場景 2:時區設置錯誤(人在上海,心在 UTC)

  症狀:時間顯示正確,但時區是 UTC 或其他時區,日誌時間戳讓人困惑。

  修復

# 查看所有可用時區(找找你所在的城市)
timedatectl list-timezones | grep -i shanghai

# 設置時區(以上海為例)
sudo timedatectl set-timezone Asia/Shanghai

# 驗證設置
date

💡 小貼士:生產環境建議統一使用 UTC 時區,避免時區轉換帶來的混亂。應用層根據業務需求顯示本地時間。這樣做的優點:

  1. 避免夏令時問題
  2. 日誌時間統一
  3. 跨時區協作更方便

🧪 五、高級話題:chrony 的"黑科技"調優

  如果你對時間同步有極致追求,chrony 提供了更多 "調優" 選項:

5.1 調整同步策略("溫柔"還是"強硬",你說了算)

  在 /etc/chrony/chrony.conf 中,可以配置不同的同步策略:

# 方案A:更激進的同步策略(適合網絡不穩定的環境)
maxchange 1000 0  # 允許更大的時間跳變
makestep 1 3      # 如果偏差超過1秒,立即步進調整

# 方案B:更保守的策略(適合對時間敏感的應用)
maxpoll 12        # 最大輪詢間隔(4096秒)
minpoll 6         # 最小輪詢間隔(64秒)

  參數解釋

  • maxchange:允許的最大時間調整量
  • makestep:時間偏差超過閾值時是否"跳變"
  • maxpoll/minpoll:輪詢間隔,值越大同步頻率越低

5.2 監控和診斷("把脈"時間同步)

# 查看詳細的同步狀態
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

5.3 可視化監控(Grafana 看板)

  如果需要更直觀的監控,可以配置 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

Grafana 中的 NTP 監控看板示例


🎓 六、總結:時間同步的"哲學"與最佳實踐

  時間同步看似簡單,實則暗藏玄機。經過多年的 "血淚教訓",我總結了幾個關鍵點:

🏆 最佳實踐清單

  1. ✅ 默認配置通常夠用:甲骨文 Ubuntu 的 systemd-timesyncd + 169.254.169.254,99% 的場景無需折騰
  2. ✅ 問題排查有順序:先檢查服務狀態 → 查看日誌 → 檢查網絡 → 考慮切換服務
  3. ✅ 時區設置要統一:生產環境建議 UTC,避免"時區地獄"
  4. ✅ 監控不能少:配置監控告警,及時發現時間偏差
  5. ✅ 文檔要記錄:記錄每臺服務器的時間同步配置,便於排查

📈 性能指標參考

指標 優秀 良好 需要關注 緊急
時間偏移 <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

  ‍

我的博客即將同步至騰訊雲開發者社區,邀請大家一同入駐: