評估 DynamoDB 資料表中適當大小佈建的佈建容量 - Amazon DynamoDB

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

評估 DynamoDB 資料表中適當大小佈建的佈建容量

本節概述如何評估 DynamoDB 資料表是否有適當大小的佈建。隨著工作負載的演變,您應該適時修改操作程序,尤其是在佈建模式下設定 DynamoDB 資料表時,可能會有過度佈建或佈建不足的風險。

以下描述的程序需要統計資訊,這些資訊應從支援您生產應用程式的 DynamoDB 資料表擷取。若要瞭解您的應用程式行為,您應定義足以從應用程式擷取資料季節性的時段。例如,若應用程式顯示每週模式,三週時間便應足夠來分析應用程式輸送量需求。

若您不知道從何下手,請使用至少一個月的資料用量進行以下計算。

在評估容量時,DynamoDB 資料表可以獨立設定讀取容量單位 (RCUs)寫入容量單位 (WCU)。如果您的資料表已設定任何全域次要索引 (GSI),您將需要指定其將使用的輸送量,這也將與 RCUs和 WCUs 基礎資料表獨立。

注意

本機次要索引 (LSI) 會耗用基礎資料表的容量。

如何擷取 DynamoDB 資料表上的耗用指標

若要評估資料表和GSI容量,請監控下列 CloudWatch 指標,然後選取適當的維度以擷取資料表或GSI資訊:

讀取容量單位 寫入容量單位

ConsumedReadCapacityUnits

ConsumedWriteCapacityUnits

ProvisionedReadCapacityUnits

ProvisionedWriteCapacityUnits

ReadThrottleEvents

WriteThrottleEvents

您可以透過 AWS CLI 或 執行此操作 AWS Management Console。

AWS CLI

擷取資料表耗用指標之前,我們需要先使用 擷取一些歷史資料點 CloudWatch API。

首先要建立兩個檔案:write-calc.jsonread-calc.json。這些檔案將代表資料表或 的計算GSI。您需要更新部分欄位 (如下表所示),以符合您的環境。

欄位名稱 定義 範例
<table-name> 您要分析的資料表名稱 SampleTable
<period> 您將用來評估使用率目標的期間 (以秒為單位) 針對 1 小時的時間,您應指定:3600
<start-time> 評估間隔的開頭,以 ISO8601 格式指定 2022-02-21T23:00:00
<end-time> 評估間隔的結尾,以 ISO8601 格式指定 2022-02-22T06:00:00

寫入計算檔案會擷取指定日期範圍期間WCU佈建和取用的數目。同時也會產生用於分析的使用率百分比。write-calc.json 檔案的完整內容應如下所示:

