Kinesis Data Streams 的更改数据捕获 - Amazon DynamoDB
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

Kinesis Data Streams 的更改数据捕获

适用于 DynamoDB 的 Kinesis Data Streams 在任何 DynamoDB 表中捕获项目级别的修改,并将其复制到您选择的 Kinesis 数据流中。您的应用程序可以访问 Kinesis 数据流并近实时查看项目级别的变化。

将 DynamoDB 数据流式传输到 Kinesis 数据流使您能够每小时连续捕获和存储 TB 数据。利用 Kinesis Data Streams,您可以利用更长的数据保留时间、扩展到两个以上同时使用的使用者应用程序的增强型扇出功能以及其他审核和安全透明度。Kinesis Data Streams 还允许您访问其他 Kinesis 服务,例如 Amazon Kinesis Data FirehoseAmazon Kinesis Data Analytics。这使您能够构建应用程序以便为实时控制面板提供支持,生成警报,实施动态定价和广告,以及执行复杂的数据分析,例如应用机器学习算法。

注意

将 Kinesis Data Streams 用于 DynamoDB 需要遵循数据流的 Kinesis Data Streams 定价和源表的 DynamoDB 定价

更改数据捕获如何用于 Kinesis 数据流

适用于 Amazon DynamoDB 的 Amazon Kinesis Data Streams 异步运行,因此,如果启用了流,则不会对表的性能产生任何影响。每当在表中创建、更新或删除项目时,DynamoDB 都会向 Kinesis 发送数据记录。该记录包含有关对 DynamoDB 表中的单个项目的数据修改的信息。具体而言,数据记录包含已修改项目的主键属性,以及已修改项目的“之前”和“之后”图像。

数据记录将近实时发布到您的 Kinesis 数据流。写入 Kinesis 数据流后,您可以像从任何 Kinesis 数据流读取任何其他记录一样读取写入的记录。例如,您可以使用 Kinesis 客户端库、AWS Lambda 或调用 Kinesis Data Streams API。有关更多信息,请参阅《Amazon Kinesis Data Streams 开发人员指南》中的从 Amazon Kinesis Data Streams 读取数据

存储在 Kinesis 数据流中的流记录是静态加密的。有关更多信息,请参阅 Amazon Kinesis Data Streams 中的数据保护

对于在 DynamoDB 表中修改的每个项目,Kinesis 数据流记录的顺序可能与对该项目的实际修改的顺序不同。流记录可能会在 Kinesis 数据流中多次出现。您可以对每个记录使用时间戳属性 ApproximateCreationDateTime 以确定项目修改的实际发生顺序,以及确定流中重复的记录。

DynamoDB 收取更改数据捕获单位中 Kinesis Data Streams 的更改数据捕获的费用。DynamoDB 对每次项目写入收取一个更改数据捕获单位的费用(最大为 1 KB)。大于 1 KB 的写入需要额外的更改数据捕获单位。DynamoDB 根据构成更改记录的“之前”和“之后”图像中的较大者,使用与写入操作的容量单位消耗相同的逻辑来计算更改数据捕获单位。您无需为更改数据捕获单元预置容量吞吐量,这与 DynamoDB 按需模式的工作方式类似。

以下部分介绍适用于 DynamoDB 的 Kinesis Data Streams 的核心概念和行为。

为 DynamoDB 启用 Kinesis 数据流

您可以使用 AWS 管理控制台、AWS 开发工具包或 AWS 命令行界面 (AWS CLI) 在现有 DynamoDB 表上启用或禁用到 Kinesis 的流式处理。

  • 您只能从与您的表相同的 AWS 账户和 AWS 区域启用 Kinesis Data Streams 以实现 DynamoDB 流式传输到 Kinesis 数据流。

  • 您只能为从 DynamoDB 表流式传输到一个 Kinesis 数据流启用 Kinesis Data Streams。DynamoDB

Amazon Kinesis Data Streams 的分片管理注意事项

分片 是 Amazon Kinesis 数据流的基本吞吐量单位。您需要在 Kinesis 数据流上预置适当数量的分片,以适应来自 DynamoDB 的更改数据捕获记录。

以下输入值可帮助您确定 Kinesis 数据流支持 DynamoDB 表所需的分片数:

  • 表记录的平均大小(以字节为单位)(DynamoDB)。average_record_size_in_bytes

  • 您每秒对 DynamoDB 表执行的最大写入操作数。这包括创建、删除和更新应用程序执行的数据操作以及自动生成的操作,如生存时间生成的删除 (write_throughput)。

  • 与创建或删除操作 (percentage_of_updates) 相比,您对表执行的更新和覆盖操作的百分比。更新和覆盖操作会将已修改项目的新旧图像复制到流中,从而生成两倍的 DynamoDB 项目大小。

您可以使用以下公式中的输入值来近似估计您的 number_of_shards 表所需的分片数 (DynamoDB):

number_of_shards = ceiling( ((write_throughput * (1+percentage_of_updates) * average_record_size_in_bytes) /1024 /1024), 1)

此公式仅反映适应 DynamoDB 流式处理吞吐量所需的分片。它不表示 Kinesis 数据流中所需的分片总数,例如支持 Kinesis 数据流使用者所需的分片。要了解有关确定 Kinesis 数据流大小的更多信息,请参阅确定 Kinesis 数据流的初始大小

例如,假设您拥有的每秒最大吞吐量为 40 个写入操作 (write_throughput),平均记录大小为 1285 字节 (average_record_size_in_bytes)。如果其中 25% 的写入操作是更新操作 (percentage_of_updates),则您需要 2 个分片 (number_of_shards) 来容纳您的 DynamoDB 流吞吐量:上限 ((40 * (1+25) * 1285 )/ 1024 / 1024/ 1024)、1 。

监控 DynamoDB 的 Kinesis 数据流

DynamoDB 提供了多个 Amazon CloudWatch 指标来帮助您监控将更改数据捕获复制到 Kinesis 的过程。有关 CloudWatch 指标的完整列表,请参阅DynamoDB 指标和维度

我们建议您在启用流期间和生产中监控以下项目,以确定您的流是否具有足够的容量:

  • ThrottledPutRecordCount:由于 Kinesis 数据流容量不足而无法复制到 Kinesis 数据流的记录数。应保持尽可能低的状态,但可能会在异常使用高峰期间遇到一些限制。ThrottledPutRecordCountDynamoDB 会重试将受限制的记录放入 Kinesis 数据流,但这可能会导致更高的复制延迟。如果您遇到过多且常规的限制,则可能需要根据观察到的表写入吞吐量按比例增加 Kinesis 流分片的数量。要了解有关确定 Kinesis 数据流大小的更多信息,请参阅确定 Kinesis 数据流的初始大小

  • AgeOfOldestUnreplicatedRecord:表中显示自最早的项目级别更改到复制到 Kinesis 数据流为止经过的时间。DynamoDB在正常操作下,AgeOfOldestUnreplicatedRecord 应采用毫秒顺序。此数字根据不成功的复制尝试而增长。DynamoDB 在出现复制失败时连续重试不成功的复制尝试。您可能需要调整 Kinesis 数据流容量,以尽可能保持该指标的较低。

您可以创建 Amazon CloudWatch 警报,以在上述任何指标超出特定阈值时发送 Amazon Simple Notification Service (Amazon SNS) 消息接收通知。有关更多信息,请参阅创建 CloudWatch 警报以监控 DynamoDB