本文將說明在 Compute Engine 上設計彈性系統的最佳做法。這份指南提供一般建議,並介紹 Compute Engine 的部分功能,可協助您減少執行個體服務中斷時間,並為 Compute Engine 執行個體發生意外故障時做好準備。
韌性系統是指能夠承受一定程度的故障或中斷,但不會中斷服務,也不會影響使用者體驗的系統。雖然 Compute Engine 會盡力避免這類中斷,但某些事件無法預測,因此最好為這些事件做好準備。
故障類型
由於系統或硬體故障,您的一或多個運算執行個體可能會在某個時間點遺失。以下列出幾種可減輕影響的失敗情況:
未預期的單一執行個體故障
單一執行個體發生未預期的故障,可能是因為硬體或系統故障。您可以透過永久磁碟和啟動指令碼儲存資料,並在重新啟動 VM 後重新啟用軟體,藉此減輕這些事件的影響。
單一 VM 意外重新啟動
您有時可能會遇到單一 VM 意外故障並重新啟動的情況。與單一 VM 發生非預期故障不同,Compute Engine 會在 VM 故障後自動重新啟動。為協助減輕這些事件的影響,請備份資料、使用 Google Cloud Hyperdisk 或永久磁碟,並使用啟動指令碼快速重新設定軟體。
區域或可用區失敗
可用區和區域故障是罕見的故障,但可能導致特定可用區或區域中的所有執行個體無法存取或發生故障。為減輕這些故障的影響,請在區域和可用區之間建立多元性,並實作負載平衡。您也應備份資料或將磁碟複製到多個可用區。
暫時容量限制
需求突然激增可能會暫時限制特定可用區的資源可用性。在這種限制下,Compute Engine 無法佈建運算執行個體,並會傳回資源可用性錯誤,例如
ZONE_RESOURCE_POOL_EXHAUSTED或RESOURCE_EXHAUSTED。請勿將這些容量限制視為錯誤,而是設計彈性基礎架構,以便自動改用其他可用區和機型中的可用資源。
設計具韌性系統的訣竅
為降低運算執行個體故障的風險,請設計應用程式,確保應用程式能抵禦故障、網路中斷和意外災害。彈性系統會妥善處理故障情形,例如將無法存取的執行個體流量重新導向至正常運作的執行個體,或在重新啟動時自動執行工作。
以下提供幾項通用訣竅,協助您設計可抵禦故障的彈性系統。
導入彈性基礎架構
將工作負載限制在單一硬體設定或可用區,可能會在需求高峰期間增加佈建失敗的風險。彈性的 Compute Engine 基礎架構可自動配合可用容量調整,並擴充工作負載,無需手動介入,有助於提高佈建成功率。
您可以透過下列方式實作基礎架構彈性:
- 地點彈性:繞過本地容量限制的路線。
- 機型彈性:主要選擇無法使用時,可改用替代硬體。
- 時間彈性:將資源要求排入佇列,等待資源可用。
詳情請參閱「最佳化運算資源佈建」。
在專屬專案中,隔離執行不信任程式碼的執行個體
如果系統會處理不受信任的程式碼 (例如執行 AI 生成的指令碼,或代表外部使用者執行建構工作,例如 CI 系統),您應將這些工作者執行個體放在專屬專案中。
Compute Engine 設有多種配額和濫用行為偵測機制,有助於強制執行使用限制政策等政策。如果系統偵測到濫用行為,可能會限制可用容量、提高頻率限制,或關閉專案中的執行個體。將執行個體劃分為專案,可確保防濫用機制不會影響主要工作負載。這項做法符合 Google Cloud上基礎架構即服務 (IaaS) 的內容和使用情況共同責任模式。
使用即時遷移
Google Cloud 定期對基礎架構執行維護作業,包括使用最新軟體來修補系統、執行例行測試和預防性維護,整體目的在於確保基礎架構能安全、快速有效率地運作,達到我們的最高水準。Compute Engine 採用即時遷移,確保基礎架構維護作業預設不會影響您的運算執行個體。
即時遷移技術可將執行中的執行個體從即將維護的系統移開,Compute Engine 會自動為支援的執行個體類型執行這項操作。
在即時遷移期間,執行個體的效能可能會短暫降低。如果執行個體需要持續達到最高效能,您可以將執行個體設為在其他主機上重新啟動,而不是進行即時遷移。如果選擇這個選項,Compute Engine 會停止執行個體,並在未參與維護事件的主機上重新啟動執行個體。終止並重新啟動執行個體,適用於整體應用程式,這些應用程式也建構為可處理執行個體故障或重新啟動。
如要設定執行個體以進行即時遷移,或設定執行個體重新啟動而非遷移,請參閱「為運算執行個體設定主機維護政策」。
發佈執行個體
跨多個區域和可用區建立執行個體,這樣一來,如果含有其中一個執行個體的可用區或區域發生中斷,您就能指向替代運算執行個體。如果您在同一個可用區或區域中建立所有執行個體,一旦該可用區或區域無法連線,您就無法存取任何執行個體。
使用區域特定的內部 DNS 名稱
將專案或機構的預設內部 DNS 類型設為區域性 DNS。在應用程式中存取其他運算執行個體時,請使用可用區 DNS 名稱。內部 DNS 伺服器分布在所有可用區,因此即使其他位置發生故障,您仍可依賴區域性 DNS 名稱進行解析。
全域 DNS 的韌性較低,因為會發生單點故障。區域性 DNS 可降低跨區域服務中斷的風險。區域性 DNS 不要求專案中所有區域的執行個體名稱皆不重複,因此可加快執行個體建立速度。
如要檢查執行個體是否使用可用區 DNS 名稱或全域 DNS 名稱,請參閱「判斷 VM 的內部 DNS 名稱」。
如果專案使用全域 DNS 名稱,可以改用區域性 DNS 名稱。詳情請參閱「將可用區 DNS 用於內部 DNS 類型」。
建立 VM 群組
使用代管執行個體群組 (MIG) 建立 VM 群組,這樣一來,如果單一 VM 狀況不佳,負載平衡器就能將流量導向多個 VM。
MIG 也提供自動調度資源和自動修復等功能。自動調度資源功能可根據特定信號,調高或調低 VM 數量,協助您處理流量尖峰。自動修復功能會執行健康狀態檢查,並在必要時自動重新建立健康狀態不良的 VM。
區域也提供 MIG,因此您可以建立一組 VM,分散在單一區域的多個可用區。詳情請參閱「建立及管理區域 MIG」。
使用負載平衡
Google Cloud 提供負載平衡服務,協助您在流量高峰期提供支援,避免運算執行個體超載。使用 Cloud Load Balancing,您可以執行下列操作:
使用區域性 MIG,在多個可用區的 VM 上部署應用程式。接著,您可以設定轉送規則,將流量分散到區域內所有可用區的所有 VM。每項轉送規則都可以使用外部 IP 位址,為應用程式定義一個進入點。
使用全域負載平衡,在多個區域部署 VM。 HTTP(S) 負載平衡可讓流量在最接近用戶端的 Google Cloud 系統 位置進入。跨區域負載平衡提供備援功能,因此如果某個區域無法連線,流量會自動轉移至其他區域。這樣一來,您的服務仍可透過相同的外部 IP 位址存取。
使用自動調度資源功能,根據負載的增減,自動在 MIG 新增或刪除 VM。
此外,Cloud Load Balancing 提供 VM 健康狀態檢查功能,可偵測及處理 VM 故障。
Cloud DNS
Cloud DNS 是一項高效能且具韌性的全球網域名稱系統 (DNS) 服務,可讓您儲存 IP 位址和其他資料,然後按名稱查詢這些內容。有了 Cloud DNS,您就能在 DNS 中發布區域和記錄,不必自行管理 DNS 伺服器和軟體。Cloud DNS 會使用 anycast,從全球多個位置為代管區域提供服務。
如要實現高可用性,請在最能支援應用程式流量的區域中,部署多個個別的區域性外部應用程式負載平衡器,並使用 Cloud DNS 地理位置轉送政策,將流量轉送至不同區域中的兩個以上負載平衡器。系統會自動將要求轉送到最近的位置,縮短延遲時間並提高使用者的權威名稱查詢效能。
詳情請參閱「區域性外部應用程式負載平衡器的高可用性」。
使用啟動與關閉指令碼
Compute Engine 提供開機和關機指令碼,分別在執行個體啟動或關機時執行。開機和關機指令碼可自動執行安裝軟體、執行更新、備份及記錄資料等工作。
啟動和關閉指令碼可讓您有效率地啟動或徹底關閉執行個體,是相當重要的一種方式。使用開機指令碼設定執行個體,可能比使用自訂映像檔設定執行個體更有好處。
每當執行個體因故障而重新啟動時,系統就會執行開機指令碼,可用於安裝軟體和更新。您也可以使用開機指令碼,確保服務在執行個體中正常運作。在開機指令碼中編寫變更內容,以設定執行個體,通常比建立及管理不受支援的自訂映像檔更簡單。
無論執行個體是否刻意關機,關機指令碼都會在執行個體關機時執行。 執行個體停止前,他們可以執行最後一刻的工作,例如備份資料、儲存記錄,以及正常關閉連線。
備份資料
定期將資料備份到多個位置。您可以將檔案上傳至 Cloud Storage、建立磁碟快照,或使用同步複製將資料複製到其他可用區的磁碟,或使用非同步複製將資料複製到其他區域。