

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 灰色故障
<a name="gray-failures"></a>

灰色故障由特徵定義[https://doi.org/10.1145/3102980.3103005](https://doi.org/10.1145/3102980.3103005)，這意味著不同的實體以不同的方式觀察失敗。讓我們來定義這意味著什麼。

## 差分可觀測性
<a name="differential-observability"></a>

您操作的工作負載通常具有相依性。例如，這些可以是AWS用於建置工作負載的雲端服務，或用於聯合的第三方身分識別提供者 (IdP)。這些依賴關係幾乎總是實現自己的可觀察性，記錄有關錯誤，可用性和延遲的指標以及其他由客戶使用情況生成的內容。當超過這些度量之一的臨界值時，相依性通常會採取一些動作來更正它。

這些依賴關係通常有他們的服務的多個消費者。消費者還實現了自己的可觀察性，並記錄有關其與其依賴關係的交互的指標和日誌，記錄諸如磁盤讀取中有多少延遲，API 請求失敗了多少，或者數據庫查詢花了多長時間。

這些相互作用和測量在下圖中的抽象模型中描繪。

![\[顯示了理解灰色故障的抽象模型圖\]](http://docs.aws.amazon.com/zh_tw/whitepapers/latest/advanced-multi-az-resilience-patterns/images/gray-failures-model.png)


首先，我們有*系統*，這是消費者應用程式 1、應用程式 2 和應用程式 3 在此案例中的相依性。該系統具有故障檢測器，用於檢查從核心業務流程創建的指標。它還具有故障響應機制，以減輕或糾正故障檢測器觀察到的問題。系統會看到 53 ms 的整體平均延遲，並且已設定臨界值，以在平均延遲超過 60 ms 時叫用失敗回應機制。應用程序 1，應用程序 2 和應用程序 3 也對其與系統的交互進行了自己的觀察，分別記錄 50 毫秒，53 毫秒和 56 毫秒的平均延遲。

差異觀測性是指系統消費者偵測到系統運作狀況不佳，但系統本身的監控未偵測到問題，或影響未超過警示臨界值的情況。讓我們想像一下，應用程序 1 開始經歷 70 毫秒而不是 50 毫秒的平均延遲。應用程式 2 和應用程式 3 看不到平均延遲的變化。這會將基礎系統的平均延遲時間增加到 59.66 ms，但這不會跨越延遲閾值來啟動故障回應機制。但是，應用程序 1 的延遲增加了 40％。這可能會超過針對應用程式 1 設定的用戶端逾時來影響其可用性，或者可能會在較長的互動鏈中造成串聯影響。從 App 1 的角度來看，它所依賴的基礎系統是不健康的，但從系統本身以及 App 2 和 App 3 的角度來看，系統是健康的。下圖總結了這些不同的觀點。

![\[根據不同的觀點，顯示系統可以處於不同狀態的圖表\]](http://docs.aws.amazon.com/zh_tw/whitepapers/latest/advanced-multi-az-resilience-patterns/images/states-based-on-perspectives.png)


失敗也可以遍歷此象限。事件可能會以灰色失敗的形式開始，然後變成偵測到的失敗，然後移至遮罩失敗，然後又可能回到灰色失敗。沒有一個定義的循環，並且在解決其根本原因之前，幾乎總是有失敗復發的機會。

我們從中得出的結論是，工作負載不能總是依賴基礎系統來檢測和緩解故障。無論底層系統有多複雜和彈性，總有可能失敗未被發現或停留在反應閾值之下。該系統的消費者（如 App 1）需要配備，以便快速檢測和減輕灰色故障引起的影響。這需要為這些情況構建可觀察性和恢復機制。

## 灰色故障範例
<a name="gray-failure-example"></a>

灰色故障可能會影響異地同步備份系統AWS。例如，採取的艦隊[亚马逊](https://aws.amazon.com/ec2/)在三個可用區域部署的 Auto Scaling 群組中的執行個體。它們都連接到一個可用區域中的 Amazon Aurora 資料庫。然後，會發生灰色故障，影響可用區域 1 和可用區域 2 之間的網路。造成此損害的結果是，可用區域 1 中執行個體的新資料庫和現有資料庫連線的百分比失敗。這種情況如下圖所示。

![\[顯示灰色失敗對資料庫連線的潛在影響的圖表。\]](http://docs.aws.amazon.com/zh_tw/whitepapers/latest/advanced-multi-az-resilience-patterns/images/potential-gray-failure-impact.png)


在此範例中，Amazon EC2 會將可用區域 1 中的執行個體視為健康狀態良好，因為它們持續通過[系統和執行個體狀態檢查](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/monitoring-system-instance-status-check.html)。Amazon EC2 自動擴展也不會偵測到對任何可用區域的直接影響，而且會繼續[已設定可用區域中的啟動容量](https://docs.aws.amazon.com/autoscaling/ec2/userguide/auto-scaling-benefits.html)。網路負載平衡器 (NLB) 也會將其後面的執行個體視為健全狀況，就像針對 NLB 端點執行的 Route 53 健康狀態檢查一樣健全。同樣地，亞馬遜關聯式資料庫服務 (Amazon RDS) 會將資料庫叢集視為健康狀況良好，且不會[觸發自動容錯移轉](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Concepts.MultiAZ.html)。我們有許多不同的服務，都將其服務和資源視為健康狀態，但工作負載會偵測到會影響其可用性的故障。這是一個灰色的失敗。

## 回應灰階故障
<a name="responding-to-gray-failures"></a>

當您遇到灰色故障時AWS環境中，您通常有三個可用選項：
+ 什麼都不做，等待減值結束。
+ 如果將減值隔離到單一可用區域，請撤除該可用區域。
+ 容錯移轉至其他AWS 區域並使用的好處AWS區域隔離以減輕影響。

許多AWS客戶對大多數工作負載都可以使用選項一。他們接受可能擴展[復原時間目標 (RTO)](https://docs.aws.amazon.com/wellarchitected/latest/reliability-pillar/disaster-recovery-dr-objectives.html)他們不必建立額外的可觀察性或彈性解決方案的權衡。其他客戶選擇實施第三個選項，[多區域災難復原](https://aws.amazon.com/blogs/architecture/disaster-recovery-dr-architecture-on-aws-part-i-strategies-for-recovery-in-the-cloud/)（DR），作為他們對各種故障模式的緩解計劃。在這些情況下，多區域架構可以很好地運作。但是，使用此方法時有一些權衡（請參閱[AWS多區域基礎知識](https://docs.aws.amazon.com/whitepapers/latest/aws-multi-region-fundamentals/aws-multi-region-fundamentals.html)有關多區域考量的完整討論）。

首先，建置和操作多區域架構可能是一項具有挑戰性、複雜且可能昂貴的工作。多區域架構需要仔細考慮哪些[DR 策略](https://docs.aws.amazon.com/whitepapers/latest/disaster-recovery-workloads-on-aws/disaster-recovery-options-in-the-cloud.html)您選擇。實作多區域主動-主動式 DR 解決方案來處理區域損傷可能不是財務上可行的，而備份和還原策略可能不符合您的彈性需求。此外，必須在生產環境中持續實施多區域容錯移轉，以便您相信它們可以在需要時運作。這一切都需要大量專門的時間和資源來構建，操作和測試。

二、跨資料複製AWS 區域運用AWS今天的服務都是異步完成的。非同步複製可能會導致資料遺失。這表示在區域容錯移轉期間，可能會造成一定程度的資料遺失和不一致。您對數據丟失量的容忍度定義為[復原點目標 (RPO)](https://docs.aws.amazon.com/wellarchitected/latest/reliability-pillar/disaster-recovery-dr-objectives.html)。需要強大資料一致性的客戶，必須建立對帳系統，以便在主要區域再次推出時修正這些一致性問題。或者，他們必須建置自己的同步複寫或雙寫系統，這可能會對回應延遲、成本和複雜性產生重大影響。它們還使次要區域成為每個交易的硬性依賴性，這可能會降低整體系統的可用性。

最後，對於使用主動/待命方法的許多工作負載，執行容錯移轉到另一個區域所需的時間非零。您的工作負載產品組合可能需要以特定順序在主要區域中斷、需要耗盡連線或停止特定程序。然後，可能需要按特定順序恢復服務。也可能需要佈建新資源，或需要時間才能通過所需的健康狀態檢查，然後才能進入服務。此容錯移轉程序可能會經歷一段完全無法使用的時間。這就是 RTO 所關注的。

在一個區域內，許多AWS服務提供高度一致的資料持續性。Amazon RDS 異地同步備份部署使用[同步複寫](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Concepts.MultiAZ.html)。[亞馬遜簡單存儲服務](https://aws.amazon.com/s3/)（亞馬遜 S3）優惠[強大read-after-write一致性](https://aws.amazon.com/blogs/aws/amazon-s3-update-strong-read-after-write-consistency/)。[亞馬遜彈性區塊儲存](https://aws.amazon.com/ebs/)(亞馬遜 EBS) 優惠[多磁碟區當機一致快照](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ebs-creating-snapshot.html#ebs-create-snapshot-multi-volume)。[亚马逊](https://aws.amazon.com/dynamodb/)可以[執行強烈一致的讀取](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/HowItWorks.ReadConsistency.html)。這些功能可協助您在單一區域中達到較低的 RPO (在大多數情況下為零 RPO)，而不是在多區域架構中所能達到的。

撤除可用區域的 RTO 可能比多區域策略低，因為您的基礎結構和資源已在可用區域佈建。當可用區域受損時，異地同步備份架構可以繼續以靜態方式繼續運作，而不需要小心訂購正在關閉和備份的服務，或排除連線。由於工作轉移到剩餘的可用區域，許多系統可能只會在區域容錯移轉期間發生一段完全無法使用的時間，而不是在可用區域撤離期間發生的完全無法使用時間。如果系統已被設計為[靜態穩定](https://aws.amazon.com/builders-library/static-stability-using-availability-zones)可用區域失敗 (在此情況下，表示在其他可用區域中預先佈建容量以吸收負載)，工作負載的客戶可能根本看不到影響。

****  
單一可用區域的損害可能會影響一個或多個AWS [區域服務](https://docs.aws.amazon.com/whitepapers/latest/aws-fault-isolation-boundaries/regional-services.html)除了您的工作量。如果您觀察到區域影響，則應將事件視為區域服務減損，儘管該影響的來源來自單一可用區域。撤除可用區域不會減輕此類問題。發生這種情況時，請使用您所擁有的回應計劃來回應區域服務損害。

本文件的其餘部分著重於撤除可用區域的第二個選項，以便針對單一可用區域灰色故障達到更低的 RTO 和 RPO。這些模式有助於實現異地同步備份架構的更高價值和效率，對於大多數類別的工作負載，可減少建立多區域架構以處理這些類型的事件的需求。