Amazon DynamoDB
开发人员指南 (API 版本 2012-08-10)
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

管理预置表的吞吐量设置

在 DynamoDB 中创建新的预置表时,必须为新表指定预置的吞吐容量 — 表将能够支持的读取和写入活动量。DynamoDB 使用此信息来预留足够的系统资源,以满足吞吐量需求。

注意

您可以转而创建按需模式表,这样就不必管理服务器、存储或吞吐量的任何容量设置。DynamoDB 会随着工作负载的增加或减少,根据之前达到的任意流量水平即时调节工作负载。如果某个工作负载的流量级别达到一个新的峰值,DynamoDB 将快速调整以适应该工作负载。有关更多信息,请参阅 按需模式

您可以选择允许 DynamoDB Auto Scaling 管理表的吞吐容量。但是,创建表时,您仍必须提供读取和写入容量的初始设置。DynamoDB Auto Scaling 使用这些初始设置作为起点,然后动态调整这些初始设置来响应您的应用程序需求。有关更多信息,请参阅 使用 DynamoDB Auto Scaling 自动管理吞吐容量

随着您的应用程序数据和访问要求的不断变化,您可能需要调整您的表的吞吐量设置。如果您使用 DynamoDB Auto Scaling,则吞吐量设置将自动调整以响应实际工作负载。您也可以使用 UpdateTable 操作来手动调整您的表的吞吐容量。如果您需要将现有数据存储中的数据批量加载到新的 DynamoDB 表中,则可能会决定执行此操作。您可以使用较大的写入吞吐量设置创建表,然后在批量加载完数据后减小此设置。

根据容量单位 — 应用程序每秒需要读取或写入的数据量指定吞吐量需求。您可以稍后修改这些设置 (如果需要) 或启用 DynamoDB Auto Scaling 以自动修改这些设置。

读取容量单位

一个读取容量单位 表示对大小高达 4 KB 的项目每秒执行一次强一致性读取,或每秒执行两次最终一致性读取。

注意

要了解有关 DynamoDB 读取一致性模型的更多信息,请参阅读取一致性

例如,假设您创建一个带 10 个预置读取容量单位的表。这允许您对大小最多为 4 KB 的项目每秒执行 10 次强一致性读取,或每秒执行 20 次最终一致性读取。

读取大于 4 KB 的项目时,将使用更多读取容量单位。例如,对大小为 8 KB (4 KB × 2) 的项目执行强一致性读取时,将使用 2 个读取容量单位。对同一项目执行最终一致性读取时,将仅使用 1 个读取容量单位。

对于读取操作,项目大小会向上取整为 4 KB 的倍数。例如,读取一个 3500 字节的项目将使用的吞吐量与读取一个 4 KB 项目相同。

读取的容量单位消耗

下面介绍 DynamoDB 读取操作如何占用读取容量单位:

  • GetItem — 从表中读取单个项目。要确定 GetItem 将使用的容量单位的数量,请使用项目大小并将其向上取整到下一个 4 KB 界限值。如果您已指定强一致性读取,则这是所需的容量单位的数量。对于最终一致性读取(默认值),将此数字除以 2。

    例如,如果您读取一个 3.5 KB 的项目,DynamoDB 会将项目大小向上取整到 4 KB。如果您读取一个 10 KB 的项目,DynamoDB 会将项目大小向上取整到 12 KB。

  • BatchGetItem — 从一个或多个表中读取多达 100 个项目。DynamoDB 将批次中的每个项目作为单个 GetItem 请求进行处理,因此 DynamoDB 会先将每个项目的大小向上取整到下一个 4 KB 界限值,然后再计算总大小。计算得到的结果未必与所有项目大小的总和相同。例如,如果 BatchGetItem 读取一个 1.5 KB 的项目和一个 6.5 KB 的项目,DynamoDB 计算得出的大小为 12 KB (4 KB + 8 KB) 而不是 8 KB (1.5 KB + 6.5 KB)。

  • Query — 读取具有相同分区键值的多个项目。返回的所有项目将视为一个读取操作,此时 DynamoDB 会计算所有项目的总大小,然后向上取整到下一个 4 KB 界限值。例如,假设您的查询返回了 10 个项目,它们合并后的大小为 40.8 KB。DynamoDB 将为该操作的项目大小向上取整为 44 KB。如果查询返回了 1500 个项目,每个项目大小为 64 个字节,则累计大小为 96 KB。

  • Scan — 读取表中的所有项目。DynamoDB 所考量的是评估所得的项目大小,而不是扫描返回项目的大小。

