

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

# 異地同步備份可觀測
<a name="multi-az-observability"></a>

 若要能夠在與單一可用區域隔離的事件期間撤除可用區域，您首先必須能夠偵測到故障實際上是隔離到單一可用區域。這需要對系統在每個可用區域中的行為進行高保真度能見度。許多 AWS 服務提供的 out-of-the-box 指標可提供有關您資源的營運見解。例如，Amazon EC2 提供了許多指標，例如CPU使用率、磁碟讀取和寫入以及網路流量進出。

 不過，當您建置使用這些服務的工作負載時，您需要的不僅僅是標準指標，還需要更多的可見性。您想要瞭解工作負載所提供的客戶體驗。此外，您還需要將指標與產生指標的可用區域保持一致。這是您需要檢測差異觀察灰色故障的洞察力。該級別的可見性需要儀器。

 儀器需要編寫明確的代碼。此代碼應該執行諸如記錄任務需要多長時間，計算成功或失敗的項目數量，收集有關請求的元數據等等。您還需要提前定義閾值，以定義什麼被認為是正常的，什麼是不正常的。您應該概述工作負載中延遲、可用性和錯誤計數的目標和不同嚴重性閾值。Amazon 建置者程式庫文章[檢測分散式系統以獲得操作可見性，提供了許多最佳實](https://aws.amazon.com/builders-library/instrumenting-distributed-systems-for-operational-visibility/)務。

 指標都應該從服務器端以及客戶端生成。產生用戶端指標和瞭解客戶體驗的最佳做法是使用 [Can](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Canaries.html) ary，該軟體會定期探測您的工作負載並記錄指標。

 除了生成這些指標之外，您還需要了解它們的上下文。執行此操作的一種方法是使用[維度](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/cloudwatch_concepts.html#Dimension)。維度會為量度提供唯一的身分，並協助說明指標告訴您的內容。對於用來識別工作負載失敗的指標 (例如延遲、可用性或錯誤計數)，您需要使用符合[錯誤隔離界限](https://docs.aws.amazon.com/wellarchitected/latest/reliability-pillar/use-fault-isolation-to-protect-your-workload.html)的維度。

 例如，如果您使用 [M odel-view-controller](https://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller) (MVC) Web 架構在一個區域中跨多個可用區域執行 Web 服務，則應使用`Region`、、[https://docs.aws.amazon.com/ram/latest/userguide/working-with-az-ids.html](https://docs.aws.amazon.com/ram/latest/userguide/working-with-az-ids.html)`Controller``Action`、和作`InstanceId`為維度集的維度 (如果您使用的是微服務，則可以使用服務名稱和HTTP方法而不是控制器和動作名稱)。這是因為您預期不同類型的失敗會被這些邊界隔離。您不會期望 Web 服務的代碼中存在會影響其列出產品以也影響主頁的能力的錯誤。同樣地，您也不會期望單EC2一執行個體上的完整EBS磁碟區會影響其他EC2執行個體提供您的 Web 內容。「可用區域 ID」維度可讓您一致地識別可用區域相關影響。 AWS 帳戶您可以透過多種不同方式在工作負載中找到可用區域 ID。如需一[附錄 A — 取得可用區域識別碼](appendix-a-getting-the-availability-zone-id.md)些範例，請參閱。

 雖然本文檔主要使用 Amazon EC2 作為示例中的運算資源，但`InstanceId`可以用 Amazon 彈性容器[服務（AmazonECS）和亞馬 Amazon Elastic [Kubernetes Service（Amazon](https://aws.amazon.com/eks/)EKS）運算資源的容](https://aws.amazon.com/ecs/)器 ID 替換為維度的組件。

 如果您的工`Region`作負載具有區域端點 `Controller` `Action``AZ-ID`，您的金絲雀也可以在指標中使用、和作為維度。在這種情況下，請調整您的金絲雀，以便在他們正在測試的可用區域中運行。這樣可確保如果隔離的可用區域事件影響正在執行初期測試的可用區域，則不會記錄使其正在測試的不同可用區域的指標看起來不健康。例如，您的初期測試可以使用其區域名稱來測試 Network Load Balancer (NLB) 或應用程式負載平衡器 (ALB) 後面的服務的每個[區域DNS](https://docs.aws.amazon.com/elasticloadbalancing/latest/network/network-load-balancers.html#dns-name)端點。

![顯示在 CloudWatch Synthetics 上運行的金絲雀或測試每個區域端點的 AWS Lambda 函數的圖 NLB](http://docs.aws.amazon.com/zh_tw/whitepapers/latest/advanced-multi-az-resilience-patterns/images/canary-testing-for-zonal-impact.png)


 透過使用這些維度產生指標，您可以建立 [Amazon CloudWatch 警示](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/AlarmThatSendsEmail.html)，以便在這些邊界內發生可用性或延遲變更時通知您。您也可以使用[儀表板](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Dashboards.html)快速分析該資料。為了有效地使用指標和日誌，Amazon CloudWatch 提供了[嵌入式指標格式](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Embedded_Metric_Format.html) (EMF)，可讓您將自訂指標與日誌資料內嵌。 CloudWatch自動提取自定義指標，以便您可以對其進行可視化和警報。 AWS 為不同的程式設計語言提供數個[用戶端程式庫](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Embedded_Metric_Format_Libraries.html)，讓您輕鬆開始使用EMF。它們可以與 AmazonEC2，AmazonECS，Amazon EKS 和現場部署環境一起使用。[AWS Lambda](https://aws.amazon.com/lambda/)透過將指標嵌入日誌中，您也可以使用 [Amazon CloudWatch 貢獻者深入解析](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/ContributorInsights.html)來建立顯示參與者資料的時間序列圖表。在這種情況下，我們可以顯示按維度分組的數據 `AZ-ID``InstanceId`，或`Controller`以及日誌中的任何其他字段類似`SuccessLatency`或`HttpResponseCode`。

```
{ 
  "_aws": { 
    "Timestamp": 1634319245221, 
    "CloudWatchMetrics": [ 
      { 
        "Namespace": "workloadname/frontend", 
        "Metrics": [ 
          { "Name": "2xx", "Unit": "Count" }, 
          { "Name": "3xx", "Unit": "Count" }, 
          { "Name": "4xx", "Unit": "Count" }, 
          { "Name": "5xx", "Unit": "Count" }, 
          { "Name": "SuccessLatency", "Unit": "Milliseconds" } 
        ], 
        "Dimensions": [ 
          [ "Controller", "Action", "Region", "AZ-ID", "InstanceId"], 
          [ "Controller", "Action", "Region", "AZ-ID"], 
          [ "Controller", "Action", "Region"] 
        ] 
      }
    ], 
    "LogGroupName": "/loggroupname" 
  }, 
  "CacheRefresh": false, 
  "Host": "use1-az2-name.example.com", 
  "SourceIp": "34.230.82.196", 
  "TraceId": "|e3628548-42e164ee4d1379bf.", 
  "Path": "/home", 
  "OneBox": false, 
  "Controller": "Home", 
  "Action": "Index", 
  "Region": "us-east-1", 
  "AZ-ID": "use1-az2", 
  "InstanceId": "i-01ab0b7241214d494", 
  "LogGroupName": "/loggroupname", 
  "HttpResponseCode": 200,
  "2xx": 1, 
  "3xx": 0, 
  "4xx": 0, 
  "5xx": 0, 
  "SuccessLatency": 20 
}
```

此記錄有三組維度。它們會以精細度順序進行，從執行個體到可用區域再到區域 (`Controller`此範例一律包含在此範例中)。`Action`它們支援在整個工作負載中建立警示，以指出何時會影響單一執行個體、單一可用區域或整個執行個體中的特定控制器動作 AWS 區域。這些維度用於 2xx、3xx、4xx 和 5xx HTTP 回應量度的計數，以及成功要求量度的延遲 (如果要求失敗，也會記錄失敗要求延遲的量度)。記錄檔也會記錄其他資訊，例如HTTP路徑、要求者的來源 IP，以及此要求是否需要重新整理本機快取。然後，可以使用這些資料點來計算每個API工作負載提供的可用性和延遲時間。

**使用可用性測量結果的HTTP回應代碼的注意事項**  
通常情況下，您可以將 2xx 和 3xx 響應視為成功，5xx 作為故障。4xx 響應代碼落在中間的某個地方。通常，它們是由於客戶端錯誤而產生的。也許一個參數超出範圍，導致 [400 響應](https://en.wikipedia.org/wiki/List_of_HTTP_status_codes)，或者他們正在請求不存在的東西，導致 404 響應。您不會根據工作負載的可用性來計算這些回應。但是，這也可能是軟件中出現錯誤的結果。  
例如，如果您引入了更嚴格的輸入驗證來拒絕之前會成功的要求，則 400 個回應可能會視為可用性下降。或者，也許您正在限制客戶並返回 429 響應。雖然節流客戶可以保護您的服務以維持其可用性，但從客戶的角度來看，該服務無法用於處理其請求。您需要決定 4xx 回應碼是否為可用性計算的一部分。

雖然本節概述了用 CloudWatch 作收集和分析指標的一種方法，但這不是您可以使用的唯一解決方案。您也可以選擇將指標傳送至適用於 Prometheus 和 Amazon 受管的 Grafana (Amazon DynamoDB 表) 的亞馬遜受管服務，或使用第三方監控解決方案。關鍵在於您的工作負載產生的指標必須包含有關工作負載故障隔離界限的內容。

如果工作負載產生維度與錯誤隔離界限一致，您可以建立可檢測可用區域隔離故障的觀察性。下列各節說明三種免費方法，用於偵測單一可用區域的損害所產生的故障。

**Topics**
+ [使用 CloudWatch 複合式警報偵測故障](failure-detection-with-cloudwatch-composite-alarms.md)
+ [使用離群值偵測進行故障偵測](failure-detection-using-outlier-detection.md)
+ [單一執行個體區域資源的故障偵測](failure-detection-of-single-instance-zonal-resources.md)
+ [Summary](summary.md)