本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
疑難排解 Amazon DynamoDB 中的內部伺服器錯誤
在 DynamoDB 中,內部伺服器錯誤 (500 個錯誤) 表示服務無法提供要求。這些錯誤可能由於各種原因而發生,例如叢集中的暫時性網路問題、基礎結構問題、儲存節點相關問題等。
在 DynamoDB 表的生命週期期間,您可能會遇到一些內部伺服器錯誤。這是由於服務的分佈式性質而預期的,通常不應該成為引起關注的原因。DynamoDB 會即時自動修復和治療服務中的任何暫時性問題,無需您的任何介入。不過,如果您發現資料表要求時持續出現大量內部伺服器錯誤 (如SystemErrors指標所示),則應進一步調查。
調查內部伺服器錯誤
如果您在 DynamoDB 表中遇到內部伺服器錯誤,請考慮下列選項:
檢查 AWS Health 儀表板。
要確定問題,第一步是檢查 AWS Service Health Dashboard
和 AWS 帳戶 Health 儀表板。這些儀表板提供有關任何服務範圍問題、受影響的資料表、持續發生的問題,以及問題解決後根本原因的重要資訊。 檢閱這些儀表板中的詳細資訊可讓您更好地瞭解 AWS 服務 您正在使用,以及任何會影響您帳戶的潛在問題。此資訊可協助您判斷後續步驟以解決問題,並將作業中斷的情況降到最低。
伸出援手 支援.
如果您在請求中發現長時間持續的錯誤,則可能表示服務出現問題。一般而言,如果您在過去 15 分鐘內看到整體失敗率達到 1% 或更多,那麼現在是適當的時候將問題升級到 AWS Support 團隊。如需詳細資訊,請參閱 DynamoDB 服務等級協定
。 當使用 AWS Support 團隊提供以下詳細信息以幫助加快故障排除過程:
-
受影響DDB;表格或次要索引
-
觀察到錯誤的時間範圍
-
DynamoDB 請求IDs,例如,您可以在應用程式記錄檔中找到這些要求。
4KBNVRGD25RG1KEO9UT4V3FQDJVV4KQNSO5AEMVJF66Q9ASUAAJG
在支援案例中包含這些詳細資訊將有助於 AWS 團隊了解問題,並提供更快的解決方案。如果您沒有請求IDs,您仍應該使用其他可用詳細信息記錄案例。
-
將內部伺服器錯誤的影響降至最低
如果使用 DynamoDB 時發生內部伺服器錯誤,請將這些錯誤對應用程式的影響降到最低,請考慮下列最佳做法:
-
使用備用和重試 — DynamoDB 的預設行為旨在SDK為大多數應用程式在退期和重試策略方面找到適當的平衡。但是,您可以根據應用程式對停機時間和效能需求的容忍度來調整這些設定。進一步瞭解備用和重試,以瞭解如何微調這些重試設定。
-
使用最終一致讀取 — 如果您的應用程式不需要強烈一致的讀取,請考慮使用最終一致性讀取。這些讀取成本較低,並且由於內部伺服器錯誤而發生暫時性問題的可能性較低,因為它會從任何可用的儲存節點提供服務。如需詳細資訊,請參閱DynamoDB 讀取一致性。
提高營運意識
維持應用程式的高可用性和可靠性對於現今的數位環境至關重要。其中一個關鍵方面是主動監控 DynamoDB 表和全域次要索引 (ISEs) 中的內部伺服器錯誤 (GSIs)。透過建立 CloudWatch 警示來監控這些錯誤,您可以獲得更好的操作意識,並在潛在問題影響最終使用者之前收到警示。此方法符合「卓越營運」的支柱 AWS Well-Architected 的架構,可確保 DynamoDB 工作負載針對效能、安全性和可靠性進行最佳化。
建立 CloudWatch 鬧鐘
您應該在 DynamoDB 表上設定 CloudWatch 警示,以接收持續大量內部伺服器錯誤的通知,而不是手動觀察指標。這與 Well-Architected 的框架的卓越營運支柱聯繫在一起,以滿足以下任何工作負載 AWS。 請參閱使用 DynamoDB Well-Architected Lens 來最佳化您的 DynamoDB 工作負載以進一步了解如何架構良好的 DynamoDB 表格。
這些警示會使用自訂量度數學運算,計算 5 分鐘時段的失敗要求百分比。建議的最佳做法是將警示設定為在 3 個連續資料點違反 1% 閾值時進入ALARM
狀態,這表示整體 1% 的要求會在 15 分鐘內失敗。
下面的示例是 AWS CloudFormation 可以幫助您在桌子上和GSI桌子上創建 CloudWatch 警報的模板。
AWSTemplateFormatVersion: "2010-09-09" Description: Sample template for monitoring DynamoDB Parameters: DynamoDBProvisionedTableName: Description: Name of DynamoDB Provisioned Table to create Type: String MinLength: 3 MaxLength: 255 ConstraintDescription : https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Limits.html#limits-naming-rules DynamoDBSNSEmail: Description : Email Address subscribed to newly created SNS Topic Type: String AllowedPattern: "^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\\.[a-zA-Z0-9-.]+$" MinLength: 1 MaxLength: 255 Resources: DynamoDBMonitoringSNSTopic: Type: AWS::SNS::Topic Properties: DisplayName: DynamoDB Monitoring SNS Topic Subscription: - Endpoint: !Ref DynamoDBSNSEmail Protocol: email TopicName: dynamodb-monitoring DynamoDBTableSystemErrorAlarm: Type: 'AWS::CloudWatch::Alarm' Properties: AlarmName: 'DynamoDBTableSystemErrorAlarm' AlarmDescription: 'Alarm when system errors exceed 1% of total number of requests for 15 minutes' AlarmActions: - !Ref DynamoDBMonitoringSNSTopic Metrics: - Id: 'e1' Expression: 'm1/(m1+m2+m3)' Label: SystemErrorsOverTotalRequests - Id: 'm1' MetricStat: Metric: Namespace: 'AWS/DynamoDB' MetricName: 'SystemErrors' Dimensions: - Name: 'TableName' Value: !Ref DynamoDBProvisionedTableName Period: 300 Stat: 'SampleCount' Unit: 'Count' ReturnData: False - Id: 'm2' MetricStat: Metric: Namespace: 'AWS/DynamoDB' MetricName: 'ConsumedReadCapacityUnits' Dimensions: - Name: 'TableName' Value: !Ref DynamoDBProvisionedTableName Period: 300 Stat: 'SampleCount' Unit: 'Count' ReturnData: False - Id: 'm3' MetricStat: Metric: Namespace: 'AWS/DynamoDB' MetricName: 'ConsumedWriteCapacityUnits' Dimensions: - Name: 'TableName' Value: !Ref DynamoDBProvisionedTableName Period: 300 Stat: 'SampleCount' Unit: 'Count' ReturnData: False EvaluationPeriods: 3 Threshold: 1.0 ComparisonOperator: 'GreaterThanThreshold' DynamoDBGSISystemErrorAlarm: Type: 'AWS::CloudWatch::Alarm' Properties: AlarmName: 'DynamoDBGSISystemErrorAlarm' AlarmDescription: 'Alarm when GSI system errors exceed 2% of total number of requests for 15 minutes' AlarmActions: - !Ref DynamoDBMonitoringSNSTopic Metrics: - Id: 'e1' Expression: 'm1/(m1+m2+m3)' Label: GSISystemErrorsOverTotalRequests - Id: 'm1' MetricStat: Metric: Namespace: 'AWS/DynamoDB' MetricName: 'SystemErrors' Dimensions: - Name: 'TableName' Value: !Ref DynamoDBProvisionedTableName - Name: 'GlobalSecondaryIndexName' Value: !Join [ '-', [!Ref DynamoDBProvisionedTableName, 'gsi1'] ] Period: 300 Stat: 'SampleCount' Unit: 'Count' ReturnData: False - Id: 'm2' MetricStat: Metric: Namespace: 'AWS/DynamoDB' MetricName: 'ConsumedReadCapacityUnits' Dimensions: - Name: 'TableName' Value: !Ref DynamoDBProvisionedTableName - Name: 'GlobalSecondaryIndexName' Value: !Join [ '-', [!Ref DynamoDBProvisionedTableName, 'gsi1'] ] Period: 300 Stat: 'SampleCount' Unit: 'Count' ReturnData: False - Id: 'm3' MetricStat: Metric: Namespace: 'AWS/DynamoDB' MetricName: 'ConsumedWriteCapacityUnits' Dimensions: - Name: 'TableName' Value: !Ref DynamoDBProvisionedTableName - Name: 'GlobalSecondaryIndexName' Value: !Join [ '-', [!Ref DynamoDBProvisionedTableName, 'gsi1'] ] Period: 300 Stat: 'SampleCount' Unit: 'Count' ReturnData: False EvaluationPeriods: 3 Threshold: 1.0 ComparisonOperator: 'GreaterThanThreshold'