如果您对不存在的项目执行读取操作,则 DynamoDB 仍会占用预置的读取吞吐量:强一致性读取请求占用一个读取容量单位,而最终一致性读取请求占用 0.5 个读取容量单位。

对于任何会返回项目的操作,您都可以请求一个属性子集来进行检索,但是这样做不会对项目大小的计算有影响。另外,QueryScan 返回的是项目数而不是属性值。获取项目数会使用同等数量的读取容量单位,且依据的是相同的项目大小计算。这是因为 DynamoDB 必须读取每个项目才能增加计数。

读取操作和读取一致性

前面的计算都假设提交的是强一致性读取请求。如果提交的是最终一致性读取请求,该操作占用的容量单位将仅相当于强一致性读取请求的一半。对于最终一致性读取请求,如果总的项目大小为 80 KB,该操作仅会占用 10 个容量单位。

写入容量单位

一个写入容量单位 表示对大小高达 1 KB 的项目每秒执行一次写入。

例如,假设您创建一个带 10 个写入容量单位的表。这允许您对大小高达 1 KB 的项目每秒执行 10 次写入。

对于写入操作,项目大小会向上取整为 1 KB 的倍数。例如,写入一个 500 字节的项目使用的吞吐量与写入一个 1 KB 项目相同。

写入的容量单位消耗

下面介绍 DynamoDB 写入操作如何占用写入容量单位:

  • PutItem — 将单个项目写入表中。如果该表中存在具有相同主键的项目,此操作会替换该项目。在计算预置的吞吐量占用时,起作用的项目是二者中较大的那个。

  • UpdateItem — 修改表中的单个项目。DynamoDB 将考虑项目在更新前后显示的大小。占用的预置吞吐量会反映这些项目大小中较大的值。即使您只更新项目属性的子集,UpdateItem 仍会占用全部的预置吞吐量 (“之前”和“之后”项目大小中的较大者)。

  • DeleteItem — 从表中删除单个项目。预置吞吐量占用情况取决于已删除的项目大小。

  • BatchWriteItem— 将多达 25 个项目写入一个或多个表。DynamoDB 将批次中的每个项目作为单个 PutItemDeleteItem 请求进行处理(不支持更新)。因此,DynamoDB 会首先将每个项目的大小向上取整到下一个 1 KB 界限值,然后再计算总大小。计算得到的结果未必与所有项目大小的总和相同。例如,如果 BatchWriteItem 写入一个 500 字节的项目和一个 3.5 KB 的项目,则 DynamoDB 计算得出的大小为 5 KB (1 KB + 4 KB),而不是 4 KB (500 字节 + 3.5 KB)。

对于 PutItemUpdateItemDeleteItem 操作,DynamoDB 会将该项目大小向上取整到下一个 1 KB。例如,如果您添加或删除一个 1.6 KB 的项目,DynamoDB 会将该项目大小向上取整到 2 KB。

PutItemUpdateItemDeleteItem 都支持条件写入,在这种情况下,您可以指定一个必须计算为 true 的表达式以便成功执行操作。如果该表达式计算为 false,DynamoDB 仍会占用表的写入容量单位:

  • 对于现有项目,所占用的写入容量单位数将取决于新项目的大小。(例如,一个 1 KB 项目的一次失败的有条件写入将占用一个写入容量单位。如果新的项目增大一倍,则失败的有条件写入将占用两个写入容量单位。)

  • 对于新项目,DynamoDB 占用一个写入容量单位。

