許多依賴於謹慎排序事件的軟體系統都依賴於穩定、一致的系統時鐘。這些系統通常會使用含有時間戳記的系統記錄,確保時間同步,並在發生問題時進行偵錯。為確保系統時鐘保持同步,Compute Engine 執行個體已預先設定為使用網路時間通訊協定 (NTP),這是時間同步硬體和軟體的組合解決方案。
在罕見的閏秒情況下,NTP 也很有幫助。閏秒是指為因應地球自轉變化,對世界標準時間 (UTC) 進行的一秒調整。由於地球的自轉速度會因應氣候和地質事件而不規律地變化,因此閏秒不會定期發生。先前的閏秒對網路上的各種服務和應用程式造成明顯影響。NTP 伺服器可確保所有伺服器在閏秒事件期間回報相同的時間。
本文說明如何在運算執行個體上設定 NTP 伺服器,包括如何正確處理閏秒。
Google NTP 伺服器和閏秒抹除簡介
Unix 作業系統通常會重複當天的最後一秒,藉此實作閏秒。這可能會導致軟體發生問題,因為軟體預期時間戳記只會增加。為解決這個問題,時間伺服器會在閏秒事件前後各 12 小時,將多出的 1 秒「抹除」 Google Cloud,讓電腦不會一次看到多出的 1 秒,而將其視為重複的時間戳記。這可降低系統中時間戳記不一致的風險。建議您將所有運算執行個體設定為使用 Google 內部 NTP 服務。
建議不要使用外部 NTP 服務
Google Cloud 無法預測外部 NTP 服務 (例如 pool.ntp.org) 如何處理閏秒。強烈建議您不要在運算執行個體中使用外部 NTP 來源。如果同時使用 Google 的 NTP 服務和外部服務,系統時間可能會發生無法預測的變更。建議您只使用單一外部 NTP 來源,而非混合使用,但外部 NTP 服務 (例如 pool.ntp.org) 通常會使用步進法來處理閏秒。因此,執行個體可能會看到重複的時間戳記。
最安全的方法是將運算執行個體設定為使用單一 NTP 伺服器,也就是 Google 提供的內部 NTP 伺服器。如要進一步瞭解 Google 提供的內部 NTP 伺服器,請參閱 Google Public NTP 常見問題。
搭配使用閏秒調整與 Google Cloud外部系統
Google NTP 伺服器的閏秒抹除功能可輕鬆管理時間敏感系統重播一秒所涉及的風險。其他 NTP 服務可能為大多數軟體系統提供可接受的解決方法。不過,請務必不要將 Google 閏秒調整 NTP 服務與公開 NTP 步進服務混用。
如要將裝置同步到與 Google Cloud 抹除時間不同的時間,可以為這些裝置使用 Google Public NTP。Google 公用 NTP 採用與 Compute Engine 執行個體相同的閏秒抹除技術。
為您的執行個體設定 NTP
為確保運算執行個體設定正確,請按照下列指示操作:
Linux (chrony)
根據預設,大多數 Linux 版本都會使用 chrony 管理 NTP 設定和時間同步。如要確保 chrony 只使用內部 NTP 服務,請檢查 chrony 設定並移除外部 NTP 伺服器。
使用
ssh連線至運算執行個體。控制台
如要使用控制台透過 SSH 連線至運算執行個體,請按照下列步驟操作:
前往 Google Cloud 控制台的「VM instances」(VM 執行個體) 頁面。
找到要設定的執行個體,然後按一下該執行個體的「SSH」SSH按鈕。
gcloud
如要使用 Google Cloud CLI 透過 SSH 連線至運算執行個體,請執行下列指令:
gcloud compute instances ssh INSTANCE_NAME
將
INSTANCE_NAME替換為要連線的執行個體名稱。在執行個體上執行
chronyc sources,檢查 NTP 設定的目前狀態:$ chronyc sources輸出看起來類似以下內容:
210 Number of sources = 2 MS Name/IP address Stratum Poll Reach LastRx Last sample =============================================================================== ^* metadata.google.internal 2 6 377 4 -14us[ -28us] +/- 257us ^- 38.229.53.9 2 6 37 4 -283us[ -297us] +/- 28ms
如果看到單一記錄指向
metadata.google或metadata.google.internal,則不需要進行任何變更。如果看到多個來源,且其中混有metadata.google和公開來源 (例如pool.ntp.org),請更新來源,移除所有外部 NTP 伺服器。在輸出內容範例中,有兩筆記錄,一筆指向
metadata.google.internal,另一筆指向外部位址。由於有多個來源,您需要更新 NTP 伺服器,移除38.229.53.9位址,詳情請參閱下一個步驟。設定 NTP 伺服器,移除外部 NTP 伺服器。
如要從清單中移除額外的 NTP 伺服器,請使用慣用的文字編輯器編輯
/etc/chrony/chrony.conf檔案。找出所有開頭為server external_source_ip_or_name的行,並將其移除。編輯
/etc/chrony/chrony.conf檔案後,請重新啟動chrony服務。重新啟動的指令可能因 Linux 發行版而異,如下列範例所示:sudo service chrony restart
sudo systemctl restart chrony
再次執行
chronyc sources指令,確認設定:$ chronyc sources輸出內容應如下所示:
210 Number of sources = 1 MS Name/IP address Stratum Poll Reach LastRx Last sample =============================================================================== ^* metadata.google.internal 2 7 377 98 -1343ns[-1588ns] +/- 396us
Linux (ntpd)
不支援 chrony 的舊版 Linux 發行版會改用 ntpd 管理 NTP 設定和時間同步。如要確保 ntpd 只使用內部 NTP 服務,請檢查 ntpd 設定並移除外部 NTP 伺服器。
使用
ssh連線至運算執行個體。控制台
如要使用控制台透過 SSH 連線至運算執行個體,請按照下列步驟操作:
前往 Google Cloud 控制台的「VM instances」(VM 執行個體) 頁面。
找到要設定的執行個體,然後按一下該執行個體的「SSH」SSH按鈕。
gcloud
如要使用 Google Cloud CLI 透過 SSH 連線至運算執行個體,請執行下列指令:
gcloud compute instances ssh INSTANCE_NAME
將
INSTANCE_NAME替換為要連線的執行個體名稱。在您的執行個體上,執行
ntpq -p以檢查 NTP 設定的目前狀態:$ ntpq -p輸出內容大致如下:
remote refid st t when poll reach delay offset jitter ============================================================================== *metadata.google 255.28.23.83 2 u 27 64 1 0.634 -2.537 2.285 *217.162.232.173 130.149.17.8 2 u 191 1024 176 79.245 3.589 27.454
如果看到單一記錄指向
metadata.google或metadata.google.internal,則不需要進行任何變更。如果看到多個來源,且混合了metadata.google和pool.ntp.org等公開來源,請務必更新來源,移除所有外部 NTP 伺服器。在輸出範例中,有兩筆記錄,一筆指向
metadata.google,另一筆指向外部位址。由於來源眾多,您需要更新 NTP 伺服器,移除*217.162.232.173位址,詳情請見下一個步驟。設定您的 NTP 伺服器,移除外部來源。
如要設定 NTP 伺服器,請使用慣用的文字編輯器編輯
/etc/ntp.conf檔案。找出設定的servers部分,然後移除所有非 Google NTP 來源,例如:vim /etc/ntp.conf# You do need to talk to an NTP server or two (or three). #server ntp.your-provider.example ... server metadata.google.internal iburst編輯
/etc/ntp.conf檔案之後,重新啟動 NTP 服務。重新啟動的指令可能與下列範例不同,視您的 Linux 發行版而定:sudo service ntp reload再次執行
ntpq -p指令,確認設定:ntpq -premote refid st t when poll reach delay offset jitter ============================================================================== *metadata.google 255.28.23.83 2 u 27 64 1 0.634 -2.537 2.285
Windows
前往 Google Cloud 控制台的「VM instances」(VM 執行個體) 頁面。
找到要連線的 Windows 執行個體,然後點選旁邊的「RDP」RDP按鈕。
登入後,在 PowerShell 圖示上按一下滑鼠右鍵,然後選取「以系統管理員身分執行」。
當命令提示字元載入時,執行下列指令來查看目前的 NTP 設定:
w32tm /query /configuration[Configuration] ... Type: NTP (Local) NtpServer: metadata.google.internal, ...
如果看到單一記錄指向
metadata.google或metadata.google.internal,則不需要進行任何變更。如果看到多個來源,其中混合了metadata.google和公開來源,則必須移除外部伺服器。請按照 Windows 指南設定 NTP 伺服器。為確保 Windows VM 上的軟體相容性最廣泛,Google 建議使用 gVNIC 驅動程式,確保
metadata.google的 NTP 精確度達到毫秒以下。如果必須在 Windows VM 中使用 VirtIO,為了透過 NTP 伺服器取得毫秒以下的準確度,Google 建議您不要使用 Windows Time Service (停止並取消註冊
w32tm)。停止 Windows Time Service:
net stop w32time從登錄檔中移除 Windows Time 服務:
w32tm /unregister停止 Windows Time Service 並從登錄檔中移除後,請安裝 Meinberg NTP 用戶端。
按照 Meinberg 文件中的設定指示操作。
將 Meinberg NTP 用戶端的 NTP 伺服器設為
metadata.google.internal。完成 NTP 設定後,請等待 5 到 15 分鐘,讓運算執行個體中的系統時鐘與 NTP 伺服器同步。
如要瞭解我們不建議使用
w32tm的原因,請參閱已知問題說明文件。
後續步驟
- 進一步瞭解 PCI 資料安全標準法規遵循。
- 參閱 Google 公用 NTP 常見問題。