

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

# 以 DynamoDB Streams 和 Kinesis Data Streams 使用碎片和指標
<a name="kds_using-shards-and-metrics"></a>

## Kinesis Data Streams 的碎片管理考量事項
<a name="kds_using-shards-and-metrics.shardmanagment"></a>

Kinesis 資料串流會計算其在[碎片](https://docs.aws.amazon.com/streams/latest/dev/key-concepts.html)中的輸送量。在 Amazon Kinesis Data Streams 中，您可為資料串流選擇**隨需**模式或**佈建**模式。

如果您的 DynamoDB 寫入工作負載高度可變且無法預測，我們建議您使用 Kinesis Data Streams 的隨需模式。使用隨需模式時，無需容量規劃，因為 Kinesis Data Streams 會自動管理碎片，提供必要的輸送量。

對於可預測的工作負載，您可以針對 Kinesis Data Stream 使用佈建模式。採用佈建模式，必須指定資料串流的碎片數目，以容納來自 DynamoDB 的變更資料擷取紀錄。若要判斷 Kinesis 資料串流支援 DynamoDB 資料表所需的碎片數目，您需要以下輸入值：
+ DynamoDB 資料表紀錄的平均大小 (以位元組為單位) (`average_record_size_in_bytes`)。
+ 您的 DynamoDB 資料表上將執行的每秒寫入操作數目上限。這包括應用程式執行的建立、刪除和更新操作，以及自動產生的操作，例如「存留時間」產生的刪除操作 (`write_throughput`)。
+ 與建立或刪除操作相比，您在資料表上執行的更新和覆寫操作的百分比 (`percentage_of_updates`)。請注意，更新和覆寫操作會將已修改項目的舊映像和新映像複製到串流。因此產生兩倍大小的 DynamoDB 項目。

您可使用以下公式帶入輸入值，計算 Kinesis 資料串流所需的碎片數目 (`number_of_shards`)：

```
number_of_shards = ceiling( max( ((write_throughput * (4+percentage_of_updates) * average_record_size_in_bytes) / 1024 / 1024), (write_throughput/1000)), 1)
```

例如，您可能有每秒 1040 個寫入操作 (`write_throughput`) 的最大輸送量，平均記錄大小為 800 位元組 (`average_record_size_in_bytes)`。如果其中 25% 的寫入操作為更新操作 (`percentage_of_updates`)，您需要兩個碎片 (`number_of_shards`) 以容納 DynamoDB 串流輸送量：

```
ceiling( max( ((1040 * (4+25/100) * 800)/ 1024 / 1024), (1040/1000)), 1).
```

使用公式計算 Kinesis 資料串流佈建模式所需的碎片數量之前，請考慮下列事項：
+ 此公式有助於預估容納 DynamoDB 變更資料記錄所需的碎片數量。其不代表 Kinesis 資料串流中所需的碎片總數，例如支援額外 Kinesis 資料串流取用者所需的碎片數量。
+ 如果您未設定處理尖峰輸送量的資料串流，則可能仍會在佈建模式中遇到讀取和寫入輸送量例外狀況。在這種情形下，您必須手動擴展資料串流以適應資料流量。
+ 此公式會考量 DynamoDB 將變更日誌資料記錄串流至 Kinesis Data Stream 之前，所產生的額外膨脹。

如需進一步了解 Kinesis Data Stream 上的容量模式，請參閱[選擇資料串流容量模式](https://docs.aws.amazon.com/streams/latest/dev/how-do-i-size-a-stream.html)。如需進一步了解不同容量模式之間的定價差異，請參閱 [Amazon Kinesis Data Streams 定價](https://aws.amazon.com/kinesis/data-streams/pricing/)。

## 使用 Kinesis Data Streams 監控變更資料擷取
<a name="kds_using-shards-and-metrics.monitoring"></a>

DynamoDB 提供數個 Amazon CloudWatch 指標，可協助您監控將變更資料擷取到 Kinesis 的複寫。如需 CloudWatch 指標的完整清單，請參閱 [DynamoDB 指標和維度](metrics-dimensions.md)。

為判斷串流是否有足夠的容量，建議您在啟用串流期間和生產環境期間監控下列項目：
+ `ThrottledPutRecordCount`：因為 Kinesis 資料串流容量不足而受到 Kinesis Data Streams 限流的記錄數量。儘管在特殊使用峰值期間，您可能會遇到限流的情況，仍應盡可能降低 `ThrottledPutRecordCount`。DynamoDB 會重試將限流記錄傳送到 Kinesis 資料串流，但這可能會導致較高的複寫延遲。

  如果遇到過多且規律的限流，您可能需要按照觀察到的資料表寫入輸送量按比例增加 Kinesis 串流碎片的數量。若要進一步了解如何判斷 Kinesis 資料串流的大小，請參閱[判斷 Kinesis Data Stream 的初始大小](https://docs.aws.amazon.com/streams/latest/dev/amazon-kinesis-streams.html#how-do-i-size-a-stream)。
+ `AgeOfOldestUnreplicatedRecord`：自 DynamoDB 資料表中出現尚未複寫到 Kinesis 資料串流的最舊項目層級變更以來經過的時間。在正常的操作下，`AgeOfOldestUnreplicatedRecord` 應該以毫秒為單位。當不成功的複寫嘗試是因客戶控制的組態選擇所引起時，此數字會隨著不成功複寫嘗試的增加而增加。

   如果 `AgeOfOldestUnreplicatedRecord` 指標超過 168 小時，從 DynamoDB 資料表到 Kinesis 資料串流的項目層級變更複寫將自動停用。

  可能導致複寫嘗試失敗的客戶控制組態示例包括，佈建的 Kinesis 資料串流容量不足導致過度限流，或是手動更新 Kinesis 資料串流的存取政策因而拒絕 DynamoDB 新增資料至您的資料串流。為盡可能降低此指標，您可能需要確保妥善佈建您的 Kinesis 資料串流容量，並確保 DynamoDB 的許可保持不變。
+ `FailedToReplicateRecordCount`：DynamoDB 無法複寫到您的 Kinesis 資料串流的記錄數目。大於 34KB 的某些項目可能會擴充大小，以變更大於 Kinesis Data Streams 1MB 項目大小限制的資料記錄。當這些大於 34KB 的項目包含大量的布林值或空白屬性值時，就會發生此大小擴充。布林值和空白屬性值會以 1 位元組形式儲存在 DynamoDB 中，但是在使用用於 Kinesis Data Streams 複寫的標準 JSON 將其序列化時，最多可擴充至 5 個位元組。DynamoDB 無法將這類變更記錄複寫到您的 Kinesis 資料串流。DynamoDB 會略過這些變更資料記錄，並自動繼續複寫後續記錄。

   

您可以建立 Amazon CloudWatch 警示，以便在上述任何指標超過特定閾值時，傳送 Amazon Simple Notification Service (Amazon SNS) 通知訊息。