可靠性旅程是一個逐步程式,每個階段都是以上一個階段為基礎,以確保系統保持可用,並符合使用者的期望。 此成熟度模型旨在協助您評估目前的狀態,並提供結構化路徑來改善。
反直覺地說,實現可靠性高的方式是接受失敗是不可避免的。 與其嘗試預防每一個問題,不如更有效地規劃您的系統在問題發生時的應對方式。 您的商務需求有助於判斷哪些風險值得主動解決。 Teams 投資於具有結構化檢視能力的進階監控功能,擴展失敗緩解措施以包含應用程式層級的考量,並開始測試復原性措施。
接下來,小組將商務見解與技術技能整合。 各 Teams 實施健康模型、進行失敗模式分析,以便準備完整的災害復原計劃。 此階段透過可測量的目標和各種失敗案例的系統性準備來確保責任。
此模型會結構化為五個不同的成熟度層級,每個層級都有主要目標和一組核心策略。 使用下方的索引標籤式檢視來探索每個層級。 請務必在進行過程中檢閱已標示的取捨及相關風險。
打下工作負載基礎設施與運營韌性的堅實基礎,而不是耗費時間在優化工作上。
成熟度模型的層級 1 是設計來協助工作負載小組為系統可靠性建置堅實的基礎。 重點是自舉,這是建立未來可靠性決策基本概念的過程。 此階段大多牽涉到功能實現,並對目前做法的小幅擴充。
此階段包括研究、獲取見解,以及建立您的系統目錄。 它也使用 Azure 上的內建可靠性功能,例如啟用區域備援以立即改善。
藉由建立這些基本概念,您可以準備小組,以逐步提升系統的復原能力和效能,以進一步提升可靠性成熟度模型的水準。
重要策略
✓ 評估卸除作業責任的機會
此策略基本上是 自行開發 與 購買或依賴外部方案 的方法。 這一決定取決於在這個階段可以管理多少責任,同時仍然支持未來的發展。 您希望使用與工作負載相關的資源,但應該始終尋找機會減少或外包其維護工作。 以下是一些您可能想要套用此方法的傳統使用案例。
藉由選擇平臺即服務 (PaaS) 解決方案,將責任卸載至雲端平臺。 它們為常見的復原需求提供現成的解決方案,例如複製、故障轉移和備份儲存區。 當您採用這種方法時,雲端提供者會處理裝載、維護和復原改善。
例如,雲端提供者會跨多個計算節點複寫數據,並將複本分散到可用性區域。 如果您在虛擬機 (VM) 上建置自己的解決方案,您必須自行管理這些層面,這很耗時且複雜。
卸除不直接與工作負載的商務目標相關的作業責任。 某些特製化作業,例如資料庫管理和安全性,可能會影響工作負載的可靠性。 探索有經驗的小組、技術或兩者都處理這些工作的可能性。
例如,如果您的小組沒有資料庫專業知識,請使用受控服務來協助將責任轉移至提供者。 當您開始時,此方法很有用,因為它可讓小組專注於工作負載的功能。 許多企業已共用、集中管理的服務。 如果平臺小組可供使用,請使用它們來處理這些作業。 不過,此方法可能會新增相依性和組織複雜性。
或者,如果您的小組具備正確的專業知識,您可以明確決定使用其技能,並選取不包含管理功能的服務。
將責任卸除給非Microsoft廠商。 選擇現成的產品作為起點。 只有當自定義解決方案能提高您工作負載對商業的價值時,才建置這些解決方案。
風險: 如果 購買或依賴 選項部分符合您的需求,您可能需要實作客製化擴充功能。 此方法可能會導致「自定義鎖定」的情況,其中更新和現代化變得不切實際。 定期檢閱您的需求,並將其與解決方案的功能進行比較。 在兩者之間有顯著偏差時,開發退出策略。
相反的情況也是風險。 雖然 購買或信賴 的選項起初看似較為簡單,但如果 PaaS 服務、供應商解決方案或平臺資源的限制無法滿足工作負載所需的粒度或自主管理層級,可能稍後需要重新評估與設計。
✓ 識別重要的用戶和系統流程
在這個階段,將工作負載分解成流程非常重要。 專注於 使用者 和 系統 流程。 使用者流程會決定用戶互動,而系統流程會決定未直接與使用者工作相關聯的工作負載元件之間的通訊。
例如,在電子商務應用程式中,客戶會執行前端活動,例如瀏覽和訂購。 同時,後端交易和系統觸發程式會滿足使用者要求,並處理其他工作。 這些不同的流程是相同系統的一部分,但它們牽涉到不同的元件,並有不同的用途。
開始在這個階段建置流程目錄。 觀察用戶互動和元件通訊。 列出和分類流程、定義其起點和終點,以及記下相依性。 為了清楚起見,請使用圖表記錄結果和例外狀況。 此目錄可作為與商務項目關係人進行初始交談的重要工具,以從他們的觀點識別最重要的層面。 此交談可以提供優先考量的首要層面的資訊。
藉由評估主要商務活動的風險和影響,將流程分類為關鍵。 如果您預期發生中斷,則正常降低著重於維護這些重要流程。 在電子商務範例中,重要流程包括產品搜尋、將專案新增至購物車,以及結帳,因為這些工作對商務而言很重要。 其他流程,例如更新產品數據和維護產品圖片,並不那麼重要。 確保關鍵流程在中斷期間保持運作,以防止營收損失,讓用戶繼續搜尋產品,並將專案新增至購物車。
備註
即使商業流程對時間不敏感,它仍然可能是關鍵的。 時間關鍵性是一個關鍵因素。 例如,滿足稽核要求是一個重要過程,但您可能不需要立即呈現稽核數據。 此過程仍然很重要,但其可靠性不是即時而是重要,因為在數小時內復原是可接受的。
如需詳細資訊,請參閱 Azure Well-Architected Framework:使用流程優化工作負載設計。
✓ 選取正確的設計模型、資源和功能
您應該在下列層級套用此策略:
建築: 工作負載設計應該考慮各種基礎結構層級的可靠性預期。 您的初始決策可能是裝載應用程式的容器化或 PaaS 之間的選擇。 或者,您可以考慮網路設定,例如中樞和輪輻或單一虛擬網路。
您也應該設定界限,根據功能建立分割。 例如,不要在單一區域虛擬磁碟的一部 VM 上裝載所有專案,請考慮分割計算和數據記憶體,並使用專用服務。
謹慎
在移轉案例中,在不檢閱新機會的情況下採用「直接搬移」方式,可能會導致錯失的好處和效率低下。 請務必儘早研究現代化,以避免遇到難以變更的設定,並利用更好的選項和改進功能。
Azure 服務: 使用判定樹來協助您為設計選取正確的服務。 選擇符合您目前需求的元件,但保持彈性,讓您可以在工作負載發展且需要更多功能時切換服務。
Azure 服務內的 SKU 或階層: 檢閱每個 SKU 的功能,並瞭解平臺的可用性保證。 評估服務等級協定,以瞭解與已發佈百分位數相關的涵蓋範圍。
支援可靠性的功能: 選擇雲端原生服務,透過簡單的設定來增強可用性,而不需變更程序代碼。 請務必瞭解選項,並刻意選取組態,例如增加區域備援或將數據復寫至次要區域。
✓ 使用基本層級備援進行部署
在您的解決方案的每個部分中,避免單一失敗點,例如單一實例。 請改為建立多個實例以進行備援。 Azure 服務通常會為您處理備援,特別是使用 PaaS 服務,通常預設會包含本機備援,以及升級的選項。 最好使用區域備援,將這些實例分散到多個 Azure 數據中心。 如果您未這麼做,請至少確保本機備援,但此方法的風險較高。 在未來的層級中,您可以藉由使用異地備援元件擴充解決方案,來評估可靠性需求是否符合。
折衷: 一個重要的取捨是備援成本增加。 此外,跨區域通訊可能會帶來延遲。 對於需要最少延遲的舊版應用程式,備援可能會降低效能。
風險: 如果應用程式不是針對多個實例環境所設計,它可能會與多個作用中實例作鬥爭,這可能會導致數據不一致。 此外,如果應用程式是針對低延遲的內部部署設定所建置,則使用可用性區域可能會中斷其效能。
✓ 啟用計量、記錄和追蹤以監視流程
選擇 Azure 監視器之類的平臺原生工具,以確保計量、記錄和追蹤的可見度。 使用內建功能來設定潛在問題的警示。 您應該已備妥基本警示,以傳送通知並取得警示。 利用指出服務健康狀態變更的 Azure 平臺功能,例如:
設定基礎結構和應用程式的 Azure 監視器動作群組 。
權衡: 當您收集更多記錄時,您需要管理不斷增加的數量,這會影響這些記錄的儲存相關成本。 使用保存策略來管理數據量。 使用 Azure 監視器在工作區上設定每日上限。 如需詳細資訊,請參閱 可靠性的設定建議。
開始在下列層級建置可觀察性。
基礎結構
從啟用診斷記錄開始,並確定您從平台元件收集原生計量進行分析。 收集資源使用量的相關信息,例如 CPU、記憶體、輸入/輸出和網路活動。
應用程式
收集應用層級計量,例如記憶體耗用量或要求延遲,以及記錄應用程式活動。 在與主要應用程式線程分開的線程或進程中執行記錄作業。 這種方法不會讓記錄讓應用程式的主要工作變慢。
此外,請檢查Application Insights中 的基本可用性測試 。
資料
若要監視基本層級的資料庫,請收集資料庫資源發出的關鍵計量。 類似於基礎結構元件,監控在資料存儲庫情境下的資源使用量,例如網絡指標。 收集有關連線池化方式的數據對於提升後續階段的效率非常重要。
為了可靠性,務必追蹤連線指標,例如監視活動中和失敗的連線。 例如,在 Azure Cosmos DB 中,當要求數目超過配置的要求單位和連線開始失敗時,會傳回 429 狀態代碼。
✓ 開始建置失敗風險降低劇本
故障範圍涵蓋從間歇性到稍微延長期間的瞬間故障,以及災難性中斷。
在第一層級中,將焦點放在平台故障。 即使它們超出您可控的範圍,您仍然應該有應對它們的策略。 例如,使用可用性區域解決區域性中斷。 預期平台層級的暫時性錯誤,並在您的作業負載中處理這些錯誤。
處理這些失敗的程式會根據複雜性而有所不同。 開始記錄潛在的平臺層級失敗、其相關聯的風險,以及風險降低策略。 此練習主要是理論性的,而且在後期階段通過自動化來提升成熟度。
您應該記錄失敗,包括其可能性、影響和風險降低策略等因素。 使用符合您工作負載目標的關鍵性等級。 您的規模可能包括:
高。 完整的系統中斷,導致重大財務損失和使用者信任下降。
中等。 影響部分工作負載並造成使用者不便的暫時中斷。
低。 影響應用程式非必要功能的次要軟體問題,僅造成使用者極短暫的停機時間。
以下是範例範本:
| 問題 |
風險 |
來源 |
嚴重程度 |
可能性 |
緩和措施 |
| 暫時性網路失敗 |
用戶端會失去與應用程式伺服器的連線。 |
Azure 平台 |
高 |
很可能 |
在客戶端邏輯中使用設計模式,例如重試邏輯和斷路器。 |
| 區域中斷 |
使用者無法連線到應用程式。 |
Azure 平台 |
高 |
不太可能 |
在所有元件上啟用區域復原功能。 |
| 傳輸層安全性 (TLS) 憑證到期 |
用戶端無法與應用程式建立 TLS 工作端。 |
人為錯誤 |
高 |
有可能 |
使用自動化 TLS 憑證管理。 |
| CPU 或記憶體使用量達到定義的限制,並導致伺服器失敗。 |
要求逾時。 |
應用程式 |
中等 |
有可能 |
實作自動重新啟動。 |
| 元件在更新期間無法使用。 |
使用者在應用程式中遇到未處理的錯誤。 |
部署或設定中的變更 |
低 |
部署期間極有可能,有時不太可能 |
處理客戶端邏輯中的元件。 |
在層級 1 中,請勿爭取完整性,因為總是有無法預見的失敗案例。 如果您遇到非預期的中斷情況,請在劇本中記錄原因和風險降低措施。 將此資產視為您隨著時間更新的活體檔。
✓ 新增機制以從暫時性失敗中復原
在雲端環境中,暫時性失敗很常見。 一般來說,這些問題在重試後能在幾秒內解決,表明只是短期問題。
使用內建 SDK 和組態來處理這些錯誤,讓系統保持作用中。 內建組態通常是預設設定,因此您可能需要測試以驗證實作。 此外,實作設計用來處理架構中暫時性失敗的模式。 如需詳細資訊,請參閱 支援可靠性的架構設計模式。
持續性問題可能表示故障並非短暫,或是中斷的開始。 這個情境不僅需要解決應用程式內部的局部問題。 它涉及檢查系統的重要使用者和系統流程,以及新增自我保留技術和復原工作。 這些方法是層級 2 所描述的成熟做法。
✓ 執行基本測試
在軟體開發生命週期的早期階段整合基本可靠性測試。 尋找執行測試的機會,從單元測試開始,以驗證功能和設定。
此外,針對您在風險降低劇本中識別的問題,開發簡單的測試案例。 專注於高影響力、較低成本的緩解措施。 例如,模擬網路中斷或間歇性連線問題,以查看重試邏輯如何解決中斷情況。
風險: 測試通常會在開發週期中帶來摩擦。 若要降低此風險,請讓可靠性測試與開發工作一起追蹤。
特徵開發是優先事項,而測試可以在開發週期中引入摩擦。 在功能開發完成之前,更容易開始測試。 在開始設計應用程式的非功能性需求時,可以讓您在新增功能時加以擴充,而不是累積將來需解決的問題。 雖然此方法一開始需要更多工作,但可管理並防止稍後發生較大的問題。
確保系統保持運作正常且穩定,方法是納入自我保留功能,並具備管理失敗的基本復原計劃。
雲端中的失敗是不可避免的。 您的復原策略應努力讓系統在所有情況下都能正常運作。 層級 1 引進了解決暫時性失敗的方法。 層級 2 著重於合併自我保留策略,以防止、偵測及從長期失敗中復原。 如果尚未解決,這些問題可能會變成完整的中斷。
您在第 1 層識別的關鍵流程將被優先處理。 它們需要提高所有元件的復原能力和復原工作,包括應用程式、服務和資料庫。 預期可能需要調整初始布建大小、實例數量和自動縮放策略,以降低可靠性風險。
在此層級中,請有意識地進行您的監視和測試作法。 使用符合技術需求的進階監視技術,並限定於開發小組。 展開簡單的劇本,以涵蓋您開發和擁有的架構元件,例如應用程式程序代碼。
重要策略
✓ 評估復原的目前狀態,以防止失敗
冗餘層級是否足夠抵禦故障? 定義備援策略,指定要維護的備援資源數目。 決定要將這些資源放置在哪裡,無論是本地、跨區域,還是地理位置分散。 評估雲端平台的設定,並選取符合業務需求和可接受的取捨層級。
工作負載組件是否隔離足以控制它們的故障?
像 Bulkhead 模式這樣的模式有助於建立復原能力和錯誤隔離。 Bulkhead 模式將系統劃分為隔離的元件(稱為隔艙),以防止故障蔓延到系統的其他部分。
重要路徑上的元件是否以異步方式通訊? 如果沒有,請使用通訊方法,例如佇列。 即使下游元件失敗,此方法仍可讓系統運作。 它也會防止系統進入不確定的狀態。 探索 Azure 選項,包括佇列的 Azure 服務總線,以及適用於事件串流的 Azure 事件中樞。
折衷: 異步通訊可藉由分離進程來協助防止串聯失敗。 不過,它會在通訊路徑中新增延遲,這可能會對重要元件造成問題。 在您進行任何設計模式變更之前,請先評估效能影響。
作業是否設計為一致性? 應用程式秘密和憑證等資產可能會過期,而且需要定期重新整理。 例程更新中的不一致可能會導致可靠性問題。
在理想情況下,找出並消除進行中的人為作工作,因為它們容易出錯,而且可能會導致造成可靠性風險的不一致。 將盡可能多的作業工作卸除給雲端提供者。 例如,使用Microsoft Entra ID 提供的受控識別,以及 Azure Front Door 所管理的傳輸層安全性 (TLS) 憑證。
主動式措施需要監視,例如追蹤憑證到期和接收通知。 應用程式應該記錄重要事件,例如即將到期的 TLS 憑證。 使用多個方法來檢查潛在失敗有助於確保採取必要的動作。
✓ 在您的監視系統中新增技術功能
在層級 1 中,您已從工作負載元件收集監視數據,並將焦點放在基礎結構上。 基本分析已完成,而且已設定基本警示。 此設定對於瞭解工作負載元件的基準效能和識別異常行為而言非常重要。
層級 2 通過將進階的可觀察性功能新增到工作負載資源,並採用更結構化的方式來分析監控數據,進一步提升監控的層次。 利用雲端服務所提供的分析工具。 例如,Azure 監視器深入解析工具,例如 VM 深入解析和網路深入解析,提供跨相依性的健全狀況和效能視覺效果。
規劃下列層級的可觀察性功能。
應用程式
回應健康狀態探查。 使應用程式能回應探測器發出的健康檢查請求。 應用程式應該有專用的端點來進行健康情況檢查,以提供狀態資訊,例如 狀況良好 或 狀況不良,至少。 此方法可讓監視系統評估應用程式是否正常運作,而且可以處理要求,或是否有需要解決的問題。
Azure 負載平衡服務,例如 Azure Front Door、Azure 流量管理員、Azure 應用程式閘道和 Azure Load Balancer,都支援健康情況探查。 健康探測器會將健康檢查請求傳送至應用程式。
進入語意記錄。 在應用程式中包含事件和動作的結構化資訊。 使用結構化記錄時,記錄數據會以一致的格式記錄,方法是使用定義完善的架構。 此架構可讓您更輕鬆地在後續階段建置自動化、搜尋及分析。 包含時間戳和錯誤碼等特定字段,以協助快速識別和疑難解答問題。
實作分散式追蹤。 當請求流經系統的不同元件時,請務必跨越邊界擷取追蹤資料。 這項數據有助於深入瞭解應用程式行為,並找出效能瓶頸、錯誤和延遲問題。 Azure Monitor 支援基於 OpenTelemetry 的資料收集,並使用 Application Insights。
資料
追蹤查詢持續時間、失敗的查詢和其他相關計量。 長時間執行的查詢可以指出資源條件約束,而且可能需要調整架構設計。
在這個階段,您的資料庫已運作一段時間。 請注意數據的成長率,特別是在資料表中有意外快速成長的情況。 這項資訊對於規劃未來的記憶體需求和儘早解決效能問題至關重要。
使用資料庫管理系統所提供的工具和儀錶板來監視資料庫複寫的狀態。 例如,如果您使用 Azure Cosmos DB,請使用 Azure Cosmos DB 洞察功能。 針對 Azure SQL Database 或 Azure SQL 受控實例,請考慮使用資料庫監看員來取得資料庫的相關診斷詳細數據。
隨著資料庫成長,架構問題可能會變得更明顯,這會影響效能。 若要優化查詢效率,請考慮新增索引或修改架構,因為這些變更可能會影響可靠性。
業務
層級 1 著重於上述層。 在第 2 層級,您會開始以監視系統為中心建構作業。
✓ 擴充您的失敗風險降低劇本
級別 1 側重於預期的平台故障。 在層級 2 中,您可以解決自己工作負載內元件和作業的失敗點。 當您的程式代碼在平台上執行時,平臺與應用程式之間的互動點就會增加。 預期會發生程式 Bug、部署失敗和人為錯誤。 使用自我保留或復原策略來減輕這些問題。
擴充您的故障緩解策略,以涵蓋程式錯誤(Bug)和部署問題。 下表以層級 1 的範本為基礎:
| 問題 |
風險 |
來源 |
嚴重程度 |
可能性 |
緩和措施 |
| 程序代碼不會處理至少一次訊息傳遞。 |
從總線重複處理訊息會導致數據損毀。 |
應用程式 |
高 |
有可能 |
- 重新設計以使用總線分割,並在程式中建立等冪性。
- 遠離競爭型消費者模型,因為該模型將效能視為一種取捨。 |
| 每日記憶體備份腳本無法執行。 |
因為數據已超過 24 小時,導致違反了 RPO。 |
自動化過程 |
高 |
不太可能 |
設定備份過程的警報。 |
| 新版本發布後,經常性使用者與使用量的激增。 |
應用程式效能降低,使用者要求逾時。 |
應用程式 |
高 |
不太可能 |
設定以排程為基礎的向外延展作業。 |
| 並行錯誤位於程式碼中。 |
無法預測的行為和可能的數據損毀。 |
應用程式 |
高 |
有可能 |
使用安全的併發形式,並避免手動處理併發控制。 |
| 部署期間發生非預期的失敗,使環境處於不一致的狀態。 |
應用程式中斷。 |
部署管線 |
中等 |
有可能 |
使用藍綠部署、金絲雀部署或其他方法來逐步推出變更。 |
如果您嘗試把每個可能的失敗都考慮進去,此練習可能會變得壓倒性。 為了讓它更容易,請將焦點放在屬於重要使用者流程的元件上。 隨著工作負載的成熟,此活體檔會持續成長。
✓ 開發基本復原方案
失敗風險降低劇本是建立基本復原計劃的基礎。 風險降低策略可能包括設計模式實作、平臺設定調整、即時網站事件管理、自動化測試和訓練人員,以在程式代碼檢閱期間偵測問題。
從優雅降級策略開始,包括當系統部分無法正常運作時的臨時修正措施。 目標是儘管出現故障,仍然能夠持續提供服務給使用者,方法是停用失效的元件並調整使用者體驗。 例如,如果資料庫關閉,應用程式可以停用受影響的功能,並通知用戶端使用 HTTP 狀態代碼暫時無法使用服務。
若要讓優雅退化運作,請隔離系統元件,以確保僅受到影響的部分遇到問題,而其餘元件能繼續運作。 使用 Bulkhead 模式來達到錯誤隔離。
請利用這個機會重新檢討可能造成復原緩慢的設計選擇。 例如,將網域名稱系統 (DNS) 記錄直接指向 Azure App Service 上的應用程式,可能會因為 DNS 傳播而在復原期間造成延遲。 使用 Azure Front Door 之類的專用服務作為輸入點,以在復原步驟期間更容易重新設定。
預期此基本計劃會演變成更成熟層級的完整災害復原計劃。
✓ 建立測試計劃
藉由模擬風險降低劇本中所識別的中斷和問題,以建立測試計劃。 使用簡單的測試案例來補充這些風險降低措施,以確保它們如預期般運作且可行。 確認這些功能運作正常,並執行降級測試,以查看當特定元件失敗時,系統如何執行。 確保測試失敗或通過,讓結果保持簡單。
使用模擬框架之類的測試工具,注入錯誤到 HTTP 請求中,以協助您更明確地測試重試政策。 Azure Chaos Studio 提供一套完整的測試套件,以模擬元件中斷和其他問題,讓其成為值得探索的服務。 當您熟悉 Chaos Studio 的功能時,您可以逐漸採用 Chaos Studio。
✓ 評估調整作業對可靠性的影響
若要處理負載尖峰,關鍵元件必須能夠有效率地橫向擴展或縱向擴展。 利用 Azure 提供的自動調整功能。 這些功能會根據預先定義的組態來調整服務的容量限制。 這項調整可讓您視需要相應增加或減少服務。
找出潛在的瓶頸,並了解它們可能造成的風險。 例如,高輸送量不應該造成流程中斷。
瞭解負載模式。 靜態使用模式可能會使瓶頸變得不那麼重要,但使用量和耗用量動態的變更可能會使風險惡化。
備註
可能有無法向外延展的元件,例如整合型資料庫和舊版應用程式。 主動監視負載曲線,以視需要重新建構。
根據效能和可靠性需求,決定合理調整限制。 針對效能考慮,逐漸擴大是最常見的。 不過,重要流程的可靠性考慮可能需要更快速的調整,以避免中斷。 不論是哪一種情況,請避免無限擴展。
風險: 當您處理效能相關問題時,調整可能是有用的緩和策略。 不過,調整只是臨時的解決方法,而不是解決方案。 調查並解決潛在問題,例如記憶體洩漏或失控程序。 否則,您可能會在另一個臨界點再次套用相同的緩解措施,並支付您不需要的資源費用。 藉由解決根本原因,您可以確保長期穩定性和成本效益。
設定可靠性目標和目標,讓小組對復原程序負責。
在早期層級,您的小組著重於輕鬆獲勝和基本功能。 他們從小型改進開始,解決簡單的問題,以建置強大的基礎,同時主要依賴 Azure 可靠性功能。 隨著小組成長,他們處理更多與自身資產和程式相關的技術挑戰。
在層級 3,您的小組應整合商務見解和技術技能,以進行復原規劃。 他們會使用進階監視來設定目標和規劃復原程式。 這種方法可協助網站可靠性工程師(SRE)快速達到可靠性目標。
重要策略
可靠性目標有助於為工作負載小組設定責任。 請務必與商務項目關係人進行共同作業對話,討論復原時間和成本,並達成與商務目標一致的妥協。 收集項目關係人,並以研討會的形式進行此討論。 請考慮研討會議程的下列幾點:
說明目標背後的計量。 首先,說明用來定義目標的關鍵計量,例如服務等級目標、復原時間目標(RTO)和恢復點目標(RPO)。 顯示這些計量如何與商務目標保持一致。 專注於重要的使用者流程。 例如,在電子商務應用程式中,更新電子郵件偏好的 RTO 不如用戶結帳購物車來得重要。
傳達取捨。 利害關係人通常期望的超出能夠達成的範圍。 說明擴充範圍如何影響預算、作業需求和效能。
提出目標目標。 根據架構體驗和工作負載設計,建議目標,例如 99.9% 運行時間,RPO 和 RTO 設定為 4 小時。 協助召集利害關係人的會議,以便他們提供意見反饋並進行相應的調整。 確保業務和技術項目關係人都防範不切實際的期望。 以合作心態展開討論。
達成共識或決定。 目的是達成共識,但如果這是不可能的,請讓決策者敲定目標,以確保進展。
✓ 使用健康情況模型主動監視
在層級 1 中,會從工作負載元件收集監視數據,包括平臺服務和應用程式。 基本分析和警示會設定為建立基準效能並識別異常狀況。 在層級 2 中,焦點會轉移至從工作負載元件取得可觀察性數據,例如應用程式程式代碼。
層級 3 藉由將商務內容新增至重要流程,並透過健康情況模型定義 狀況良好、 狀況不良和 降級 狀態,藉以增強監視功能。 需要利害關係人協議,才能判斷可接受的用戶體驗的取捨,並應作為定義健康狀態的參考。
健康情況模型化需要作業成熟度和監視工具的專業知識。 您的小組會檢閱原始數據、效能等級和記錄,以建立自定義計量和閾值,以定義流程的健康情況狀態。 他們必須了解這些值與系統的整體健康情況有何關聯。 向項目關係人傳達清楚的定義和臨界值。
將儀錶板中的健全狀況模型可視化,以協助 SRE 專注於狀況不良或降級的流程,以快速找出問題。
健康情況模型會定義應用程式的狀態和重要流程。 綠色表示所有重要流程都如預期般運作。 紅色表示失敗。 黃色顯示問題的趨勢。 逐一查看健康情況模型版本可確保可靠性和精確度,但需要大量精力處理大型應用程式。
健康情況狀態的變更應設定為警示。 不過,若要刻意保留警示,必須考慮元件的關鍵性。
如需詳細資訊,請參閱 Well-Architected 架構:健全狀況模型。
✓ 設定可採取動作的警示
若要改善回應效率,請清楚定義警示,並提供足夠的資訊來快速採取行動。 詳細的警示名稱和描述有助於在疑難解答期間節省時間和精力。 請仔細地設定嚴重性、名稱和描述,並特別注意嚴重性層級。 並不是每個事件都是緊急情況。 深思熟慮地評估嚴重性層級,並為每個層級建立準則,例如CPU突增從80% 到90% 是否為緊急狀態。 設定適當的臨界值,以確保已有效定義警示。
有效的警示管理可確保警示在正確的時間通知正確的人員。 頻繁和干擾性警示表示需要調整,而且在忽略時可能會適得其反。 藉由設定適當的閾值來篩選出誤報,以減少不必要的通知。 識別自動化可以觸發作業程序的機會。
建立具有必要資訊的單一登陸頁面,以有效率地針對警示進行疑難解答。 相較於登入 Azure 入口網站並搜尋計量,此方法可節省時間。 如果 Azure 監視器內建功能無法完全符合您的需求,請考慮開發自定義儀錶板。
✓ 進行失敗模式分析
在先前的層級中,您已為個別元件建立簡單的失敗風險降低劇本。 在此層級,將該策略指南正式發展為失敗模式分析(FMA)練習。 此練習的目的是主動識別潛在的失敗模式。
FMA 會要求您識別工作負載內的潛在失敗點,並規劃風險降低動作,例如自我修復或災害復原(DR)。 若要開始,請監視增加的錯誤率,並偵測對重要流程的影響。 使用過去的經驗和測試數據來識別潛在的失敗,並評估其爆破半徑。 優先處理區域性中斷等重大問題。
請務必將動作分類為 預防性 或 反應式。 預防措施在風險造成中斷之前先識別它們,從而降低其可能性或嚴重性。 反應性措施旨在緩解健康狀態下降或系統中斷所帶來的問題。
在電子商務範例應用程式中,工作負載小組想要執行 FMA 來為重要事件做準備。 其中一個主要使用者流程是將商品新增至購物車。 屬於流程一部分的元件是前端、CartAPI、ProductCatalogAPI、UserProfileAPI、PricingAPI、Azure Cosmos DB 和 Azure 事件中樞。
| 問題 |
風險 |
潛在來源 |
嚴重程度 |
可能性 |
行動 |
| 每小時收到的訂單數目低於 100,但使用者的會話活動並未相應下降。 |
即使應用程式可供使用,客戶仍無法下訂單。 |
CartAPI、PaymentsAPI |
高 |
不太可能 |
反應式動作: - 檢閱健康情況模型或監視數據,以找出問題。 - 測試應用程式以驗證其功能。 - 如果發生元件中斷,請將故障轉移至另一組基礎結構。
預防動作: - 下達綜合訂單以確認流程是否正常運作。 - 改善可檢視性,以確保端對端流程受到監視。 |
| 將訂單儲存至 Azure Cosmos DB 時,非預期的負載增加會導致逾時 |
如果客戶能夠下訂單,他們就不會面臨效能不佳的情況。 |
Azure Cosmos DB |
高 |
不太可能 |
反應式動作: - 根據應用程式遙測確認負載。 - 暫時增加 Azure Cosmos DB 請求單位。
預防動作: - 設定自動調整比例。 - 重新瀏覽預期的負載並重新計算縮放規則。 - 將某些活動移至背景進程,以減少此流程中的資料庫負載。 |
| 建議服務完全離線 |
購物車頁面因為叫用建議服務的例外狀況而無法載入。 |
應用程式 |
中等 |
不太可能 |
反應式動作: - 實施優雅降級策略,以停用推薦功能,或在購物車頁面上顯示硬編碼的推薦數據。 當您評估服務時發生例外狀況時,請套用此方法。 |
| 從負載過重的購物車頁面存取定價 API 時,會發生間歇性逾時 |
購物車頁面中發生間歇性失敗,因為無法存取購物車服務。 |
應用程式 |
中等 |
可能(在負載過重的情況下) |
反應式動作: - 在購物車資料儲存庫中實作快取定價值,並包括快取到期時間戳。 - 只有在定價數據快取過期時,才存取定價 API。 |
FMA 很複雜,而且可能很耗時,因此會隨著時間逐漸建置您的分析。 此程式是反覆的,並持續在後續階段發展。
如需詳細資訊,請參閱 RE:03 執行 FMA 的建議。
✓ 準備DR方案
在層級 2 中,您已建立復原計劃,著重於還原系統功能的技術控制。 不過,由於重大損失或失敗,災害需要更廣泛的方法。 DR 計劃是以程序為基礎。 它們涵蓋通訊、詳細的復原步驟,並可能包含腳本等技術成品。
首先,識別要規劃的災害類型,例如區域中斷、全 Azure 失敗、基礎結構中斷、資料庫損毀和勒索軟體攻擊。 然後,針對每個案例開發復原策略,並確保機制已就緒以還原作業。 業務需求、RTO 和 RPO 應引導 DR 計畫。 低 RTO 和 RPO 需要明確的自動化程式,而較高的 RTO 和 RPO 則允許更簡單的復原方法和手動分析。
DR 主要包含下列動作:
通知責任人。 請務必清楚說明誰參與和何時參與。 請確定您的小組使用正確的程式、具有正確的許可權,並了解他們在復原中的角色。 一些責任,如首席執行官向市場報告或處理監管要求,應該提前確定。
在理想情況下,您應該有個別的復原和通訊角色,並將不同的人員指派給每個角色。 一開始,發現問題的IT作業人員可能會處理這兩個角色。 但隨著情況升級,高級人員可能會處理技術復原,而商務人員則管理通訊。
做出商務決策。 在災害期間,壓力水準可能很高,這使得明確的決策至關重要。 結構良好的DR計劃需要技術小組與業務項目關係人之間的持續討論,才能定義初步決策選項。 例如,請考慮工作負載資源是否應在某個 Azure 區域中執行,並在另一個區域中備份,或是否應事先準備 IaC 資產,以在故障轉移期間建立新的資源或從備份還原。
根據DR計劃採取的動作可能是破壞性的,或有顯著的副作用。 請務必瞭解這些選項、權衡其優缺點,並判斷套用這些選項的正確時機。 例如,如果主要區域預期在可接受的時間範圍內運作,評估是否需要復原至不同的區域。
恢復系統運作。 在災害期間,重點應該是還原作業,而不是識別原因。 針對技術復原,特別是在區域故障備援中,事先決定主動-主動、主動-被動、熱備援或冷備援等方法。
根據選擇的方法準備特定的復原步驟。 從還原作業的具體步驟清單開始。 隨著程式成熟,目標是將DR計劃定義為腳本,以最少的手動互動。 使用版本控制並安全地儲存腳本,以便輕鬆存取。 這種方法需要更預先的努力,但在實際事件期間將壓力降到最低。
如需詳細資訊,請參閱 在DR的主動-被動中部署。
進行事件後分析。 找出事件的原因,並找出未來防止事件的原因。 進行變更以改善復原程式。 此練習也可能發現新的策略。 例如,如果系統切換至次要環境,請判斷主要環境是否仍然需要,以及回退流程應該如何進行。
DR 方案是一份動態文件,可適應工作負載中的變更。 隨著新的元件和風險出現,更新您的DR計劃。 藉由收集DR操作員的實際資訊,根據從演練或實際災害中獲得的見解來完善計劃。
控制因技術和作變更而引發的風險,並排定事件管理的優先順序。
在先前的層級中,您的工作負載小組著重於建置功能並讓系統運作。 在第四層級,重點轉向確保系統在運行環境中保持穩定。 事件管理變得如此重要,因為確保引入的任何變更都經過徹底測試並安全地部署,以避免讓系統不穩定。
此程式需要改進作業控制,例如投資專用小組來管理可靠性事件。 系統還需要通過技術手段來增強可靠性,以超越在先前層級中已加強的關鍵元件。 當系統繼續在生產環境中執行時,數據成長可能需要重新設計,例如數據分割,以確保可靠的存取和維護。
重要策略
✓ 可靠的變更管理
變更期間發生最大的可靠性風險,例如軟體更新、設定調整或程式修改。 從可靠性的觀點來看,這些事件非常重要。 目標是將問題、中斷、停機時間或數據遺失的可能性降到最低。 每種變更類型都需要特定活動,才能有效地管理其獨特的風險。
在層級 4 中,可靠性與營運卓越中所述的安全部署做法相交,在管理變更時維持穩定的環境。 可靠的變更管理是達成工作負載穩定性的需求。 請考慮下列重要層面:
回應平臺更新。 Azure 服務有不同的機制可更新服務。
熟悉維護程式,並更新您使用的每個服務原則。 瞭解服務是否支持自動或手動升級,以及手動更新的時間範圍。
對於已規劃更新的服務,請在低影響時間排程這些更新,以有效地管理這些更新。 請避免自動更新並延遲,直到您評估風險為止。 某些服務可讓您控制時間,而其他服務則提供寬限期。 例如,使用 Azure Kubernetes Service (AKS),在更新變成自動之前,您有 90 天的時間選擇加入。 測試非生產叢集中的更新,以反映生產設定以防止回歸。
逐漸套用更新。 即使測試顯示更新是安全的,同時將更新套用至所有實例可能會有風險。 相反地,請一次更新幾個實例,並在每個集合之間等候。
定期檢查有關更新的通知,這些通知可能會在活動記錄或其他特定於服務的渠道中找到。
監視套用更新之後的突然或漸進式變更。 在理想情況下,健康情況模型應該通知您這些變更。
使用自動化進行徹底的測試。 當您推出變更時,將更多測試整合到組建和部署管線中。 尋找將手動程式轉換為管線自動化部分的機會。
在各種階段使用不同類型的測試組合進行全面測試,以確認變更如預期般運作,且不會影響應用程式的其他部分。 例如,正向測試可以驗證系統是否如預期般運作。 它應該驗證沒有任何錯誤,且流量會正確流動。
當您規劃更新時,請識別要套用的測試閘道和測試類型。 大部分的測試應在部署前階段進行,但每當您更新環境時,亦應在每個環境中執行煙霧測試。
遵循安全部署做法。 使用包含驗證視窗和安全部署做法的部署拓撲。 實作安全部署模式,例如 Canary 和藍色綠色部署,以增強彈性和可靠性。
例如,在 Canary 部署中,一小部分使用者會先接收新版本。 此程式可在部署至整個使用者基底之前啟用監視和驗證。 功能旗標和深色啟動等技術可協助在生產環境中進行測試,然後再將變更發行給所有使用者。
更新您的DR方案。 定期更新您的DR計劃,使其保持相關且有效。 避免過時的指示。 此方法可確保計畫會反映您部署至生產環境且受使用者依賴的系統目前狀態。 併入從演練和實際事件中吸取的教訓。
如需詳細資訊,請參閱 營運卓越層級 4
✓ 投資專用小組來處理事件
一開始,開發小組可能會在事件期間介入。 在層級 4,投入於網站可靠性工程(SRE)以提升事件管理。 SRE 專門從事生產問題,並且是效率、變更管理、監視、應急回應和容量管理方面的專家。 熟練的 SRE 小組可以大幅降低對工程小組的相依性。
為 SRE 提供獨立處理事件所需的工具、資訊和知識。 此準備可減少對工程小組的依賴。 SRE 應該接受培訓,以學習先前層級所開發的操作手冊和工作負載健康模型,以快速辨識常見的模式並啟動風險緩解程序。
工程小組應該有時間反思週期性問題,並開發長期策略,而不是每次個別解決這些問題。
✓ 自動化自我修復程式
在先前的層級中,自我修復策略是使用備援和設計模式所設計。 既然您的小組有實際使用經驗,您可以整合自動化來降低常見的失敗模式,並減少對工程小組的相依性。
折衷: 自動化可能需要一段時間,而且設定成本高昂。 專注於先自動化最具影響力的工作,例如經常發生或可能導致中斷的工作。
根據觸發條件配置動作,並自動化回應,逐步建構用於 SRE 的自動化操作手冊。 其中一種方法是增強作業手冊,並使用腳本來實施風險降低步驟。 探索 Azure 原生選項,例如使用 Azure 監視器動作群組來設定自動起始各種工作的觸發程式。
✓ 將韌性擴展至背景任務
大部分的工作負載都包含元件,這些元件不會直接支持使用者流程,但在應用程式的整體工作流程中扮演重要角色。 例如,在電子商務系統中,當使用者下訂單時,系統會將訊息新增至佇列。 此動作會觸發數個背景工作,例如電子郵件確認、信用卡費用最終處理,以及用於分派準備的倉儲通知。 這些工作會與在網站上為使用者要求提供服務的函式分開運作,這可減少負載並改善可靠性。 系統也會依賴背景工作來進行數據清除、定期維護和備份。
評估並改善主要使用者流程之後,請考慮背景工作。 使用已就緒的技術與基礎結構,並新增背景工作的改進功能。
套用檢查點機制。 檢查點技術是用於在特定節點儲存進程或任務狀態的技術。 檢查點特別適用於長時間執行的工作或進程,因為網路失敗或系統當機等非預期的問題而中斷。 當進程重新啟動時,它可以從上次儲存的檢查點繼續,以將中斷的影響降到最低。
讓進程保持等冪性。 確保背景程序中的等冪性,如此一來,如果某個任務失敗,另一個實例可以接手並繼續處理,不會出現問題。
確保一致性。 如果背景工作在處理期間停止,則防止系統進入不一致的狀態。 檢查點和任務層級等冪性都是促進背景任務操作更一致性的技術。 以原子性交易的方式執行每個工作。 對於橫跨多個資料庫或服務的任務,請使用任務層級的冪等性或補償性交易,確保任務順利完成。
將背景工作整合到監視系統和測試實務中。 偵測故障並防止未被察覺的中斷,這可能會導致效能和非功能性後果。 您的監視系統應該從這些元件擷取數據、設定中斷的警示,並使用觸發程式自動重試或繼續程式。 將這些資產視為工作負載的一部分,並以您對於重要元件的相同方式進行自動化測試。
Azure 為背景作業提供數個服務和功能,例如 Azure Functions 和 Azure App Service WebJobs。 當您實作專注於可靠性的流程時,請檢閱其最佳做法和限制。
隨著工作負載架構的發展而保持復原,讓系統能夠承受新的和無法預見的風險。
在層級 5 中,改善解決方案可靠性的重點會從實作技術控制中轉移開。 您的基礎結構、應用程式和操作應該具備足夠的可靠性,以在目標復原時間內從中斷中恢復。
使用數據和未來的商務目標來確認,如果您的企業需要進一步進行,可能需要進行架構變更。 隨著工作負載的發展和新功能的新增,努力將與這些功能相關的中斷降到最低,同時進一步減少現有功能的中斷。
重要策略
✓ 使用可靠性深入解析來引導架構演進
在此層級,請與商務項目關係人共同做出決策。 請考慮下列因素:
分析計量,指出系統在一段時間內超過可靠性閾值的次數,以及這是否可接受。 例如,在一年內發生五次重大中斷,可能會觸發系統設計和作做法的重新評估。
評估系統的商務關鍵性。 例如,支援任務關鍵性工作流程的服務可能需要重新設計零停機部署和立即故障轉移,即使會增加成本或複雜度也一樣。 相反地,減少使用的服務可能會受益於更寬鬆的服務等級目標。
評估其他要素的變更如何影響可靠性。 例如,增加的安全性措施可能需要針對額外的安全性躍點採取可靠性風險緩解措施,這可能會增加潛在的故障點。
評估維護可靠性的營運成本。 如果這些成本超過預算限制,請考慮架構變更以優化和控制支出。
為了協助項目關係人、工程師和產品經理做出明智的決策,請考慮可視化上述數據點以及額外的深入解析。 此方法提供可靠性的完整概觀。
✓ 在生產環境中執行受控制的測試
在此層級,只有在工作負載需要最高的復原保證時,才會考慮生產環境中受控制的實驗。 這些測試做法稱為 混亂工程。 測試會驗證系統可在不良條件下正常復原並繼續運作。
請考慮下列範例使用案例:
相依性流程分析: 常見的使用案例是測試設計為微服務的應用程式。 您可以關閉隨機微服務實例,以確保失敗不會串聯或中斷用戶體驗。 您可以藉由停用特定元件來分析下游系統的反應方式,來擴充此方法至系統流程。 目標是找出緊密結合或隱藏的相依性,並測試系統備援計劃的執行方式。
正常降低測試: 評估系統在失敗期間以降低的功能執行方式。 例如,如果建議引擎失敗,您可以隱藏非關鍵功能。
第三方故障模擬: 停用或限速對外部 API 的呼叫,以查看系統的運作,是否正確地實施後援或重試機制。
混亂工程是測試復原能力的黃金標準。 不過,請為成熟的系統和工作負載小組保留此做法。 請確定保護措施已就緒,以限制爆破半徑並防止用戶影響。
透過舉辦遊戲日來做好準備。 從非生產環境中開始,使用風險較低的設定搭配綜合交易來模擬真實世界狀況。 這種方法有助於識別程式差距、人為錯誤路徑和架構缺陷。
當非生產測試停止產生寶貴的見解時,如果您有信心,可能是時候移至生產環境了。 請務必列出所有考慮、評估復原能力,並在轉換之前解決任何問題。
限制實驗的範圍。 例如,您可能只關閉一個實例。 清楚定義測試的目的。 瞭解您正在測試的內容,以及原因。
這些測試必須通過在預先定義的限制和錯誤預算內運作來遵循服務水平協議。 選取這些實驗的適當時間範圍。 一般而言,在工作日執行這些作業可確保小組已具備完整的人員,並且有足夠的資源來回應任何可能發生的事件。
✓ 進行災害復原演練
混亂工程會測試技術控件的復原能力。 災害復原 (DR) 演練會評估程式控制件的復原能力。 DR 演練的目標是在系統從重大失敗或災害中復原時,驗證程式、協調和人為動作的有效性。
針對法規工作負載,合規性需求可能會決定DR演練的頻率,以確保工作記錄。 對於其他工作負載,建議定期進行這些演練。 六個月間隔可讓您擷取工作負載變更並據以更新DR程式。
DR 演練應該大於例行練習。 正確執行時,DR 演練可協助訓練新成員,並找出在工具、通訊及其他演練相關工作中的差距。 這些看法也可以凸顯出可能被忽略的全新觀念。
請考慮執行DR演練的下列主要方法,每個方法的風險和實際性各有不同:
完全模擬: 這些練習完全以白板為基礎,並包含程式逐步解說,而不會影響任何系統。 它們適用於訓練和初始驗證。 不過,它們不會提供真實事件的深入解析。
非生產環境中的實際鑽研: 這些演練可讓您驗證自動化、腳本和程式,而不需要任何商務風險。
生產環境中的實際演練: 這些演練提供最高等級的信賴度和逼真度。 只有在測試上述兩種方法之後,才進行這些演練。 徹底規劃和復原策略對於將風險降至最低至關重要。 如果有任何可能導致中斷的機會,請勿繼續進行。
不論DR演練的類型為何,清楚定義工作負載復原情境。 進行演習就像是真正的事件一樣。 此方法可確保小組遵循清楚的檢查清單。 記錄並分類結果以推動持續改善。 DR 準備可能包括下列流程:
折衷: 這些演習通常不會造成干擾,但確實需要花時間。 若要最大化其有效性,請專注於關鍵層面,並避免不必要的工作。 請務必在待辦專案中配置此做法的時間。
當您建立DR計劃或進行DR演練時,特別是在前幾次演練中,請考慮納入專業的技術。 他們對於多區域設計、故障轉移和回切策略的意見,以及服務或工具的建議,可能非常珍貴。 如果您的組織有雲端卓越中心小組,請務必將它們包含在規劃程式中。
✓ 視需要評估您的數據模型和區段
數據是動態且不斷演進的。 不同於您架構中的其他元件,數據通常會隨著使用者與您的系統互動而成長。 監視一段時間的數據模式,並評估其對架構其他部分的影響非常重要。 在此層級,請考慮簡化數據管理並改善效能的技術,以提高整體可靠性。 分區是達成所需效果的關鍵策略。
探索例如熱冷分區等技術,該技術會根據存取模式分割數據,並將它們分開儲存。 使用存取頻率或相關性等準則來決定要分割的內容。
熱冷分區可以結合分片,這是一種將大型資料庫分割成稱為分片的小單位的過程。 每個分區都會保存一部分的數據,並一起組成完整的數據集。 此方法可實現獨立的數據管理。
折衷: 平衡分片需要作業程序來評估並確認分片的分佈。 這種方法有助於避免過度使用某個分區成為熱分區。 不過,它也需要持續的努力和資源來維持平衡。
當您選擇資料分割技術時,請考慮下列可靠性優點:
增強的效能: 透過將要求分散到多個分割區,您可以減少個別存放區上的負載。 有效實作時,分區化可讓系統每天處理數百萬個寫入要求。 此策略可改善效能,並將延遲降到最低。
分區可以簡化水平擴展。 例如,分片可以將用戶或客戶分成大約相等大小的群組。
改善的數據管理: 熱冷數據分區能將不同的數據管理層級應用於每個儲存層。 例如,將封存數據移至個別存放區有助於防止作業和備份變慢。 同樣地,並非所有記錄數據都必須儲存在關係資料庫中。 它可以儲存在另一個數據存放區中,而作用中工作負載數據仍保持關係型。
量身打造的可靠性原則: 您可以套用不同的可靠性原則,以確保每個分割區都具備適當的彈性,並避免任何單一儲存庫成為瓶頸。 熱門分割區可以完全備援,包括區域備援和異地備援,而冷分割區則依賴於備份。 額外的可靠性優勢是,您可以降低某些故障類型的影響範圍。 例如,如果故障影響一個分片,它可能不會影響其他分片。
折衷: 由於不同數據分割之間的強相依性,因此難以維護或修改數據分割。 這些變更可能會影響驗證數據一致性和完整性的能力,特別是與單一數據存放區相比。 當分割區數目增加時,維護數據完整性的健全程式需求會變得更加重要。 如果沒有這些措施,可靠性可能會受到影響。