{ "MetricDataQueries": [ { "Id": "provisionedWCU", "MetricStat": { "Metric": { "Namespace": "AWS/DynamoDB", "MetricName": "ProvisionedWriteCapacityUnits", "Dimensions": [ { "Name": "TableName", "Value": "<table-name>" } ] }, "Period": <period>, "Stat": "Average" }, "Label": "Provisioned", "ReturnData": false }, { "Id": "consumedWCU", "MetricStat": { "Metric": { "Namespace": "AWS/DynamoDB", "MetricName": "ConsumedWriteCapacityUnits", "Dimensions": [ { "Name": "TableName", "Value": "<table-name>"" } ] }, "Period": <period>, "Stat": "Sum" }, "Label": "", "ReturnData": false }, { "Id": "m1", "Expression": "consumedWCU/PERIOD(consumedWCU)", "Label": "Consumed WCUs", "ReturnData": false }, { "Id": "utilizationPercentage", "Expression": "100*(m1/provisionedWCU)", "Label": "Utilization Percentage", "ReturnData": true } ], "StartTime": "<start-time>", "EndTime": "<ent-time>", "ScanBy": "TimestampDescending", "MaxDatapoints": 24 }

讀取計算檔案會使用類似檔案。此檔案會擷取指定日期範圍期間內RCUs佈建和取用的數量。read-calc.json 檔案的內容應如下所示:

{ "MetricDataQueries": [ { "Id": "provisionedRCU", "MetricStat": { "Metric": { "Namespace": "AWS/DynamoDB", "MetricName": "ProvisionedReadCapacityUnits", "Dimensions": [ { "Name": "TableName", "Value": "<table-name>" } ] }, "Period": <period>, "Stat": "Average" }, "Label": "Provisioned", "ReturnData": false }, { "Id": "consumedRCU", "MetricStat": { "Metric": { "Namespace": "AWS/DynamoDB", "MetricName": "ConsumedReadCapacityUnits", "Dimensions": [ { "Name": "TableName", "Value": "<table-name>" } ] }, "Period": <period>, "Stat": "Sum" }, "Label": "", "ReturnData": false }, { "Id": "m1", "Expression": "consumedRCU/PERIOD(consumedRCU)", "Label": "Consumed RCUs", "ReturnData": false }, { "Id": "utilizationPercentage", "Expression": "100*(m1/provisionedRCU)", "Label": "Utilization Percentage", "ReturnData": true } ], "StartTime": "<start-time>", "EndTime": "<end-time>", "ScanBy": "TimestampDescending", "MaxDatapoints": 24 }

一旦您建立了檔案,就可以開始擷取使用率資料。

  1. 若要擷取寫入使用率資料,請發出下列命令:

    aws cloudwatch get-metric-data --cli-input-json file://write-calc.json
  2. 若要擷取讀取使用率資料,請發出下列命令:

    aws cloudwatch get-metric-data --cli-input-json file://read-calc.json

這兩個查詢的結果都是一系列資料點,其JSON格式將用於分析。您的結果將取決於您指定的資料點數量、期間以及您自己的特定工作負載資料。這可能看起來如下:

{ "MetricDataResults": [ { "Id": "utilizationPercentage", "Label": "Utilization Percentage", "Timestamps": [ "2022-02-22T05:00:00+00:00", "2022-02-22T04:00:00+00:00", "2022-02-22T03:00:00+00:00", "2022-02-22T02:00:00+00:00", "2022-02-22T01:00:00+00:00", "2022-02-22T00:00:00+00:00", "2022-02-21T23:00:00+00:00" ], "Values": [ 91.55364583333333, 55.066631944444445, 2.6114930555555556, 24.9496875, 40.94725694444445, 25.61819444444444, 0.0 ], "StatusCode": "Complete" } ], "Messages": [] }
注意

若您指定一個短期和一個長期時間範圍,您可能需要修改指令碼中預設為 24 的 MaxDatapoints。這代表每小時產生一個資料點,每天 24 個資料點。

AWS Management Console
  1. 登入 AWS Management Console 並導覽至 CloudWatch 服務頁面。 AWS 區域 視需要選取適當的 。

  2. 找到左側導覽列上的指標區段,然後選取所有指標

  3. 這會開啟一份儀表板,其中包含兩個面板。頂端面板會顯示圖形,而底部面板會顯示您要繪製的指標。選擇 DynamoDB

  4. 選擇資料表指標。接著會顯示目前區域中的資料表。

  5. 使用搜尋方塊來搜尋資料表名稱,然後選擇寫入操作指標: ConsumedWriteCapacityUnitsProvisionedWriteCapacityUnits

    注意

    此範例討論寫入操作指標,但您也可以用這些步驟來繪製讀取操作指標的圖形。

  6. 選擇圖形化指標 (2) 索引標籤來修改公式。根據預設, CloudWatch 會選取圖形的統計函數平均值

    所選圖形指標和平均值作為預設統計函數。
  7. 同時選取兩個圖形化指標 (左側的核取方塊) 後,選取選單 Add math (新增數學),再選取 Common (一般) 及 Percentage (百分比) 函數。重複該過程兩次。

    第一次選取 Percentage (百分比) 函數:

    CloudWatch 主控台。已為圖形化指標選取百分比函數。

    第二次選取 Percentage (百分比) 函數:

    CloudWatch 主控台。百分比函數會為圖形化指標再次選取。
  8. 此時,選單底部應有四個指標。接著進行 ConsumedWriteCapacityUnits 計算。為了保持一致,我們需要比對我們在 AWS CLI 區段中使用的名稱。按一下 m1 ID 並將此值變更為已使用WCU

    CloudWatch 主控台。具有 m1 ID 的圖形指標會重新命名為已使用WCU。

    ConsumedWriteCapacityUnit標籤重新命名為 consumedWCU

    具有ConsumedWriteCapacityUnit標籤的圖形指標會重新命名為取用WCU者。
  9. 將統計資料從 Average (平均值) 變更為 Sum (總和)。此動作會自動建立另一個名為 ANOMALY_DETECTION_BAND 的指標。對於此程序的範圍,讓我們透過移除新產生的 ad1 指標上的核取方塊來忽略它。

    CloudWatch 主控台。統計資訊SUM是在圖形化指標的下拉式清單中選取。
    CloudWatch 主控台。ANOMALY_DETECTION_BAND 指標會從圖形指標清單中移除。
  10. 重複步驟 8 將 m2 ID 重新命名為已佈建WCU。將統計資料設定保留為 Average (平均值)。

    CloudWatch 主控台。具有 m2 ID 的圖形指標會重新命名為佈建WCU。
  11. 選取 Expression1 標籤,並將值更新為 m1,並將標籤更新為已使用 WCUs

    注意

    請確定您只選取 m1 (左側的核取方塊) 並佈建WCU ,以正確視覺化資料。按一下詳細資訊並將公式變更為消耗WCU/PERIOD(已使用WCU),以更新公式。此步驟也可能產生另一個 ANOMALY_DETECTION_BAND 指標,但對於此程序的範圍,我們可以忽略它。

    已選取 m1 和佈建WCU。m1 的詳細資訊會更新為消耗WCU/PERIOD(使用)WCU。
  12. 您現在應該有兩個圖形:一個表示您在資料表WCUs上佈建的 ,另一個表示已耗用 WCUs。圖形的形狀可能與下方形狀不同,但您可以將其做為參考:

    已佈建WCUs並WCUs消耗資料表圖表的圖形。
  13. 選取 Expression2 圖形 (e2) 以更新百分比公式。將標籤 和 重新命名IDs為 utilizationPercentage。重新命名公式以符合 100*(m1/provisionedWCU)

    CloudWatch 主控台。標籤 和 IDs for Expression2 重新命名為 utilizationPercentage。
    CloudWatch 主控台。Expression2 的百分比公式已更新為 100*(m1/visionedWCU)。
  14. 從所有指標中移除核取方塊,但utilizationPercentage可視覺化您的使用率模式。預設間隔設為 1 分鐘,但您可以根據需要修改。

    所選時間間隔的 utilizationPercentage 指標圖形。

這是一個更長時間及 1 小時的視圖。您可以看到有些間隔使用率高於 100%,但這個特定的工作負載具有較長的間隔,使用率為零。

長時間的使用模式。它反白顯示超過 100% 和零的使用期間。

您可能得到與此範例中的圖片不同的結果。取決於您工作負載中的資料。使用率超過 100% 的間隔容易發生限流。DynamoDB 提供高載容量,但是一旦高載容量完成,高於 100% 的任何項目都會受到限流。

如何識別佈建不足的 DynamoDB 資料表

針對多數工作負載,當資料表持續耗用超過其佈建容量的 80%,就會被視為佈建不足。

爆量容量是一種 DynamoDB 功能,可讓客戶暫時使用比原始佈建多 RCUs/WCUs (超過資料表中定義的每秒佈建輸送量)。高載容量是為了吸收由於特殊事件或使用量尖峰而突增的流量。高載容量不會一直持續執行。一旦未使用的 RCUs和 WCUs 耗盡,如果您嘗試使用比佈建更多的容量,就會受到調節。當應用程式流量接近 80% 使用率時,限流風險就會大幅提高。

80% 使用率規則會因資料的季節性和流量成長而有所不同。請考量下列情況:

  • 如果您的流量在過去 12 個月內穩定保持約 90% 的使用率,那麼您的資料表容量剛好

  • 如果您的應用程式流量在 3 個月內以每月 8% 的速度增加,您將達到 100%

  • 如果您的應用程式流量在略多於 4 個月的期間以 5% 的速度增加,您仍會達到 100%

上述查詢結果能讓您得知使用率的情況。您可以使用這些結果做為指引,進一步評估其他指標,以協助您根據需要增加資料表容量 (例如:每月或每週成長率)。與您的營運團隊合作,為工作負載和資料表定義合理的百分比。

在部分特殊情況下,每天或每週進行分析時,資料會出現偏斜。例如,在季節性應用程式在工作時間內 (但接著在工作時間之外下降到幾乎零) 的使用量激增的情況下,您可以藉由排程自動擴展來受益,在其中指定一天的時數 (和一週的天數) 來增加佈建容量,以及減少該時數的時間。如果季節性較不明顯,您也能從 DynamoDB 資料表自動擴展組態中受益,而不是為了涵蓋忙碌的時數而瞄準更高的容量。

注意

當您為基礎資料表建立 DynamoDB 自動擴展組態時,請記得為與資料表相關聯的任何 GSI 加入另一個組態。

如何識別過度佈建的 DynamoDB 資料表

從以上指令碼獲得的查詢結果提供了執行部分初始分析所需的資料點。若您的資料集在數個間隔內顯示的使用率低於 20%,表示資料表可能過度佈建。若要進一步定義是否需要減少 WCUs和 的數量RCUS,您應該重新檢視間隔中的其他讀數。

當您的資料表包含數個低用量間隔時,您可以透過排程自動擴展或僅為根據使用率的資料表設定預設自動擴展政策,從使用自動擴展政策中獲益。

如果您的工作負載在間隔中具有低使用率和高限流率 (Max(ThrottleEvents)/Min(ThrottleEvents)),當您的工作負載非常繁重,而流量在某些天 (或數小時) 增加很多,但通常流量始終很低時,就可能發生這種情況。在這些情況下,使用排程的自動擴展可能會有所幫助。