请求限制和突增容量

如果您的应用程序执行读取或写入操作的速率高于表能够支持的速率,则 DynamoDB 将开始限制 这些请求。当 DynamoDB 限制读取或写入时,它会将 ProvisionedThroughputExceededException 返回给调用方。随后,应用程序可以采取相应的措施,例如,在重试请求之前等待一段较短的间隔。

注意

建议您使用 AWS 开发工具包进行软件开发。AWS 开发工具包提供对重试受限制请求的内置支持;您无需自行编写此逻辑。有关更多信息,请参阅错误重试和指数退避

DynamoDB 控制台显示表的 Amazon CloudWatch 指标,以便您能够监视受限制的读取请求和写入请求。如果您遇到过多的限制,则应考虑增大表的预置吞吐量设置。

在某些情况下,DynamoDB 使用突增容量来容纳超出表的吞吐量设置的读取或写入。利用突增容量,意外的读取或写入请求可在原本会受限制的环境中获得成功。有关更多信息,请参阅 高效使用突增容量

请求限制和适应性容量

DynamoDB 会自动将您的数据分布到不同的分区(分区存储在 AWS 云中的多个服务器上)(有关更多信息,请参阅分区和数据分配)。不可能总是均匀地分布读活动和写活动。当数据访问不平衡时,与其他分区相比,“热”分区可以接收更高的读取和写入流量。自适应容量的工作原理是,自动增加分区的吞吐量容量来接收更多流量。有关更多信息,请参阅 了解 DynamoDB 适应性容量

选择初始吞吐量设置

每个应用程序对在数据库中执行的读取和写入有不同的要求。当您确定 DynamoDB 表的初始吞吐量设置时,请考虑以下输入:

  • 项目大小。 一些项目足够小,可使用单个容量单位进行读取或写入。较大的项目需要多个容量单位。通过估计表中将包含的项目的大小,您可以为表的预置吞吐量指定正确设置。

  • 预期的读取和写入请求速率。 除了项目大小之外,您还应估计每秒需要执行的读取和写入次数。

  • 读取一致性要求。 读取容量单位基于强一致性读取操作,此操作占用的数据库资源是最终一致性读取操作的两倍。您应确定您的应用程序是否需要强一致性读取,或者是否能放宽此要求并改为执行最终一致性读取操作。(默认情况下,DynamoDB 执行的是最终一致性读取。如果需要,您可以对这些操作请求强一致性读取。)

例如,假设您希望从表中每秒读取 80 个项目。这些项目的大小为 3 KB,而且您需要强一致性读取。在这种情况下,每次读取需要一个预置读取容量单位。为确定此数字,您应将此操作的项目大小除以 4 KB,然后向上取整到最近的整数,如下所示:

  • 3 KB / 4 KB = 0.75,或者 1 读取容量单位

在这种情况下,您必须将表的预置读取吞吐量设置为 80 个读取容量单位:

  • 每个项目 1 个读取容量单位 × 每秒 80 次读取 = 80 个读取容量单位

现在假设您希望每秒向您的表写入 100 个项目,并且项目大小为 512 个字节。在这种情况下,每次写入需要一个预置写入容量单位。为确定此数字,您应将此操作的项目大小除以 1 KB,然后向上舍入到最近的整数,如下所示:

  • 512 bytes / 1 KB = 0.5,或者 1

在这种情况下,您需要将表的预置写入吞吐量设置为 100 个写入容量单位:

  • 每个项目 1 个写入容量单位 × 每秒 100 次写入 = 100 个写入容量单位

注意

有关预置吞吐量的建议和相关主题,请参阅设计并高效使用分区键的最佳实践

修改吞吐量设置

如果您已为表启用 DynamoDB Auto Scaling,则其吞吐容量将动态调整以响应实际使用情况。无需手动干预。

您可以使用 AWS 管理控制台或 UpdateTable 操作来修改表的预置吞吐量设置。有关每天的吞吐量增加和减少的更多信息,请参阅DynamoDB 中的限制