許多依賴於謹慎排序事件的軟體系統都依賴於穩定、一致的系統時鐘。大多數服務寫入的系統記錄都包含時間戳記,其有助於對系統各元件之間發生的問題進行偵錯。為了協助保持系統時鐘的同步,Compute Engine 執行個體已預先設定為使用網路時間通訊協定 (NTP)。
除了保持伺服器時間的同步以外,NTP 也對極少出現的閏秒情況有所幫助。閏秒是為了因應地球自轉的變化而對 UTC 時間做出的一秒調整。由於地球的旋轉速度會因氣候和地質事件而變化,因此不會在例行間隔加入闋濫秒。先前的閏秒明顯影響了網站上的各種服務和應用程式。NTP 伺服器可確保所有伺服器在閏秒事件期間回報相同的時間。
本文說明如何在虛擬機器 (VM) 上設定 NTP 伺服器,以便在閏秒發生時正常運作。
Google NTP 伺服器與閏秒抹除
Unix 作業系統的閏秒通常是透過重複一天中的最後一秒來實作。這可能會導致預期時間戳記只會增加的軟體發生問題。為瞭解決這個問題, Google Cloud的時間伺服器會每二十四小時 (閏秒事件之前及之後的十二秒)「抹除」額外的一秒,這樣電腦就不會突然看到額外的秒數成為重複的時間戳記。這樣可以降低依賴一致時間戳記之系統的風險。建議您將所有 Compute Engine 虛擬機器 (VM) 執行個體設為使用內部 Google NTP 服務。
為您的執行個體設定 NTP
Google Cloud 無法預測外部 NTP 服務 (例如 pool.ntp.org
) 會如何處理閏秒。建議您盡可能不要在 Compute Engine VM 中使用外部 NTP 來源。更糟的情況是,同時使用 Google 的 NTP 服務與外部服務可能導致系統時間出現無法預測的變更。建議只使用單一外部 NTP 來源,而不要混用多個來源,但外部 NTP 服務 (例如 pool.ntp.org
) 可能會使用步進處理閏秒。因此,您的 VM 可能會看到重複的時間戳記。
最安全的方法是設定 Compute Engine VM 使用單一 NTP 伺服器,也就是 Google 提供的內部 NTP 伺服器。請勿混用外部 NTP 伺服器和 Google NTP 伺服器,否則可能會導致非預期的行為。如要進一步瞭解 Google 提供的內部 NTP 伺服器,請參閱 Google Public NTP 常見問題。
如要確保虛擬機器設定正確,請按照以下說明操作。
Linux (chrony)
根據預設,大多數新的 Linux 版本都會使用 chrony
管理 NTP 設定和時間同步處理。為確保 chrony
只使用內部 NTP 服務,請檢查 chrony
設定並移除外部 NTP 伺服器。
使用
ssh
連線至執行個體。主控台
如要使用控制台透過 SSH 連線至 VM,請按照下列步驟操作:
前往 Google Cloud 控制台的「VM instances」(VM 執行個體) 頁面。
找出要設定的 VM,然後按一下該 VM 的「SSH」SSH按鈕。
gcloud
如要使用 Google Cloud CLI 透過 SSH 連線至 VM,請執行下列指令:
gcloud compute instances ssh VM_NAME
將
VM_NAME
替換為您要連線的 VM 名稱。在您的執行個體上,執行
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)
大多數舊版 Linux 發行版會使用 ntpd
管理 NTP 設定和時間同步處理。如要確保 ntpd
只使用內部 NTP 服務,請檢查 ntpd
設定並移除外部 NTP 伺服器。
使用
ssh
連線至執行個體。主控台
如要使用控制台透過 SSH 連線至 VM,請按照下列步驟操作:
前往 Google Cloud 控制台的「VM instances」(VM 執行個體) 頁面。
找出要設定的 VM,然後按一下該 VM 的「SSH」SSH按鈕。
gcloud
如要使用 Google Cloud CLI 透過 SSH 連線至 VM,請執行下列指令:
gcloud compute instances ssh VM_NAME
將
VM_NAME
替換為您要連線的 VM 名稱。在您的執行個體上,執行
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 -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
Windows
前往 Google Cloud 控制台的「VM instances」(VM 執行個體) 頁面。
按一下您要連線的 Windows 執行個體旁邊的「RDP」RDP按鈕。
登入之後,在 Powershell 圖示上按一下滑鼠右鍵,選取 [Run as administrator] (以系統管理員身分執行)。
當命令提示字元載入時,執行下列指令來查看目前的 NTP 設定:
w32tm /query /configuration
[Configuration] ... Type: NTP (Local) NtpServer: metadata.google.internal, ...
如果您看見單一記錄指向
metadata.google
或metadata.google.internal
,則不需要進行任何變更。如果您看見混合出現的多個來源,包括metadata.google
與公開來源,則需要移除外部伺服器。請按照 Windows 指南設定 NTP 伺服器。為確保 Windows 虛擬機器上有最廣泛的軟體相容性,Google 建議您使用 gVNIC 驅動程式,確保
metadata.google
的 NTP 準確度為毫秒以下。如果您必須在 Windows VM 中使用 VirtIO,以便透過 NTP 伺服器取得小於毫秒的精確度,Google 建議您不要使用 Windows Time Service (停止並取消註冊
w32tm
)。停止 Windows 時間服務:
net stop w32time
從登錄檔中移除 Windows 時間服務:
w32tm /unregister
在停止 Windows 時間服務並從登錄資料庫中移除後,請安裝 Meinberg NTP 用戶端。
按照 Meinberg 說明文件中的操作說明進行設定。
將 Meinberg NTP 用戶端的 NTP 伺服器設定為
metadata.google.internal
。設定 NTP 後,請等待 5 到 15 分鐘,讓 VM 中的系統時鐘與 NTP 伺服器同步。
如要進一步瞭解為何不建議使用 w32tm,請參閱已知問題說明文件。
在 Google Cloud以外的系統中使用躍進模糊處理
Google 的 NTP 伺服器的閏秒抹除功能是一種便利的方法,可消除在時間敏感系統上重播一秒時涉及的風險。其他 NTP 服務可為大多數軟體系統提供可接受的解決辦法。不過,請務必不要混用 Google 閏秒抹除 NTP 服務與公開 NTP 步進式服務。
如要將 Google Cloud 以外的裝置與抹除的時間同步,您可以為這些裝置使用 Google 公開 NTP。Google 公開 NTP 會使用與 Compute Engine VM 相同的閏秒抹除方法。
後續步驟
- 進一步瞭解 PCI 資料安全標準法規遵循。
- 請參閱 Google Public NTP 常見問題。