您的位置:首页 > 其它

DynamoDB常见问题

2017-06-01 10:32 267 查看

什么是 DynamoDB

问:什么是 Amazon DynamoDB?

Amazon DynamoDB 是一项完全托管的 NoSQL 数据库服务,提供快速而可预测的性能,能够实现无缝扩展。使用 Amazon DynamoDB,客户可以将运行和扩展分布式数据库的管理工作负担交给 AWS,因而无需担心硬件预配、设置和配置、复制、软件更新或集群扩展等问题。

问:Amazon DynamoDB 可以代我进行哪些管理?

Amazon DynamoDB 消除了影响数据库扩展的主要绊脚石之一,即数据库软件的管理,以及运行数据库所需的硬件配置。客户可在短短几分钟之内部署非关系数据库。当表大小增大或您增加配置吞吐量时,DynamoDB 可自动对您的数据进行分区和再分区,并配置额外的服务器容量。此外,Amazon DynamoDB 还可在 AWS 区域的三个设施上同步复制数据,为您提供数据高可用性和数据持久性。

问:读取一致性是什么意思?我为什么应该予以关注?

Amazon DynamoDB 可存储每个表分散在各地的三个副本,以实现高可用性和数据持久性。读取一致性表示的是某个数据项的成功写入或更新会在何时、以何种方式反映在该数据项的后续读取操作中。Amazon DynamoDB 公布的逻辑使您能够针对应用程序中的每次读取请求,指定您需要的一致性特征。

问:Amazon DynamoDB 的一致性模型是什么样的?

从 Amazon DynamoDB 读取数据时,用户可以指定希望读取是最终一致性读取还是强一致性读取:

最终一致性读取(默认)– 最终一致性选项可以最大程度地提高读取吞吐量。但是,最终一致性读取可能不会反映最近完成的一次写入操作的结果。所有数据副本的一致性通常可在一秒钟之内实现。在短时间之后重复读取,应会返回更新的数据。

强一致性读取 – 除了提供最终一致性读取外,Amazon DynamoDB 还使您可以根据应用程序或应用程序某元素的要求,以灵活而有控制力的方式请求强一致性读取。强一致性读取返回的结果可反映在读取前收到成功响应的所有写入。

问:DynamoDB 是否支持就地原子更新?

Amazon DynamoDB 支持快速就地更新。您可以使用单个 API 调用,递增或递减行中的某个数字属性。同样地,您能够以原子方式添加或删除集、列表或映射。请参阅我们的文档,了解有关原子更新的更多信息。

问:为什么 Amazon DynamoDB 是基于固态硬盘构建的?

Amazon DynamoDB 完全运行在固态硬盘 (SSD) 上。SSD 有助于我们实现设计目标,即在可预测的低延迟响应时间之内,存储和访问任何规模的数据。SSD 还具有很高的 I/O 性能,使我们能够经济高效地处理大规模请求工作负载,并能将这种成本效益以较低的请求价格让渡给客户。

问:DynamoDB 的存储成本似乎很高。对我的使用案例来说,这项服务划算吗?

和任何其他产品一样,我们建议 Amazon DynamoDB 的潜在客户考虑解决方案的整体成本,而不要只局限于单个价格指标。处理数据库工作负载的总成本受到两个因素的影响:请求流量要求存储的数据量。大部分数据库工作负载的特点是,每存储 1GB 数据都需要很高的 I/O(每秒读取次数和每秒写入次数很高)。Amazon DynamoDB 是基于 SSD 驱动器构建的,相对于旋转介质而言,它每存储 1GB 数据的成本有所提高,但让我们能够提供非常低的请求成本。根据我们在典型数据库工作负载方面的经验,我们认为,相较于使用典型的基于旋转介质的关系数据库或非关系数据库,使用基于 SSD 的 DynamoDB 服务的总费用通常更低。如果您的使用案例需要存储大量数据,但这些数据的访问频率很低,则 DynamoDB 可能不太适合您。对于此类使用案例,我们建议您使用 S3。

同时还应注意,存储成本反映了将每个数据项的多个副本存储于同一 AWS 区域内多个设施的成本。

问:DynamoDB 仅适用于大型应用程序吗?

- 不是。DynamoDB 具有无缝扩展性,因此您可从较小规模起步,然后根据需要扩大或缩小规模。如果您需要在任何规模上都能实现快速而可预测的性能,则 DynamoDB 可能是您的理想之选。

入门

问:如何开始使用 Amazon DynamoDB?

单击“Sign Up”立即开始使用 Amazon DynamoDB。然后,您可以使用 AWS 管理控制台或 Amazon DynamoDB API,开始与 Amazon DynamoDB 进行交互。如果您使用 AWS 管理控制台,您可以使用 Amazon DynamoDB 创建一个表,只需进行几次点击即可开始体验。

问:DynamoDB 支持哪种类型的查询功能?

Amazon DynamoDB 支持使用用户定义的主键来执行 GET/PUT 操作。主键是表中项目仅有的一个必需属性,并且唯一地标识每个项目。您在创建表时指定主键。除此之外,DynamoDB 还支持您使用全局二级索引和本地二级索引对非主键属性进行查询,从而提供灵活的查询服务。

主键可以是单属性的分区键或复合的分区-排序键。例如,单属性的分区主键可以是“UserID”。这使您能够快速读取和写入与特定用户 ID 相关联的项目的数据。

复合的分区-排序键可作为一个分区键元素和一个排序键元素进行索引。这个多部分键可保持第一个元素值和第二个元素值之间的层次结构。例如,复合的分区-排序键可以由“UserID”(分区)和“Timestamp”(排序)组成。通过保持分区键元素的恒定,您可以在排序键元素中进行搜索以检索项目。这样您就可以使用 Query API 进行检索,例如在一系列时间戳中检索带有单个 UserID 的所有项目。

问:如何在 Amazon DynamoDB 中更新和查询数据项?

使用 AWS 管理控制台或 CreateTable API 创建表之后,您可以使用 PutItem 或 BatchWriteItem API 来插入项目。然后,您可以使用 GetItem、BatchGetItem 或 Query API(如果复合主键已启用且正在表中使用)来检索您添加到表中的项目。

问:Amazon DynamoDB 是否支持条件运算?

支持。您可以指定一个条件,必须达到该条件才能对项目执行放置、更新或删除操作。如需执行条件运算,您可以定义一个 ConditionExpression,该表达式通过以下内容构建:

布尔函数:ATTRIBUTE_EXIST、CONTAINS 和 BEGINS_WITH

比较运算符:=、<>、<、>、<=、>=、BETWEEN 和 IN

逻辑运算符:NOT、AND 和 OR。

您可以构建一个由多个条件子句组合而成的自由形式条件表达式,包括嵌套子句。通过条件运算,用户可以在 DynamoDB 上实现开放式并发控制系统。想要了解更多有关条件运算的详细信息,请参阅我们的文档。

问:键条件是否支持表达式?

是的,您可将表达式指定为 Query 查询 API 调用的一部分,从而使用 KeyConditionExpression 参数,基于表格上的主键筛选结果。

问:分区和分区-排序键是否支持表达式?

是的,您可以对分区和分区-排序键使用表达式。

问:Amazon DynamoDB 是否支持递增运算或递减运算?

是,Amazon DynamoDB 允许对标量值执行原子递增和递减运算。

问:什么时候应该使用 Amazon DynamoDB,而不是使用 Amazon RDS 或 Amazon EC2 上的关系数据库引擎?

当今基于 Web 的应用会生成和消耗大量数据。例如,某个在线游戏刚推出时可能只有几千个用户,数据库工作负载很小,每秒进行 10 次写入和 50 次读取操作。但是,如果游戏取得成功,则可能很快会发展到拥有数百万个用户,读写操作次数达到每秒数万次甚至每秒数十万次。每天可能生成数 TB 甚至更多数据。利用 Amazon DynamoDB 开发应用程序,您能够从较小规模起步,随着要求的提高而增加表的请求容量,同时不会发生停机。您只需为您配置的请求容量支付低廉的费用,并让 Amazon DynamoDB 在足够的服务器容量上执行数据和流量分区工作,从而满足您的需求。将数据库管理的工作交给 Amazon DynamoDB 来打理,您只需要存储和请求数据即可。自动复制和故障转移功能实现了内置容错、高可用性和数据持久性。Amazon DynamoDB 确保您的数据库得到全面管理,并可随着应用程序要求的提高而扩展,令您高枕无忧

尽管 Amazon DynamoDB 解决了数据库可扩展性、管理、性能和可靠性等核心问题,但它并不具备关系数据库的全部功能。它不支持复杂关系查询(例如联接)或复杂事务。如果您的工作负载需要此功能,或者您寻求与现有关系引擎实现兼容,则您可能需要在 Amazon RDS 或 Amazon E
1fff8
C2 上运行关系引擎。虽然关系数据库提供稳健的特性和功能,但要在单个关系数据库实例的基础上扩展工作负载是非常复杂的,而且需要大量的时间和专业知识。因此,如果您预计到新应用程序的扩展要求,而且不需要使用关系功能,则 Amazon DynamoDB 可能是您的最佳选择。

问:Amazon DynamoDB 与 Amazon SimpleDB 有何区别?

我应该使用哪种服务?两种服务都属于非关系数据库,无需数据库管理过程。

Amazon DynamoDB 专为无缝扩展、掌控高速性能量身定做。它在固态硬盘 (SSD) 上运行,以提供低延迟的响应时间,而且特定表的请求容量或存储大小不受限制。这是因为 Amazon DynamoDB 自动在足够数量的服务器上对您的数据和工作负载进行分区,以满足您的扩展要求。

相比之下,Amazon SimpleDB 中的表受到 10GB 的严格存储限制,其能够达到的请求容量也受到限制(通常低于每秒 25 次写入操作);如果需要额外扩展,您还要负责管理数据在更多 SimpleDB 表上的分区和再分区。虽然 SimpleDB 受到扩展限制,但它是需要灵活查询的较小工作负载的理想之选。Amazon SimpleDB 自动索引所有项目属性,因而支持灵活查询,但会影响性能和可扩展性。

问:什么时候应该使用 Amazon DynamoDB,而不是使用 Amazon S3?

Amazon DynamoDB 存储按主键索引的结构化数据,实现对从 1 字节到 400KB 的项目的低延迟读取和写入访问。Amazon S3 存储非结构化 Blob,适合存储最大 5 TB 的大型数据元。为了优化您使用 AWS 服务的成本,应将大型数据元或不常访问的数据集存储在 Amazon S3 中,而最好将小型数据元素或文件指针(可能指向 Amazon S3 对象)保存在 Amazon DynamoDB 中。

问:任何操作系统下的应用程序是否都能使用 DynamoDB?

是的。DynamoDB 是一项完全托管的云服务,可以通过 API 使用。任何操作系统(例如 Linux、Windows、iOS、Android、Solaris、AIX、HP-UX 等)下的应用程序都可以使用 DynamoDB。我们建议借助 AWS SDK 初步掌握 DynamoDB。在开发人员资源页面中列有 AWS 软件开发工具包。如果您在安装或使用我们的软件开发工具包时遇到困难,请告诉我们,您可以将问题发布到相关的 AWS 论坛。

数据模型和 API

问:数据模型是什么样的?

Amazon DynamoDB 的数据模型如下:

表:表是数据项的集合 – 就好比关系数据库中的表是行的集合。每个表具有无限数量的数据项。Amazon DynamoDB 是无架构的,因为表中的数据项不必具有相同的属性,甚至不必具有相同数量的属性。每个表必须具有一个主键。主键可以是单个属性键,也可以是组合了两个属性的“复合”属性键。每个项目都必须具有您指定为主键的属性,因为主键对表中的各个项目进行唯一标识。

项目:项目包括一个主键或复合键,以及数量不限的属性。与单个项目相关联的属性数量没有明确限制,但项目的总大小(包括所有属性名称和属性值)不得超过 400KB。

属性:与数据项相关联的每个属性包括属性名称(例如“Color”)以及一个值或一组值(例如“Red”或“Red、Yellow、Green”)。单个属性没有明确大小限制,但项目的总大小(包括所有属性名称和值)不得超过 400KB。

问:项目大小是否受到限制?

项目的总大小(包括属性名称和属性值)不得超过 400KB。

问:项目可具有的属性数量是否受到限制?

项目可以具有的属性数量不受限制。但是,项目的总大小(包括属性名称和属性值)不得超过 400KB。

问:有哪些 API?

CreateTable – 创建表并指定用于数据访问的主键。

UpdateTable – 为指定的表更新配置的吞吐量值。

DeleteTable – 删除表。

DescribeTable – 返回表大小、状态和索引信息。

ListTables – 返回与当前账户和终端节点相关联的所有表的列表。

PutItem – 创建新项目,或将旧项目替换为新项目(包括所有属性)。如果项目已存在于具有相同主键的指定表中,则新项目将会完全替换现有项目。您还可以使用条件运算符实现条件替换,即仅在项目的属性值符合特定条件时才替换项目,或仅在项目尚未存在时才插入新项目。

BatchWriteItem – 通过单个请求(而不是单个事务)插入、替换和删除多个表中的多个项目。支持对最多 25 个项目批量执行 Put 或 Delete 操作,最大总请求大小为 16MB。

UpdateItem – 编辑现有项目的属性。您还可以使用条件运算符实现条件更新,即仅在项目的属性值符合特定条件时才进行更新。

DeleteItem – 按主键删除表中的单个项目。您还可以使用条件运算符实现条件删除,即仅在项目的属性值符合特定条件时才删除项目。

GetItem – GetItem 运算符可为匹配主键的项目返回一组属性。默认情况下,GetItem 操作提供最终一致性读取。如果最终一致性读取不适用于您的应用程序,请使用 ConsistentRead。

BatchGetItem – BatchGetItem 操作可为使用主键的多个表中的多个项目返回属性。单个响应的大小限制为 16MB,最多返回 100 个项目。支持强一致性和最终一致性。

query– 利用表主键,或利用索引键从二级索引中获取一个或更多项目。通过使用比较操作符或表达式,您可以缩小表格查询的范围。您还可以通过对非键属性使用筛选条件来筛选查询结果。支持强一致性和最终一致性。单个请求的大小限制为 1MB。

scan– 通过对表或二级索引执行全面扫描来获取所有项目和属性。您可以通过针对一个或多个属性指定过滤条件来限制返回结果集。

问:什么是扫描操作的一致模型?

答:扫描操作支持最终一致性读取和一致性读取。默认情况下,扫描操作具有最终一致性。不过,您可以在 Scan API 调用中使用可选的 ConsistentRead 参数,修改一致性模型。将 ConsistentRead 参数设为 true 后,您可以通过扫描操作进行一致性读取。

问:扫描操作的工作原理是什么?

您可将扫描操作视为迭代器。一旦特定 Scan API 请求的扫描项目的总大小超过 1MB 限制,则该特定请求将被终止,提取的结果将与 LastEvaluatedKey 一同返回(以便在后续操作中继续扫描)。

问:扫描操作是否有任何限制?

每次对表或二级索引执行扫描操作时都不能超过 1MB 的大小限制。超过 1MB 的限制后,它将停止操作并返回到该点为止的匹配结果以及后续操作中要应用的 LastEvaluatedKey,这样您可以在停止的位置恢复操作。

问:一次扫描操作要消耗多少个读取容量单位?

答:所需的读取单位是用扫描操作捕获到的字节数(四舍五入到最接近的 4KB)除以 4KB。采用一致性读取方式扫描表格占用的读取容量是采用最终一致性读取方式进行扫描的两倍。

问:DynamoDB 支持哪些数据类型?

DynamoDB 支持四种标量数据类型:数字、字符串、二进制和布尔。此外,DynamoDB 支持集合数据类型:数字集、字符串集、二进制集、异质链表和异质映射。DynamoDB 还支持 NULL 值。

问:DynamoDB 支持哪些类型的数据结构?

DynamoDB 支持键-值和文档数据结构。

问:什么是键-值存储?

键-值存储是一项数据库服务,支持存储、查询和更新对象集合,使用包含所存储实际内容的键和值进行识别。

问:什么是文档存储?

文档存储支持以 JSON、XML 和 HTML 等文档格式存储、查询和更新项目。

问:DynamoDB 是否具有 JSON 数据类型?

否,但您可以使用文档软件开发工具包将 JSON 数据直接传输到 DynamoDB 中。DynamoDB 数据类型是受 JSON 支持的数据类型超集。文档软件开发工具包可将 JSON 文档自动映射到本地 DynamoDB 数据类型。

问:我能否使用 AWS 管理控制台查看和编辑 JSON 文档?

能够。AWS 管理控制台提供简单的用户界面,用于探索并编辑 DynamoDB 表中存储的数据,包括 JSON 文档。如需查看或编辑表中的数据,请登录 AWS 管理控制台,选择 DynamoDB,选择您要查看的表,然后单击“探索表”按钮。

问:查询 DynamoDB 中的 JSON 数据是否有不同?

没有。您可以在任何顶级 JSON 元素上创建全局二级索引或本地二级索引。举例来说,假设您存储的 JSON 文档中包含关于人的下列信息:名、姓氏、邮政编码及他们的所有好友列表。名、姓氏和邮政编码为顶级 JSON 元素。您可以创建一个索引让您根据名、姓氏或邮政编码进行查询。好友列表不是顶级元素,因此您不能索引该好友列表。

问:如果我的 DynamoDB 中有嵌套 JSON 数据,我能否只检索该数据的特定元素?

能。当使用 GetItem、BatchGetItem、Query 或 Scan API 时,您可以定义一个 ProjectionExpression 以确定应从表中检索哪些属性。这些属性可包括 JSON 文档的标量、集或元素。

问:如果我的 DynamoDB 中有嵌套 JSON 数据,我能否只更新该数据的特定元素?

能。当更新 DynamoDB 项目时,您可以指定您要更新的 JSON 文档的子元素。

问:什么是文档软件开发工具包?

文档软件开发工具包是 JavaScript 的数据类型包装器,可以轻松实现 JS 和 DynamoDB 数据类型之间的相互操作。使用此软件开发工具包,您可以处理请求的包装。响应与之类似,可以对数据类型进行解包。

可扩展性、可用性和持久性

问:我能够存储在 Amazon DynamoDB 中的数据量是否受到限制?

不是。您在 Amazon DynamoDB 表中存储的数据量不受任何限制。随着您的数据集大小的增加,Amazon DynamoDB 将自动在足够的机器资源上分布您的数据,以满足您的存储要求。

问:单个表的吞吐量是否有限制?

没有限制。您可以使用 UpdateTable API 或在 AWS 管理控制台中增加为表配置的吞吐量。DynamoDB 能够大容量运行,您可以达到的最大吞吐量没有理论上的限制。DynamoDB 自动将表分为多个分区,其中每个分区都是一个独立的并行计算单元。DynamoDB 可以通过添加更多分区,不断提高吞吐率。

问:当我通过更改配置吞吐量来请求增加或减小吞吐量时,Amazon DynamoDB 是否保持可用?

是的。Amazon DynamoDB 在增加或减小配置吞吐量时仍然保持可用。

问:使用 Amazon DynamoDB 时是否需要管理客户端分区?

不是。Amazon DynamoDB 不需要跨数据库表进行分区以实现吞吐量可扩展性。

问:Amazon DynamoDB 的可用性有多高?

该服务运行于 Amazon 经过实践检验的高可用性数据中心。该服务在 AWS 区域的三个设施上复制数据,以便在发生服务器故障或可用区域运行中断时提供容错保护。

问:Amazon DynamoDB 如何实现很高的正常运行时间和持久性?

为了实现很高的正常运行时间和持久性, Amazon DynamoDB 在 AWS 区域的三个设施上同步复制数据。

全局二级索引

问:什么是全局二级索引?

全局二级索引是包含不同于表的主键的分区键或分区-和-排序键的索引。

为对表中的数据进行高效访问,Amazon DynamoDB 针对主键属性创建并维护其索引。这可以让应用程序通过指定主键值快速地检索数据。但是,包含一个或多个二级(或替代)键也能使许多应用程序受益,因为这可以让它们更高效地访问其属性与主键不同的数据。要实现这一目的,您可以在表中创建一个或多个二级索引,并对这些索引发出 Query 请求。

Amazon DynamoDB 支持两种类型的二级索引:

本地二级索引 – 分区键与表相同但排序键不同的索引。本地二级索引之所以称为“本地”,是因为该索引的每个分区的范围都限定为具有相同分区键的表分区。

全局二级索引 – 分区键或分区-和-排序键可与表中的这些键不同的索引。全局二级索引之所以称为“全局”,这是因为该索引上的查询可跨过所有分区,涵盖表中的所有项目。

二级索引由 Amazon DynamoDB 以稀疏数据元的形式自动维护。只有当项目存在于定义索引所引用的表中,它们才会出现在索引中。这使得按索引进行查询变得非常高效,因为索引中的项目数通常远远少于表中的项目数。

全局二级索引支持非唯一属性,它允许在表中按任何非键属性进行查询,从而提高了查询的灵活性。

比如说,某个游戏应用程序将玩家信息存储在 DynamoDB 表中,该表的主键由 UserId(分区)和 GameTitle(排序)组成。项目中包含名称为 TopScore、Timestamp、ZipCode 的属性,以及其他一些属性。创建表以后,DynamoDB 在主键上提供隐式索引(主索引),以便能够高效地查询并返回某个特定用户在所有游戏中获得的最高分。

但是,如果应用程序需要获得用户在某个特定游戏中的最高分,则使用这种主索引查询的效率极低,并且需要在整个表中进行扫描。反之,以 GameTitle 为分区键元素并以 TopScore 为排序键元素的全局二级索引能让应用程序快速检索某个游戏的最高分。

GSI 不需要排序键元素。例如,您的 GSI 可以拥有一个只带分区元素 GameTitle 的键。在以下示例中,GSI 没有投影属性,因此它只会返回属性与您正在查询的 GameTitle 相匹配的所有项目(通过主键识别)。

问:全局二级索引应该在什么时候使用?

全局二级索引尤其适用于追踪具有很多不同值的属性之间的关系。例如,您可以创建 DynamoDB 表并将 CustomerID 用作该表的主分区键,将 ZipCode 用作全局二级索引的分区键,因为邮政编码的数量很多,而且您可能会拥有很多客户。使用主键,您可以快速获得任何客户的相关记录。使用全局二级索引,您可以高效查询居住在指定邮政编码地区的所有客户。

为了确保充分利用全局二级索引的能力,请参阅我们提供的有关统一工作负载的最佳实践文档。

问:如何为 DynamoDB 表创建全局二级索引?

可以随时指定与表关联的 GSI。欲了解创建表及其索引的具体步骤,请参阅此处。您最多可以为每个表创建 5 个全局二级索引。

问:DynamoDB 的本地版本支持全球二级索引吗?

是的。DynamoDB 的本地版本可用于开发和测试 DynamoDB 支持的应用程序。您可以在此下载 DynamoDB 的本地版本。

问:什么是投影属性?

二级索引中的数据包括从表投影或复制到索引中的属性。创建二级索引时,您需要定义该索引的替代键,以及您希望投影到该索引的其他任何属性。Amazon DynamoDB 会将这些属性复制到索引中,并从表中复制主键属性。然后,您可以查询该索引,就像查询表一样。

问:是否可以在非唯一属性上定义全局二级索引键?

是的。与表中的主键不同的是,GSI 索引不要求索引属性具有唯一性。例如,GameTitle 上的 GSI 可将所有项目编入索引,以追踪用户在每个游戏中的得分。在此示例中,通过查询 GSI 可以返回玩过“TicTacToe”游戏的所有玩家。

问:全局二级索引与本地二级索引有何不同?

全局二级索引和本地二级索引都能提高查询的灵活性。LSI 与特定的分区键值相关联,而 GSI 则可以涵盖所有的分区键值。由于具有相同分区键值的项目在 DynamoDB 中共享同一分区,所以“本地”二级索引只包含存储在同一位置(相同分区)的项目。因此,LSI 可用于查询分区键值相同但排序键值不同的项目。例如,假设有某个用于追踪客户订单的 DynamoDB 表,其中 CustomerId 为分区键。

在 OrderTime 上建立的 LSI 可以高效地查询并检索出特定客户最近订购的产品。

相比之下,GSI 并不局限于具有共用分区键值的项目。相反,GSI 与主键一样,可以跨越表的所有项目。在上表中,在 ProductId 上建立的 GSI 可用于高效地查找特定产品的全部订单。请注意,本示例中没有指定 GSI 排序键,即使可能有很多订单的 ProductId 相同,它们也将作为单独的项目存储在 GSI 中。

为了确保表和索引中的数据共处于同一个分区,LSI 将每个分区键值的全部元素(表和索引)的总大小限制为 10GB。GSI 不强行要求数据共处,且不做任何此类限制。

当您向表中写入内容时,DynamoDB 自动更新所有受影响的 LSI。相反地,对于表中定义的任何 GSI 进行的更新最终会保持一致。

LSI 允许 Query API 检索投影列表之外的属性。这不是 GSI 支持的行为。

问:全局二级索引是如何工作的?

GSI 的行为方式在许多方面与 DynamoDB 表相似。您可以使用 GSI 的分区键元素查询 GSI,同时对排序键元素使用条件筛选器。然而,两者又有不同,DynamoDB 表的主键必须是唯一的,而 GSI 键可以由多个项目共用一个。如果存在具有同一 GSI 键的多个项目,则将按单独的 GSI 项目对其进行追踪,并且 GSI 查询会将它们作为单独的项目全部检索出来。当增加、删除或更新项目时,DynamoDB 会在内部确保 GSI 的内容得到相应地更新。

DynamoDB 将 GSI 的投影属性存储在 GSI 数据结构中,同时还存储了 GSI 键和匹配项目的主键。GSI 使用源表中的投影项目的存储。这可以确保根据 GSI 而不是表进行查询,从而提高查询的灵活性并改进工作负载的分配。因此,查询 GSI 索引不会返回:属于表中项目的一部分,但不属于 GSI 键的属性、该表的主键以及投影属性。如果应用程序需要在查询 GSI 后从表中获得其他数据,则可从 GSI 中检索主键,然后使用 GetItem 或 BatchGetItem API 从表中检索需要的属性。由于 GSI 具有最终一致性,所以使用此模式的应用程序必须要考虑在 GSI 和 GetItem/BatchItem 调用期间项目被删除(从表中删除)的问题。

当对表进行相应更改时,DynamoDB 将自动处理 GSI 中的项目增加、更新和删除。将某个项目(具有 GSI 键属性)添加到表中时,DynamoDB 会对 GSI 进行异步更新,以增加此新项目。同样地,将某个项目从表中删除时,DynamoDB 会从受影响的 GSI 中删除该项目。

问:是否可以为基于分区的表和分区-排序结构表创建全局二级索引?

可以,无论 DynamoDB 表拥有何种类型的主键,您都可以创建全局二级索引。该表的主键可能只包括一个分区键,也可能同时包括分区键和排序键。

问:全局二级索引的一致性模型是什么?

GSI 支持最终一致性。在表中插入或更新项目时,GSI 不会同步更新。在正常操作条件下,向全局二级索引的写入操作将在几分之一秒内得到传播。在极少数故障情况下,时间可能会延长。正因如此,您的应用程序逻辑应具备相应的能力,以处理可能过期的 GSI 查询结果。请注意,对于其他支持最终一致性读取的 DynamoDB API,它们也具有与此相同的行为。

比方说,有一个用于追踪最高分的表,该表中每个项目都具有 UserId、GameTitle 和 TopScore 属性。主分区键是 UserId,主排序键是 GameTitle。如果应用程序为 GameTitle“TicTacToe”和 UserId“GAMER123”添加了一个新的最高分的项目,随后再查询 GSI,则这个新分数可能不在查询结果之列。不过,一旦完成 GSI 传播,该新项目即开始出现在对 GSI 的此类查询中。

问:是否可以单独预配置表和每个全局二级索引的吞吐量?

是的。GSI (二级索引)管理的吞吐量与它们所依托的表无关。您需要在创建时明确指定表和每个相关 GSI 的预配置吞吐量。您可以使用 DynamoDB 控制台中的 Create Table Wizard 帮助您在表和索引之间分配总吞吐量。

根据应用程序的不同,GSI 的请求工作负载与表或其他 GSI 的请求工作负载可能有很大差别。以下列出的几种情形便体现了这种差别:

与表相比,包含极少表项目的 GSI 需要的写入吞吐量要低得多。

与表相比,用于查找非经常性项目的 GSI 需要的读取吞吐量要低得多。

需大量读取操作的后台任务所用的 GSI 每天有几小时可能需要较高的读取吞吐量。

随着您的需求的发展,您可以更改 GSI 的预配置吞吐量,这与表的预配置吞吐量无关。

比如某个 DynamoDB 表,它的 GSI 投影了所有属性,并且该表中 50% 的项目都有 GSI 键。在这种情况下,GSI 的预配置写入容量单位应设置为表的预配置写入容量单位的一半。使用类似的方式可以估算出 GSI 的读取吞吐量。

问:增加全局二级索引会对表的预配置吞吐量和存储造成怎样的影响?

类似于 DynamoDB 表,在对 GSI 执行读取或写入操作时,它会使用预配置吞吐量。增加或更新 GSI 项目的写入操作将根据更新的大小使用写入容量单位。除了更新表中项目需要的容量之外,GSI 写入操作也要使用容量。

请注意,如果您在 DynamoDB 表中增加、删除或更新项目且这一操作不会导致 GSI 发生变化,则 GSI 将不会使用任何写入容量单位。在以下条件时会发生这种情况:向 DynamoDB 表增加不含任何 GSI 键属性的项目;或在不更改任何 GSI 键或投影属性的情况下更新项目。

查询 GSI 时,会根据查询所检索的项目大小来使用读取容量单位。

GSI 的存储成本基于该 GSI 中所存储的字节总数。这包括 GSI 键与投影属性和值,以及用于编制索引而损耗的 100 字节。

问:DynamoDB 能否因 GSI 的预配置吞吐量而限制应用程序对表的写入操作?

由于对 DynamoDB 表的部分或全部写入操作会同时导致对关联 GSI 的写入,因此 GSI 的预配置吞吐量可能会耗尽。在此情况下,后续对表的写入操作将受到限制。即使该表仍有可用的写入容量单位,这种情况也可能发生。

问:我可以多长时间在索引级更改一次预配置吞吐量?

带有 GSI 的表对于吞吐量更改次数的每日限制与普通表是相同的。

问:DynamoDB 全局二级索引是如何收费的?

根据表及其 GSI 的合计预配置吞吐量,按小时向您收费。此外,还将向您收取 GSI 所使用的数据存储费,以及标准的数据传输(外部)费用。如果您要更改 GSI 的预配置吞吐容量,可使用 DynamoDB 控制台或 UpdateTable API 执行此操作。

问:能够指定用于查询的全局二级索引?

是的。除了常见的查询参数之外,GSI 的查询指令还明确包含对其进行操作的 GSI 的名称。请注意,一次查询只能使用一个 GSI。

问:全局二级索引支持哪些 API 调用?

GSI 支持的 API 调用包括 Query 和 Scan。Query 操作只搜索索引键属性值,并且支持比较运算符的子集。由于 GSI 是异步更新,所以您不能使用 ConsistentRead 参数进行查询。请查看此处了解有关使用 GSI 进行查询和扫描的详细信息。

问:在全局二级索引扫描中,结果是怎么排列的?

对于全局二级索引,当采用仅分区键架构时,不会发生排序问题。对于具有分区-排序键架构的全局二级索引,同一分区键检索结果的排序是根据排序属性决定的。

问:我能否在创建表之后更改全局二级索引?

能,可以随时更改全局二级索引,甚至在创建表之后。

问:我如何在现有的表中添加全局二级索引?

您可以通过控制台或 API 调用添加全局二级索引。在 DynamoDB 控制台上,首先选择您要添加全局二级索引的表,然后点击“创建索引”按钮以添加新索引。按照索引创建向导中的步骤,并在完成时选择“创建”。您还可以通过 GlobalSecondaryIndexes 参数使用 UpdateTable API 调用添加或删除全局二级索引。您可以阅读文档页面来了解更多信息。

问:如何删除全局二级索引?

您可以通过控制台或 API 调用删除全局二级索引。在 DynamoDB 控制台上,选择您要删除的全局二级索引所在的表。然后,选择“表项目”下的“索引”选项卡,并点击下面的“删除”按钮以删除索引。您还可以使用 UpdateTable API 调用删除全局二级索引。

问:能否通过一次 API 调用添加或删除同一个表中的多个索引?

每个 API 调用只能添加或删除一个索引。

问:如果我提交多个请求来添加同一个索引,会出现什么情况?

只会接受第一个添加请求,所有后续添加请求将失败,直到第一个添加请求完成为止。

问:我能否同时添加或删除同一个表中的多个索引?

不能,任何时候,一个表中都只能有一个活跃的添加或删除索引操作。

问:是否应该预配置额外的吞吐量以添加全局二级索引?

尽管没有要求,仍然强烈建议您预配置与索引的吞吐量分离的额外写入吞吐量。如果您不额外预配置写入吞吐量,将消耗索引的写入吞吐量来添加新索引。这样在创建新索引时,会影响索引的写入性能,也会增加创建新索引的时间。

问:创建索引后,我是否必须减少全局二级索引的额外吞吐量?

是,一旦过程完成,您就必须回拨为添加索引而额外预配置的写入吞吐量。

问:我能否修改为添加全局二级索引而预配置的写入吞吐量?

能,您可以在创建过程中随时上拨或下拨索引创建转用预配置写入吞吐量。

问:在添加或删除全局二级索引时,表是否仍可用?

是,更新全局二级索引时该表可用。

问:添加或删除全局二级索引时,现有索引是否仍然可用?

是,当更新全局二级索引时现有索引可用。

问:创建添加全局二级索引时,新索引是否可用?

否,新索引只在索引创建过程完成后才可用。

问:添加全局二级索引需要多长时间?

时长取决于表的大小和为创建全局二级索引而额外预置的写入吞吐量的数量。添加或删除索引的过程要花费几分钟到几个小时不等。例如,假设您有一个预配置了 500 写入容量单位的 1GB 表,并为索引和新索引创建预配置了 1000 个额外的写入容量单位。如果新索引包含表中的所有属性,且该表使用所有的写入容量单位,我们预计索引创建将花费 30 分钟左右。

问:删除全局二级索引需要花费多久?

索引的删除一般在几分钟内完成。例如,删除具有 1GB 数据的索引一般要不了 1 分钟。

问:如何追踪全局二级索引的添加或删除操作进度?

您可以使用 DynamoDB 控制台或 DescribeTable API 查看与表相关的所有索引的状态。对于添加索引操作,正在创建索引时,索引的状态为“创建中”。一旦索引的创建完成,索引状态会从“创建中”变成“活跃”。对于删除索引操作,请求完成时,删除的索引将不复存在。

问:添加全局二级索引的索引创建过程完成时,我是否会收到通知?

您可以请求向您的电子邮件地址发送通知,以确认索引添加已完成。当您通过控制台添加索引时,您可以请求在创建索引前在最后一步发送通知。当索引创建完成时,DynamoDB 将向您的电子邮件发送 SNS 通知。

问:当我在已经有 5 个索引时尝试添加更多的全局二级索引时,会出现什么情况?

您目前的限制为 5 个 GSI。“添加”操作将失败,且您将收到一个错误提示。

问:我能否在具有同样名称的索引被删除后重用全局二级索引的名称?

能,删除了全局二级索引后,在添加新索引时,可以再次使用该索引名称。

问:我能否在索引创建时取消索引添加?

否,索引创建一旦开始,就不能取消索引创建过程。

问:是否所有的 DynamoDB 表项目都需要 GSI 键属性?

不是。GSI 是稀疏索引。与那些要求包含主键的项目不DynamoDB 表中的项目不必包含任何 GSI 键。如果某个 GSI 键同时包含分区和排序元素,但某个表项目遗漏了其中一个元素,则该项目不会被对应的 GSI 编入索引。在此情况下,GSI 对于高效地查找具有稀有属性的项目非常有用。

问:是否能从全局二级索引中检索 DynamoDB 表的全部属性?

GSI 查询只能返回在创建时就指定包含在 GSI 中的属性。GSI 中包含的属性是指默认投影的属性,如 GSI 的键属性和表的主键属性,以及用户指定要投影的属性。出于此原因,对于那些属于表的一部分,但又未包含在 GSI 中的项目,GSI 查询不会返回其属性。将所有属性指定为投影属性的 GSI 可用于检索任何表属性。请参阅此处,以了解有关使用 GSI 进行查询的文档说明。

问:如何列出与表相关的 GSI?

DescribeTable API 可返回有关表中的全局二级索引的详细信息。

问:哪些数据类型可以进行索引?

所有标量数据类型(数字、字符串、二进制和布尔)均可用于本地二级索引键的排序键元素。集、列表和映射类型不能索引。

问:是否存在复合属性索引?

不存在。但您可以将属性连结到一个字符串中,并将其作为键。

问:哪些数据类型可以成为 GSI 的投影属性的一部分?

您可以指定将带有任何数据类型(包括集合类型)的属性投影到 GSI 中。

问:GSI 在扩展性上有哪些注意事项?

关于 DynamoDB 表的主键的性能注意事项同样适用于 GSI 键。GSI 在所有键上采取一种相对随机的访问模式。为了充分利用二级索引预置的吞吐量,您选择的 GSI 分区键属性应该包含大量不同的值,而选择的 GSI 排序键属性应该非常均匀地被请求,越随机越好。

问:CloudWatch 将会为全局二级索引提供哪些新指标?

带有 GSI 的表将为该表和 GSI 提供聚合指标,也会为该表和每个 GSI 提供分类汇总指标。

单个 GSI 的报告将用于支持 CloudWatch 指标(由表提供支持)的子集。其中包括:

读取容量(预配置读取容量、使用的读取容量)

写入容量(预配置写入容量、使用的写入容量)

限制的读取事件

限制的写入事件

问:如何扫描全局二级索引?

全局二级索引可通过控制台或扫描 API 进行扫描。

如需扫描全局二级索引,除您想要扫描的表名称外,还须明确引用索引。您必须指定索引分区属性名称和值。您可以针对索引键排序属性选择性地指定条件。

问:全局二级索引扫描是否允许我在要返回的结果集中指定非投影属性?

全局二级索引扫描将不支持抓取非投影属性。

问:是否将会支持索引并行扫描?

是的,我们将支持并行扫描索引,并且语义与主表的相同。

本地二级索引

问:什么是本地二级索引?

通过本地二级索引可以进行一些常规的查询操作,从而实现运行速度加快且运行成本最优,否则,其将需要检索大量项目,然后再对结果进行筛选。这表示您的应用程序可以基于更广泛属性进行更灵活的查询。

启动本地二级索引前,如果您想在某个分区查找特定项目(共享同一分区键的项目),DynamoDB 将提取共享单一分区键的所有对象,然后对结果进行相应筛选。以某种电子商务应用程序为例,它将用户订单数据存储在 DynamoDB 表中,该表采用客户 ID-订单时间戳这种分区-排序架构。在没有 LSI 的情况下,如果要“显示客户 X 提交的发货日期在最近 30 天内的所有订单,按发货日期予以排序”,您必须使用 Query API 来检索分区键“X”下的所有对象,按照发货日期对结果进行排序,然后过滤掉较早的记录。

借助本地二级索引,我们就可以简化上述操作了。现在,您可以在“发货日期”属性上创建索引,并有效执行此查询,仅需检索必需项即可。由于您只需检索符合您所需特定标准的项目,因此大大减少了等待时间和查询成本。此外,由于您无需再写入自定义逻辑来筛选结果,因此,这一操作还简化了应用程序的编程模型。我们将这种新二级索引称为“本地”二级索引,由于它与分区键结合使用,因此您可以在分区键存储桶内进行本地搜索。这样一来,即使以前您或许只能借助分区键和排序键进行搜索,但现在,您还可以使用二级索引代替排序键进行搜索,从而增加了能够用于有效查询的属性数量。

可以将数据属性的冗余备份复制到您定义的本地二级索引中。这些属性包括表分区和排序键,以及您定义的备用排序键。您还可以将其他数据属性重复存储在本地二级索引中,从而在无需访问表本身的情况下,即可实现访问这些其他属性。

本地二级索引并非适用于所有应用程序。它们会对您可以在单一分区键数值中存储的数据量有一些限制。

问:什么是投影?

被复制到本地二级索引中的属性集称为“投影”。投影将确定您能够以最高效方式进行检索的属性。查询本地二级索引时,Amazon DynamoDB 可以访问任意具有相同性能特点的投影属性,此操作与访问其自身表中的属性方式相同。如果您需要检索尚未投影的任意属性,那么 Amazon DynamoDB 会自动从表中将这些属性提取出来。

定义本地二级索引后,您需要指定投影到索引的属性。每个索引条目至少应包括:(1) 表分区键值,(2) 用作索引排序键的属性,以及 (3) 表排序键值。

除此之外,您还可以选择用户指定其他非键属性,将其投影到索引。您还可以选择将所有属性投影到索引,在这种情况下,索引将复制与表相同的数据,但此数据按照您指定的备用排序键进行组织。

问:如何创建 LSI(本地二级索引)?

您需要在表创建时创建 LSI。随后将无法添加。如需创建 LSI,请指定以下两项参数:

索引排序键 – 将被索引和查询的属性。

投影属性 – 表中的属性列表,可直接将其复制到本地二级索引中,因此这些属性返回速度更快,且无需从包含表的所有项的主索引中提取数据。没有投影属性的情况下,本地二级索引仅含主索引和二级索引键。

问:什么是适用于 LSI 的一致性模型?

主索引更新时,本地二级索引将自动进行更新。与从主索引读取相似,LSI 支持强和最终一致性读取选项。

问:本地二级索引包含对表中所有项的引用吗?

不一定。本地二级索引仅引用包含针对该 LSI 指定的索引排序键的项目。DynamoDB 的灵活架构意味着并非所有项目都一定要包含所有属性。

这表示相较于主索引,本地二级索引可进行稀疏填充。由于本地二级索引稀疏,因此可有效用于支持不常见属性的查询。

例如,在上述订单示例中,客户的一个项目中可能包含若干附加属性,且仅在订单取消的情况下包括这些属性(例如 CanceledDateTime、CanceledReason)。针对已取消项目的查询,由于索引中引用的项目仅为拥有现有属性的项目,因此,任何这些属性上的本地二级索引均有效。

问:如何查询本地二级索引?

仅可通过 Query API 查询本地二级索引。

如需查询本地二级索引,除您想要查询的表名称外,还须明确引用索引。您必须指定索引分区属性名称和值。您可以针对索引键排序属性选择性地指定条件。

您的查询可检索主索引中存储的非投影属性,其方式为执行表提取操作,且其需要占用附加读取容量单位。

强一致性和最终一致性读取均支持利用本地二级索引的查询操作。

问:如何创建本地二级索引?

必须在创建表时定义本地二级索引。表的主索引必须使用分区-排序复合键。

问:能够将本地二级索引添加至现有的表中吗?

不,现在还不可以将本地二级索引添加至现有表中。我们正在努力研究添加这一功能,并在将来予以发布。创建带有本地二级索引的表后,您可以通过定义当前不可用的排序键元素来创建本地二级索引,以供日后使用。由于本地二级索引不密集,因此您在决定使用该索引前无需付出任何成本。

问:能够在一个表中创建多少本地二级索引呢?

每个表可以拥有多达 5 个本地二级索引。

问:能够在一个表中创建多少投影非键属性呢?

按照表中所有本地二级索引进行统计,每个表可以拥有多达 20 个投影非键属性。每个索引还可以指定来自投影主索引的所有非键属性。

问:索引创建后能修改吗?

不可以,索引一旦创建就不能修改了。

问:能删除本地二级索引吗?

不可以,目前,一旦创建就无法从表中删除本地二级索引。当然,如果您要删除整个表,则可以将其删除。

问:本地二级索引如何占用预配置容量?

您无需为本地二级属性特别配置容量。它将占用与其关联的表一部分配置容量。

按照每 1KB 数据 1 个单位的标准公式,从 LSI 读取数据时所耗容量与用 LSI 向表中写入数据时所耗容量的差异如下:

写入包含与一个或以上本地二级索引相关的数据时,这些写入将会镜像复制到相应的本地二级索引上。在这些情况下,写入容量将被表本身所占用,而各个相关 LSI 将占用额外的写入容量。

对于覆盖了现有项的更新,它会导致发生两项操作:删除和插入,由此每 1KB 数据将占用额外的写入容量单位。

当读取查询请求尚未投影至 LSI 的属性时,DynamoDB 将从主索引提取这些属性。该隐式 GetItem 请求每提取 4KB 数据时,将占用一个读取容量单位。

问:本地二级索引会占用多少存储空间?

对于所有投影非键属性,本地二级索引将占用属性名称以及每个 LSI 主键和索引键值的存储空间。此外,每在 LSI 反映一个项目,则增加 100 字节的存储空间。

问:哪些数据类型可以进行索引?

所有标量数据类型(数字、字符串、二进制)均可用于本地二级索引键的排序键元素。不能使用数据集类型。

问:哪些数据类型可投影入本地二级索引?

所有数据类型(包括设置类型)均可投影入本地二级索引。

问:什么是项目集合及其如何与 LSI 关联?

在 Amazon DynamoDB 中,项目集合是表及其所有二级索引中拥有相同分区键项目的组合。传统的分区(或分享)关系数据库系统将其称为“分享”或“分区”,指的是分区键下存储的所有数据库项或行。

对于每个包括本地二级索引的表,其项目集合都是自动创建并维护的。DynamoDB 会将所有项目集合存储在单一磁盘分区。

问:项目集合的大小有限制吗?

Amazon DynamoDB 中所有项目集合的大小不得超过 10GB。对任何非重复分区键值,表中项目大小的总和加上该表的本地二级索引中所有项目大小的总和不得超过 10GB。

不带本地二级索引的表不受此项目集合最大 10GB 的限制;此限制仅影响拥有一个或以上本地二级索引的表。

尽管单独项目集合大小受到限制,但是带本地二级索引的整体表存储大小不受限制。如果任一分区键的总存储大小(表和索引)不超过 10GB 阈值,则 Amazon DynamoDB 中编入索引的表的总大小实际上不受限制。

问:如何跟踪项目集合的大小?

DynamoDB 写入 API(PutItem、UpdateItem、DeleteItem 和 BatchWriteItem)包括一个选项,通过该选项,API 将响应相关项目集合大小的预估值。该预估值包括特定项目集合中数据的预估值大小上限与下限,单位为 GB。

建议对您的应用程序进行检测,从而监测您项目集合的大小。您的应用程序应检测 API 响应相关项目集合大小,并在项目集合超出用户定义限值(例如,8GB)的任何时候记录错误消息。这将提供早期警告系统,通过该警告系统,您可以了解项目集合正在逐渐变大,但会为您留足够的时间去处理。

问:如果超过项目集合的 10GB 大小限制会发生什么情况?

如果特定项目集合超过 10GB 的大小限制,那么您将无法写入新项目或增加该分区键现有项目的大小。仍允许进行会减小项目集合大小的读写操作。表中的其他项目集合不受此影响。

如需解决这一问题,您可以将超出 10GB 的集合中的项目删除或减少其中项目。此外,您可以将新项目引入新分区键值下,从而解决这一问题。如果表中包含不常访问的历史数据,可以考虑将此历史数据归档入 Amazon S3、Amazon Glacier 或另一数据存储空间。

问:如何扫描本地二级索引?

如需扫描本地二级索引,除您想要查询的表名称外,还须明确引用索引。您必须指定索引分区属性名称和值。您可以针对索引键排序属性选择性地指定条件。

您的扫描可检索主索引中存储的非投影属性,其方式为执行表提取操作,且其需要占用附加读取容量单位。

问:本地二级索引扫描是否允许我在要返回的结果集中指定非投影属性?

本地二级索引扫描将支持抓取非投影属性。

问:在本地二级索引扫描中,结果是怎么排列的?

对于本地二级索引,集合内的排序将根据索引属性的排序确定的。

安全和控制

问:什么是 DynamoDB 精细访问控制?

精细访问控制 (FGAC) 使 DynamoDB 表拥有者能对表中的数据进行高度控制。具体而言,表拥有者可以指定谁(发起人)可以访问表的哪些项目或属性,以及执行什么操作(读/写能力)。FGAC 与 AWS Identity and Access Management (IAM) 配合使用,后者可管理安全证书及相关的权限。

问:DynamoDB FGAC 的常用案例有哪些?

任何跟踪 DynamoDB 表中信息的应用程序都可以受益于 FGAC,在这些应用程序中,最终用户(或充当最终用户的应用程序客户端)需要直接读取或修改表,而不借助中间层服务。例如,开发人员开发了一款名为 Acme 的移动应用,他可以使用 FGAC 来跟踪 DynamoDB 表中每个 Acme 用户的最高分数。FGAC 仅允许应用程序客户端修改当前运行应用程序的用户的最高分数。

问:能否将细粒度访问控制用于 JSON 文档?

能。您可以使用细粒度访问控制 (FGAC) 根据文档中的顶级属性限制对数据的访问。您不能使用 FGAC 限制基于嵌套属性的访问。举例来说,假设您存储的 JSON 文档中包含关于人的下列信息:ID、名、姓氏及他们的所有好友列表。您可以使用 FGAC 限制基于 ID、名或姓氏的访问,但不能限制基于好友列表的访问。

问:不借助 FGAC,开发人员如何实现项目级别的访问控制?

要在不使用 FGAC 的情况下实现这一级别的控制,开发人员必须从几种可能很麻烦的方法中选择。其中的部分方法如下:

代理:应用程序客户端将请求发送到执行身份验证和授权的中介代理。这种解决方案会增加系统架构的复杂性并导致总拥有成本 (TCO) 更高。

客户端专用表:为每个应用程序客户端分配由其专用的表。由于各应用程序客户端访问的表都不同,它们可以相互不受干扰。这可能需要开发人员创建数百万个表,从而使数据库管理变得极为困难。

客户端专用嵌入令牌:在应用程序客户端中嵌入一个秘密令牌。这种方法的弊端是难于更换令牌和处理其对所存储数据的影响。这种情况下,可由此客户端访问的项目的键中会包含秘密令牌。

问:DynamoDB FGAC 如何工作?

使用 FGAC 时,应用程序会请求安全令牌,该令牌授权应用程序只能访问特定 DynamoDB 表中的特定项目。通过此令牌,最终用户应用程序代理可以直接向 DynamoDB 发出请求。收到请求后,传入请求的证书先由 DynamoDB 评估,DynamoDB 将使用 IAM 验证请求的身份并决定允许用户具有的能力。如果用户的请求未获允许,FGAC 将阻止对数据的访问。

问:DynamoDB FGAC 的费用是多少?

使用 FGAC 不收取任何额外费用。如往常一样,您只需为预配置的吞吐量和与 DynamoDB 表相关的存储付费。

问:如何开始使用?

请参考《DynamoDB Developer Guide》的 Fine-Grained Access Control 部分,了解如何创建访问策略、为应用创建 IAM 角色(例如为 Facebook app_id 34567 创建名为 AcmeFacebookUsers 的角色),以及为角色分配访问策略。角色的信任策略决定了接受哪些身份提供商(例如 Login with Amazon、Facebook 或 Google),访问策略描述了可以访问哪些 AWS 资源(例如 DynamoDB 表)。使用角色,您的应用现在即可通过调用 AWS Security Token Service (STS) 的 AssumeRoleWithIdentityRequest API 获得 DynamoDB 的临时证书。

问:如何允许用户查询本地二级索引,但阻止他们使表提取检索未投影的属性?

如果请求未投影到索引中的属性,有些对本地二级索引的查询操作比其他操作的费用更高。可以使用“dynamodb:Attributes”上下文键将权限限制为只允许访问已投影的属性,从而限制这种可能费用高昂的“提取”操作。

问:如何防止用户访问特定的属性?

要防止访问特定的属性,建议的方法是遵循最小权限原则,只允许访问特定的属性。

或者,您可以使用拒绝策略指定不允许访问的属性。但是不建议使用此方法,原因如下:

使用拒绝策略时,用户可能为发现隐藏的属性名而不断发出对每个可能的属性名的请求,直至用户最终被拒绝访问。

拒绝策略更容易受到影响,因为 DynamoDB 将来会引入新的 API 功能,这些功能也许会允许您以前想要阻止的访问模式。

问:如何阻止用户向表中添加无效数据?

可用的 FGAC 控件可以决定哪些项目受到更改或读取,以及可以更改或读取哪些属性。用户可以添加不具有被阻止的属性的新项目,也能对可修改的任何属性的任何值进行更改。

问:是否可以授权对多个属性的访问但不将其全部列出?

是的,IAM 策略语言支持多种比较运算,包括 StringLike、StringNotLike 及多种其他运算。有关其他详细信息,请参阅 IAM 策略参考。

问:如何创建合适的策略?

建议您使用 DynamoDB 控制台中的 DynamoDB 策略生成器。还可将您的策略与《Amazon DynamoDB Developer Guide》中列出的策略相比较,以确保符合建议的模式。您可以将策略发布到 AWS 论坛,看看 DynamoDB 社区中的其他人有什么想法。

问:我可以根据规范用户 ID 而不是用户登录的身份提供商为用户另外提供的 ID 来授予访问权限吗?

不运行“令牌售卖机”时不可以。如果用户通过 STS 使用 Facebook 证书直接获得对您 IAM 角色的联合访问权限,那这些临时证书只包含了关于该用户在 Facebook 登录的信息,而登录 Amazon 或 Google 的信息不在其中。如果您要将每一个这样的登录信息都映射到自己的稳定标识符并存储在内部,您可以运行一项服务(用户通过此项服务进行登录),然后调用 STS 并向用户提供凭证作为其规范用户 ID,凭证的作用域为您想到的任何分区键值。

问:哪些信息不能对使用 FGAC 的发起人隐藏?

目前,无法阻止发起人获知某些关于表中项目的信息:

项目集指标。发起人可以询问项目集中预计的项目数和以字节表示的大小。

使用的吞吐量。发起人可以询问操作所使用的预配置吞吐量的详细细分或汇总信息。

验证案例。某些情况下,在您未打算向其提供访问权限时,发起人可以了解表的存在情况和主键架构。要防止发生这种情况,请遵循最小权限原则,仅允许访问您打算批准访问的表和操作。

如果您拒绝对特定属性的访问,而不将对特定属性的访问权限列入白名单,执行“允许除例外项外所有”逻辑时,发起人理论上可以确定所隐藏属性的名称。改为将特定属性名称列入白名单会更为安全。

问: Amazon DynamoDB 是否支持 IAM 权限?

是,DynamoDB 将通过集成 AWS Identity and Access Management (IAM) 服务来支持 API 级别权限。

有关 IAM 的详细信息,请访问:

AWS Identity and Access Management

AWS Identity and Access Management 入门指南

使用 AWS Identity and Access Management

问:我希望对我的 DynamoDB 表执行安全分析或操作问题排查。我能否获取在我的账户上发起的所有 DynamoDB API 调用的历史记录?

可以。AWS CloudTrail 是一项 web 服务,为您的帐户记录 AWS API 调用并向您交付日志文件。由 AWS CloudTrail 生成的 AWS API 调用历史记录可用于安全分析、资源变更追踪以及合规性审计。有关针对 CloudTrail 的 DynamoDB 支持的详细信息可以在这里找到。在 AWS CloudTrail 详细信息页面了解更多有关 CloudTrail 的信息,或者通过 CloudTrail 的 AWS 管理控制台首页将它打开。

定价

问:什么是配置吞吐量?

使用 Amazon DynamoDB,您可以指定您希望表能够达到的请求吞吐量。该服务会在后台处理资源的配置,以达到请求的吞吐率。您无需考虑实例、硬件、内存以及其他可能影响吞吐率的因素,而只需要配置您希望达到的吞吐量级别。这就是该服务的配置吞吐量模型。

Amazon DynamoDB 允许您通过表的读取容量和写入容量单位,指定您的吞吐量需求。创建表的过程中,您可以指定需要的读取和写入容量需求,Amazon DynamoDB 将自动划分和保留适当数量的资源,以满足您的吞吐量要求。为了确定所需的读取和写入吞吐量值,应考虑您希望每秒执行的读取和写入数据层面 API 调用数量。如果在任何时候,您预计流量增长可能超过您的配置吞吐量,只需通过 AWS 管理控制台或 Amazon DynamoDB API,更新您的配置吞吐量值。随着需求减少,您也可以降低表的配置吞吐量值。在扩展吞吐量级别时,Amazon DynamoDB 始终保持可用。

问:主键的选择会如何影响我所能实现的可扩展性?

存储数据时,Amazon DynamoDB 会将表分为多个分区,并根据主键的分区键元素来分布数据。分配容量资源时,Amazon DynamoDB 在所有主键上采取一种相对随机的访问模式。您应该建立您的数据模型,以使您的请求产生的流量在各个主键之间分布非常均匀。如果表的少数几个分区键元素的访问量非常大,或者有单个分区键元素的使用量非常大,则流量将集中在少数几个分区上,甚至可能只集中在一个分区上。如果工作负载严重不平衡(即不成比例地集中在一个或几个分区上),则操作将无法达到的预置的总体吞吐量级别。为了充分利用 Amazon DynamoDB 吞吐量,应让表中的分区键元素具有大量不同的值,而且对这些值的请求应该非常均匀,越随机越好。例如,如果应用程序有很多客户,并且对各个客户记录所做的请求比较均匀,则 CustomerID 就是适合的主键。而“Product Category Name”就是一个严重不均衡的主键,因为其中的某些产品类别比其余类别更受欢迎。

问:什么是读取/写入容量单位?

如何估计应用程序所需的读取和写入容量单位数量?一个写入容量单位能支持您每秒对最大 1KB 的项目执行一次写入操作。同样,一个读取容量单位让您能够每秒对最大 4KB 的项目执行一次强一致性读取(或执行两次最终一致性读取)。更大的项目将需要更多容量。您可以通过以下方式计算需要的读取和写入容量单位数量,估算每秒需要执行的读取或写入次数,乘以项目的大小(进位到最接近的 KB)。

写入所需要的容量单位 = 每秒的项目写入量 x 1KB 块的项目大小

读取所需要的容量单位* = 每秒的项目读取量 x 4KB 块的项目大小

* 从每秒读取次数角度来看,如果您使用最终一致性读取,您会得到双倍的吞吐量。

如果项目的大小低于 1 KB,则每个读取容量单位将为您提供每秒一次的强一致性读取容量,每个写入容量单位将为您提供每秒一次写入的容量。例如,如果项目大小为 512 字节,您需要每秒从表中读取 100 个项目,则您需要预配置 100 个读取容量单位。

如果项目的大小高于 4 KB,则您应该计算所需的读取容量和写入容量的单位数量。例如,如果项目大小为 4.5KB,您希望每秒进行 100 次强一致性读取,则需要预配置 100(每秒读取次数)x 2(存储 4.5KB 所需的 4KB 块量)= 200 个读取容量单位。

请注意,需要的读取容量单位数量取决于每秒读取的项目数量,而不是 API 调用的数量。例如,如果您需要每秒从表中读取 500 个项目,而且这些项目大小为 4KB 或更小,则需要 500 个读取容量单位。无论您是进行 500 次单独 GetItem 调用,还是进行 50 次 BatchGetItem 调用并每次返回 10 个项目,都不会产生影响。

问:我始终都能达到配置吞吐量级别吗?

Amazon DynamoDB 在所有主键上采取一种相对随机的访问模式。您应该建立您的数据模型,以使您的请求产生的流量在各个主键之间分布非常均匀。如果访问模式非常不均匀或严重倾斜,则您将无法达到配置吞吐量级别。

存储数据时,Amazon DynamoDB 会将表分为多个分区,并根据主键的分区键元素来分布数据。与表关联的配置吞吐量也在多个分区之间划分,每个分区的吞吐量基于所分配的配额进行单独管理。配置吞吐量不在各个分区之间共享。因此,如果工作负载在分区键值之间分布得非常均匀,Amazon DynamoDB 中的表就能够最好地达到预置的吞吐量级别。在分区键值之间分布请求可将请求分布到各个分区,从而帮助您达到完整的预置吞吐量级别。

如果工作负载模式在主键之间分布不均匀,无法达到您的配置吞吐量级别,则您可以通过进一步提高配置吞吐量级别,为每个分区提供更高吞吐量,以满足吞吐量需求。但是,我们建议您考虑修改请求模式或数据模型,以实现主键之间的相对随机的访问模式。

问:如果我只检索 JSON 文档的某一个元素,是否会被收取整个项目的阅读费用?

会。阅读 DynamoDB 中的数据时,您消耗的是阅读整个项目所需的吞吐量。

问:我可以为单个 DynamoDB 表配置的最大吞吐量是多少?

DynamoDB 的设计旨在实现无限制扩展。但是,如果您希望单个表超过 10000 个写入容量单位或 10000 个读取容量单位的吞吐率,您必须首先填写此在线表格与 Amazon 联系。如果希望从单个订阅者账户预配置超过 20000 个写入容量单位或 20000 个读取容量单位,则您必须首先填写上述表格联系我们。

问:我可以为单个 DynamoDB 表配置的最小吞吐量是多少?

您可以请求的最小配置吞吐量为 1 个写入容量单位和 1 个读取容量单位。

这属于免费套餐的范围,后者允许使用 25 个写入容量单位和 25 个读取容量单位。这种免费套餐在账户级别而非表级别上适用。换言之,如果您将所有表的配置容量相加,总容量不超过 25 个写入容量单位和 25 个读取容量单位,则您的配置容量属于免费套餐范围。

问:我通过单次请求来更改配置吞吐量的幅度是否有限制?

您可以使用 UpdateTable API 以任意量提高表的配置吞吐量容量。例如,您可以通过一次 API 调用将表的配置写入容量从 1 个写入容量单位提高到 10000 个写入容量单位。您的账户仍会受限于表级和账户级容量限制,如文档页面所述。如果您需要提高您的配置容量限制,您可以访问我们的支持中心,单击“打开新案例”并提交服务限制提高申请。

问:如何对我的配置吞吐量收费?

每个 Amazon DynamoDB 表已经预配置了达到您请求的吞吐率所需的资源。只要您的表占用这些资源,即按小时费率计费。要获得完整价目表以及相关示例,请参阅 DynamoDB 定价页面。

问:如何更改现有 DynamoDB 表的配置吞吐量?

可以通过两种方式更新 Amazon DynamoDB 表的配置吞吐量。您可以在管理控制台中进行更改,也可以使用 UpdateTable API 调用进行更改。无论采用哪种方法,在配置吞吐量级别提高或降低时,Amazon DynamoDB 都将保持可用。

问:我多长时间可以更改一次配置吞吐量?

您可以随时提高配置吞吐量,但每天只能降低四次配置吞吐量。此处的“天”是根据 GMT 时区定义的。例如,如果您在 GMT 时间 12 月 12 日下午降低了四次配置吞吐量,则在 12 月 13 日上午 12:01 之前,您不能再次降低配置吞吐量。

请注意,如果 Amazon DynamoDB 表仍在响应您的上一个配置吞吐量更改请求的过程中,则不能再更改配置吞吐量。使用管理控制台或 DescribeTables API 可以查看表的状态。如果状态为“CREATING”、“DELETING”或“UPDATING”,则您将无法调节表的吞吐量。请等待表进入“ACTIVE”状态,然后重试。

问:一致性级别是否影响吞吐率?

是的。对于特定的资源分配,DynamoDB 表可以实现的读取速率在强一致性读取和最终一致性读取之间是不同的。如果您请求“1000 个读取容量单位”,DynamoDB 将分配足够的资源,以便对高达 4KB 的项实现每秒 1000 次强一致读取。如果您需要实现对最大 4KB 项目的每秒 1000 次的最终一致读取,则只需要一半的容量,即 500 个读取容量单位。有关为表选择适当吞吐率的更多指导,请参阅预配置吞吐量指南。

问:项目大小是否会影响吞吐率?

是的。对于特定的资源分配,DynamoDB 表可以达到的读取速率取决于项目的大小。当您指定希望达到的预配置吞吐量时,DynamoDB 会基于项目大小低于 4KB 的假设来预配置其资源。每增加 4KB,达到相同吞吐率所需的资源也会线性增加。例如,如果您为 DynamoDB 表预配置了 100 个读取容量单位,这意味着它每秒可以处理 100 个 4KB 读取操作、50 个 8KB 读取操作,或者 25 个 16KB 读取操作,依此类推。

与之类似,DynamoDB 表所能达到的写入速率取决于项目的体积。当您指定希望达到的预配置写入吞吐量时,DynamoDB 会基于项目大小低于 1KB 的假设来预配置其资源。每增加 1KB,达到相同吞吐率所需的资源也会线性增加。例如,如果您为 DynamoDB 表配置了 100 个写入容量单位,这意味着它每秒可以处理 100 个 1KB 写入操作、50 个 2KB 写入操作,或者 25 个 4KB 写入操作,依此类推。

有关为表选择适当吞吐率的更多指导,请参阅预配置吞吐量指南。

问:如果我的应用程序执行的读取或写入次数大于我的配置容量,会出现什么情况?

如果应用程序的每秒读取次数或每秒写入次数超出了表的配置吞吐量容量允许的范围,则超出配置容量的请求将被阻止,您将收到 400 错误代码。例如,如果您请求了 1000 个写入容量单位,并试图对 1KB 的项目每秒执行 1500 次写入,DynamoDB 将只允许每秒执行 1000 次写入,您的额外请求将收到错误代码 400。您应该使用 CloudWatch 来监控请求速率,以确保始终具有足够的配置吞吐量来达到您需要的请求速率。

问:我怎么知道是否超过了我的配置吞吐容量?

DynamoDB 以 CloudWatch 指标的形式公布您消耗的吞吐量容量。您可在该指标上设置警报,如果接近配置容量,您将会收到通知。

问:更改表的配置吞吐量级别需要多长时间?

一般而言,降低吞吐量需要的时间在几秒至几分钟之间,而提高吞吐量需要的时间通常在几分钟至几小时之间。

我们强烈建议,不要在需要额外吞吐量时才设法增加吞吐量。我们建议您提前配置足够的吞吐量容量,以确保在需要时能够获得容量。

预留容量

问:是否可以将预留容量从一个地区转移到另一个?

不可以。预留容量是与一个地区关联的。

问:是否可以调配比预留容量更高的吞吐量?

是的。当那您购买预留容量时,即表示您同意最低使用等级,并以折扣后的费率支付该使用等级的费用。如果您调配的容量比该最低等级多,则将按标准费率支付超出部分的费用。

问:如何使用我的预留容量?

预留容量会自动应用到您的账单。例如,如果您购买了 100 个写入容量单位的预留容量,并且调配了 300 个,那么,您的预留容量购买将自动包含 100 个写入单位,而您将按标准费率支付剩下的 200 个写入容量单位的费用。

问:如果我调配的吞吐量少于预留容量,会出现什么情况?

预留容量购买是同意在协议有效期内购买最低调配吞吐量的协议,以获得折扣定价。如果您使用量少于预留容量,将仍需支付该最低调配吞吐量的费用。

问:是否可以将我的预留容量用于多个 DynamoDB 表?

是的。预留容量适用于您购买预留容量的地区内的总调配容量。例如,如果您购买了 5 000 个写入单位的预留容量,则可以将其应用到单个写入容量为 5 000 个单位的表,或者 100 个写入容量为 50 个单位的表,或者 1 000 个写入容量为 5 个单位的表,等等。

问:DynamoDB 是否会将预留容量应用到整合账单账户?

是的。如果您具有多个与整合账单关联的账户,则您在付款人账户级别或关联账户级别购买的一定单位数量的预留容量将由与付款人账户相关联的所有账户共享。预留容量首先应用到购买它的账户,然后,剩余的未使用容量将应用到其他关联账户。

DynamoDB 跨区域复制

问:DynamoDB 跨区域复制是什么?

答:借助 DynamoDB 跨区域复制,您可以在一个或多个 AWS 区域中维护 DynamoDB 表格(称为“主表格”)的完全相同副本(称为“副本”)。为表格启用跨区域复制后,您可以在其他 AWS 区域中创建表格的完全相同副本。在表格中写入的内容会自动传播到所有副本。

问:何时应使用跨区域复制?

答:在下列情况下,您可以使用跨区域复制。

提高灾难恢复的效率:通过将表格复制到多个数据中心,您可以在一个数据中心出现故障时,切换为使用另一个区域的 DynamoDB 表格。

加快读取速度:如果您的客户位于多个区域,则可以通过读取最近 AWS 数据中心内的 DynamoDB 表格,更快速地提供数据。

简化流量管理:您可以使用副本跨表格分配读取工作负载,从而降低主表格占用的读取容量。

便于区域迁移:通过在新区域中创建只读副本,然后将此副本晋升为主表格,您可以更轻松地将您的应用程序迁移到相应区域中。

实时数据迁移:要将 DynamoDB 表格从一个区域移至另一个区域,您可以在目标区域中创建源区域中的表格的副本。当表格同步后,您可以将您的应用程序切换为写入目标区域。

问:支持什么跨区域复制模式?

答:目前,跨区域复制支持单主模式。单主模式是指有一个主表格以及一个或多个副本表格。

问:如何为表格设置单主模式的跨区域复制?

您可以使用 DynamoDB 跨区域复制库创建跨区域副本。

问:我怎样才能知道引导启动 bootstrapping 何时完成?

答:在复制管理应用程序上,复制状态会从“引导启动 bootstrapping”变为“活动”。

问:对于单主表格,我能否拥有多个副本?

答:能。单主表格的副本表格数量没有限制。系统会为每个副本表格创建一个 DynamoDB 流读取程序,这些读取程序会复制主表格中的数据,从而确保副本保持同步。

问:为表格设置跨区域复制需要支付多少费用?

DynamoDB 跨区域复制使用 DynamoDB 跨区域复制库启用。尽管跨区域复制库没有额外费用,但您需要为该流程使用的下列资源支付常规价格。您需要为以下事项支付费用:

预置吞吐量(写入和读取)以及副本表格的存储空间。

跨区域传输数据。

读取 DynamoDB 流中的数据,以确保各表格保持同步。

预配置为托管复制流程的 EC2 实例。实例的费用取决于您所选择的实例类型以及实例的托管区域。

问:托管跨区域复制的 Amazon EC2 实例在哪个区域运行?

答:托管跨区域复制应用程序的 Amazon EC2 实例位于跨区域复制应用程序最初启动所在的区域。您需要按照此区域的实例价格支付费用。

问:Amazon EC2 实例是否随主表格和副本表格的大小和吞吐量变化而自动扩展?

答:我们暂无法自动扩展 EC2 实例。您需要在配置 DynamoDB 跨区域复制时选择实例大小。

问:如果管理复制的 Amazon EC2 实例发生故障,会出现什么情况?

答:Amazon EC2 实例是在 Auto Scaling 组的后面运行。也就是说,应用程序会将故障自动转移到其他实例。底层应用程序使用 Kinesis 客户端库 (KCL),可以对副本执行检查点操作。如果实例发生故障,则应用程序会了解要去查找检查点,并从检查点恢复。

问:创建只读副本期间,能否继续使用我的 DynamoDB 表格?

答:能。创建副本是一项在线操作。创建只读副本期间,您的表格仍可以执行读取和写入操作。引导启动 bootstrapping 使用扫描操作复制源表格中的内容。我们建议为表格预配置足够的读取容量单位,以支持扫描操作。

问:创建一个副本需要多长时间?

答:最初从主表格到副本表格的复制时间取决于主表格的大小、主表格和副本表格的预置容量。将主表格上的项目级变化传播到副本表格的时间取决于主表格和副本表格上的预置容量,以及运行复制应用程序的 Amazon EC2 实例的大小。

问:如果我更改了主表格上的预置容量,那么副本表格上的预置容量也会随之更新吗?

答:在您创建复制后,主表格上的任何预置容量变化都不会更新副本表格的吞吐容量。

问:副本表格的索引是否与主表格相同?

答:如果您选择通过复制应用程序创建副本表格,则主表格上的二级索引不会自动创建在副本表格上。复制应用程序不会将主表格的二级索引变化传播到副本表格中。您必须通过 AWS 管理控制台添加/更新/删除各个副本表格上的索引,就像处理常规 DynamoDB 表格一样。

问:副本的预置的吞吐容量是否与主表格相同?

答:我们建议您在创建副本表格时,至少预配置与主表格相同的写入容量,以确保副本表格有足够的容量来处理传入的所有写入操作。您可以在适合您应用程序的任意级别,设置副本表格的预置的读取容量。

问:副本表格的一致性模型是什么?

答:副本为异步更新。DynamoDB 会将主表格接受的写入操作确认为成功的写入操作。然后,写入操作会传播到各个副本。也就是说,写入操作传播到所有副本表格中之前会略有延迟。

问:跨区域复制是否有 CloudWatch 指标?

答:CloudWatch 指标适用于所有复制配置。您可以选择复制组,然后转到“监控”选项卡查看指标。您可以查看吞吐量和已处理的记录数的相关指标,并能监控主表格和副本表格之间的任何吞吐量差异。

问:我能否在主表格所在区域拥有副本表格?

答:能。只要副本表格与主表格不同名,就可以位于同一区域中。

问:我能否在创建复制组后添加或删除副本?

答:能。您可以随时向复制组添加副本或从中删除副本。

问:我能否在创建副本组之后将其删除?

答:能。删除复制组也会删除此组的 EC2 实例。不过,您必须删除 DynamoDB 元数据表格。

DynamoDB 触发器

问:DynamoDB 触发器是什么?

答:借助 DynamoDB 触发器这项功能,您可以根据 DynamoDB 表格上的项目级更新执行自定义操作。您可以在代码中指定自定义操作。

问:DynamoDB 触发器有何用途?

答:DynamoDB 触发器非常适用于多个应用场景。一些使用案例包括发送通知、更新聚合表格以及将 DynamoDB 表格连接到其他数据源。

问:DynamoDB 触发器的工作原理是什么?

答:DynamoDB 触发器的自定义逻辑以代码形式存储在 AWS Lambda 函数中。要为给定表格创建触发器,您可以关联 AWS Lambda 函数和 DynamoDB 表格上的流(通过 DynamoDB 流)。当表格更新时,更新便会发布到 DynamoDB 流中。相应地,AWS Lambda 会从关联的流中读取更新,并执行函数中的代码。

问:使用 DynamoDB 触发器需要支付多少费用?

答:使用 DynamoDB 触发器,您只需按 AWS Lambda 函数的请求数和执行时间支付费用。请单击此处,详细了解 AWS Lambda 定价。您无需为 AWS Lambda 函数对与表格相关联的流(通过 DynamoDB 流)执行的读取操作支付费用。

问:表格触发器的数量是否有限制?

答:表格触发器的数量没有限制。

问:DynamoDB 触发器支持什么语言?

目前,DynamoDB 触发器支持用 JavaScript、Java 和 Python 编写触发 器函数。

问:创建、编辑或删除 DynamoDB 触发器能否获得 API 支持?

答:不能。暂无用于创建、编辑或删除 DynamoDB 触发器的原生 API。您必须使用 AWS Lambda 控制台创建 AWS Lambda 函数,并将其与 DynamoDB 流中的某个流关联。有关详细信息,请参阅 AWS Lambda 常见问题页面。

问:如何创建 DynamoDB 触发器?

答:创建触发器的具体方法是,创建一个 AWS Lambda 函数,然后将此函数的事件源与 DynamoDB 流中的某个流相关联。有关详细信息,请参阅 AWS Lambda 常见问题页面。

问:如何删除 DynamoDB 触发器?

答:您可以通过删除关联的 AWS Lambda 函数来删除触发器。可以通过 AWS Lambda 控制台或 AWS Lambda API 调用删除 AWS Lambda 函数。有关详细信息,请参阅 AWS Lambda 常见问题页面和文档页面。

问:我现有一个 AWS Lambda 函数,如何创建使用此函数的 DynamoDB 触发器?

答:您可以将 AWS Lambda 函数的事件源更改为指向 DynamoDB 流中的某个流。为此,您可以使用 DynamoDB 控制台。在启用流的表格中,依次选择相应的流和“关联 Lambda 函数”按钮,然后在 Lambda 函数列表中选择要用于 DynamoDB 触发器的函数。

问:DynamoDB 触发器的可用区域是什么?

答:DynamoDB 触发器在 AWS Lambda 和 DynamoDB 的所有可用 AWS 区域可用。

DynamoDB 流

问:DynamoDB 流是什么?

答:DynamoDB 流中按时间顺序排列出过去 24 小时内表格中的项目级数据变化。您可以使用简单的 API 调用访问流,并能使用流不断更新其他数据存储,确保其与 DynamoDB 最新变化保持同步,也可以使用流根据您表格的变化采取措施。

问:DynamoDB 流有何优势?

使用 DynamoDB 流 API,开发人员可以使用更新并接收项目变化前后的项目级数据。您还可以用它为在 DynamoDB 上构建的应用程序构建创新型扩展。例如,使用 DynamoDB 构建全球多人游戏时,开发人员可使用 DynamoDB 流 API 构建多主机拓扑结构,并通过使用各主机的 DynamoDB 流和重放远程主机中的更新来确保各主机保持同步。再例如,开发人员可使用 DynamoDB 流 API 构建移动应用程序,从而在用户上传新自拍时,尽快自动发送通知到朋友圈中所有好友的移动设备上。开发人员还可以使用 DynamoDB 流,确保 Amazon Redshift 等数据仓库工具与 DynamoDB 表的所有变化保持同步,从而启用实时分析。DynamoDB 还与使用 Amazon DynamoDB Logstash 插件的 Elasticsearch 集成,以便开发人员能够添加 DynamoDB 内容的自由文本搜索功能。

问:我的 DynamoDB 表的更改可通过 DynamoDB Streams 提供多久?

DynamoDB Streams 会将表的所有更改记录 24 小时。在此之后,它们将被擦除。

问:如何启用 DynamoDB Streams?

答:必须逐个表格启用 DynamoDB 流。要为现有的 DynamoDB 表启用 DynamoDB 流,请通过 AWS 管理控制台选择相应表格,选择“Overview”选项卡,单击“Manage Stream”按钮,选择某个视图类型,然后单击“Enable”。

问:如何确认 DynamoDB 流是否已启用?

答:启用 DynamoDB 流后,您可以在 AWS 管理控制台中看到相应的流。依次选择您的表格和“Overview”选项卡。在“Stream”详情下,确认“Stream”启用已设置为“Yes”。

问:我如何才能访问 DynamoDB 流?

答:您可以使用 DynamoDB SDK 或 Kinesis 客户端库 (KCL) 通过简单的 API 调用访问 DynamoDB 流中的流。KCL 可帮助您使用和处理流中的数据,还能帮助您管理各种任务,如在多个读取程序之间进行负载均衡、响应实例故障,以及对已处理的记录执行检查点操作。

问:DynamoDB Streams 是否按顺序显示我的 DynamoDB 表的所有更新?

任何单个项目的更改将以正确的顺序显示。不同项目的变化在 DynamoDB 流中的显示顺序可能不同于它们的接收顺序。

例如,假设您有一个跟踪游戏最高得分的 DynamoDB 表格,且此表格中的每个项目均代表一个玩家。如果您按如下顺序进行了以下三项更新:

更新 1:将玩家 1 的最高分改为 100 分

更新 2:将玩家 2 的最高分改为 50 分

更新 3:将玩家 1 的最高分改为 125 分

更新 1 和更新 3 更改的是同一个项目(玩家 1),因此 DynamoDB 流会在更新 1 之后显示更新 3。这样,您就可以检索每个玩家最新的最高得分。流可能不会以同样的顺序(即,更新 2 在更新 1 和更新 3 之间进行)显示所有这三项更新,但每位玩家记录的更新会以正确的顺序显示。

问:我是否需要管理 DynamoDB 流中某个流的容量?

答:不需要。DynamoDB 流会自动管理流的容量。如果您大幅增加 DynamoDB 表格的流量,则 DynamoDB 会自动调节流的容量,使其能够继续接受所有更新。

问:我能以何种速率读取 DynamoDB 流中的内容?

答:您最高能以 DynamoDB 表格的预置写入容量的两倍速率从您在 DynamoDB 流中的流读取更新。例如,如果您预配置了足够的容量,以便在您的 DynamoDB 表格中每秒更新 1000 个项目,则您每秒最多可以从流中读取 2000 个更新。

问:如果我删除了 DynamoDB 表格,DynamoDB 流中的流是否也会随之删除?

答:不,不会立即删除。DynamoDB 流中的流会存续 24 个小时,以便您可以读取表格的最后更新。24 小时后,流便会自动从 DynamoDB 流中删除。

问:如果我为表格关闭 DynamoDB 流,会出现什么情况?

答:如果您关闭 DynamoDB 流,则流会存续 24 小时,但不会更新您的 DynamoDB 表格的其他任何变化。

问:如果我关闭了 DynamoDB Streams 后再将它重新打开,将发生什么?

如果您关闭 DynamoDB Streams,数据流将存续 24 小时,但不会更新您的 DynamoDB 表的任何其他更改。如果您重新打开 DynamoDB 流,则会在 DynamoDB 流中新建一个流,其中包含您的 DynamoDB 表格从新流创建之时起的变化。

问:DynamoDB 流中是否有重复或缺漏?

答:否。DynamoDB 流旨在将您表格的所有更新一次性准确地反映在流中。

问:DynamoDB 流中包含什么信息?

答:DynamoDB 流中包含项目变化前后的值信息。流还包含变化类型(INSERT、REMOVE 和 MODIFY)以及发生变化的项目的主密钥。

问:如何选择在 DynamoDB 流中添加的信息?

答:对于新表格,请使用 CreateTable API 调用,并指定 ViewType 参数来选择要在流中添加的信息。

对于现有表格,请使用 UpdateTable API 调用,并指定 ViewType 参数来选择要在流中添加的信息。

ViewType 参数会使用以下值:

ViewType: {

{ KEYS_ONLY,

NEW_IMAGE,

OLD_IMAGE,

NEW_AND_OLD_IMAGES}

}

这些值的含义如下:KEYS_ONLY:只在流中添加发生变化的项目的密钥名称。

NEW_IMAGE:在流中添加更新后的项目(新项目)的密钥名称和项目名称。

OLD_IMAGE:在流中添加更新前的项目(旧项目)的密钥名称和项目名称。

NEW_AND_OLD_IMAGES:在流中添加更新前的项目(旧项目)和更新后的项目(新项目)的密钥名称和项目名称。

问:我能否使用 Kinesis 客户端库访问 DynamoDB 流?

答:能。熟悉 Kinesis API 的开发人员能够轻松使用 DynamoDB 流。您可以使用执行 Amazon Kinesis 界面的 DynamoDB Streams 适配器,从而使您的应用程序能够使用 Amazon Kinesis 客户端库 (KCL) 访问 DynamoDB Streams。有关使用 KCL 访问 DynamoDB Streams 的更多信息,请参阅我们的文档。

问:我能否更改 DynamoDB 流所含信息的类型?

答:如果您想在创建流后更改其中存储的信息的类型,则必须禁用此流,然后使用 UpdateTable API 新建一个流。

问:在我更改 DynamoDB 表格后,此更改最快要多久才能反映在 DynamoDB 流中?

答:一般来说,更改不到 1 秒即可反映在 DynamoDB 流中。

问:如果我删除了一个项目,此更改是否会反映在 DynamoDB 流中?

答:是的。DynamoDB 流中的每个更新都包含一个参数,用于指定更新是删除项目、插入新项目还是修改现有项目。要详细了解更新类型,请参阅我们的文档。

问:在为表格启用 DynamoDB 流后,我何时才能开始读取流中的内容?

答:您可以使用 DescribeStream API 获取流的当前状态。当状态变为“已启用”后,表格的所有更新都会反映在流中。

您可以一开始创建流就开始读取其中内容,但在状态变为“已启用”之前,流可能不会包含表格的所有更新。

问:Elasticsearch 的 Amazon DynamoDB Logstash 插件是什么?

Elasticsearch 是一种常用的开源搜索和分析引擎,用于简化实时搜索和大数据分析。Logstash 是一种开源数据管道,可与 Elasticsearch 一起运行,帮助您处理日志和其他事件数据。借助 Amazon DynamoDB Logstash 插件,您可以非常轻松地将 DynamoDB 表与 Elasticsearch 集群集成。

问:Amazon DynamoDB Logstash 插件的费用情况如何?

您可以免费下载和使用 Amazon DynamoDB Logstash 插件。

问:如何下载和安装 Amazon DynamoDB Logstash 插件?

您可以从 GitHub 上下载 Amazon DynamoDB Logstash 插件。请阅读我们的文档页面,详细了解如何安装和运行此插件。

DynamoDB Storage Backend for Titan

问:什么是 DynamoDB Storage Backend for Titan?

DynamoDB Storage Backend for Titan 是一款插件,让您可以将 DynamoDB 用作 Titan 图形数据库的基础存储层。这是一种用于实施无索引邻接的客户端解决方案,便于您对 DynamoDB 数据库进行快速图形遍历。

问:什么是图形数据库?

图形数据库就是用于存储顶点以及连接这些顶点的指向边缘的存储区。这些顶点和边缘都具有可存储为键值对的属性。

图形数据库使用邻接列表来存储边缘,因此能够实现简单遍历。图形数据库中的图形可依据具体的边缘类型进行遍历,或者也可对整个图形进行遍历。图形数据库可以通过使用操作、所有权和父项关系等来表示实体之间的关联关系。

问:哪些应用程序适合使用图形数据库?

如果实体间的连接或关系是您正在尝试建模的数据核心,那就适合使用图形数据库。因此,图形数据库对于建模和查询社交网络、业务关系、依赖关系和货物移动等非常有用。

问:如何才能开始使用 DynamoDB Storage Backend for Titan?

最简单的使用方法为,使用本文档页面中提及的 CloudFormation 模板,将运行 Gremlin 服务器的 EC2 实例与 DynamoDB Storage Backend for Titan 一同启动。您还可以按照此处的文档说明,在自己的计算机上按照《Marvel and Graph-Of-The-Gods》教程克隆 GitHub 资源库中的项目并予以启动。当您准备扩展测试或在生产环境下运行时,您可以将后端切换为使用 DynamoDB 服务。请查看 AWS 文档了解更多详情。

问:DynamoDB 存储后端与其他 Titan 存储后端有何不同之处?

DynamoDB 是一项托管服务,因此您可以使用它作为 Titan 存储后端来运行图形工作负载,而无需管理自己的图形存储集群。

问:DynamoDB Storage Backend for Titan 是不是一项完全托管的服务?

不是。DynamoDB Storage Backend for Titan 负责管理 Titan 工作负载的存储层。但是,此插件不会对客户端进行预配置和管理。为了简单地预配置 Titan,我们开发了 CloudFormation 模板,该模板使用 Gremlin 服务器来设置 DynamoDB Storage Backend for Titan。请参阅此处提供的说明。

问:使用 DynamoDB Storage Backend for Titan 的费用是多少?

我们将向您收取正常的 DynamoDB 吞吐量和存储费用。使用 DynamoDB 作为 Titan 图形工作负载的存储后端无需支付额外的费用。

问:DynamoDB 后端是否会与其他后端上的 Titan 功能集完全兼容?

有关不同 Titan 存储后端的功能集的比较表,请参阅此处的文档。

问:此插件将支持哪些版本的 Titan?

我们已推出了 0.5.4 和 1.0.0 版的 DynamoDB Storage Backends for Titan 插件。

问:我目前将 Titan 和其他后端一起使用。我是否可以迁移至 DynamoDB?

绝对可以。DynamoDB Storage Backends for Titan 采用的是 Titan KCV 存储界面,因此您可以从其他存储后端切换至 DynamoDB,且只需对应用程序进行少量更改。有关适用于 Titan 的存储后端的完整比较,请参阅我们的文档。

问:我目前将 Titan 和其他后端一起使用。我该如何迁移至 DynamoDB?

您可以使用批量加载将图形从一个存储后端复制至 DynamoDB Storage Backend for Titan。

问:我如何通过插件将 Titan 实例连接至 DynamoDB?

如果您使用已安装的 DynamoDB Storage Backend for Titan 创建图形和 Gremlin 服务器实例,则只需向默认 AWS 证书提供程序链提供委托人/证书集即可连接至 DynamoDB。这可以通过主文件夹中的 EC2 实例配置文件、环境变量或证书文件来完成。最后,您需要选择要连接的 DynamoDB 终端节点。

问:使用 DynamoDB Storage Backend for Titan 时,数据的耐用性如何?

使用 DynamoDB Storage Backend for Titan 时,数据将受到 DynamoDB 的强有力保护,这是因为 DynamoDB 基于 Amazon 稳定可靠且高度可用的数据中心运行。该服务在 AWS 区域的三个设施上复制数据,以便在发生服务器故障或可用区域运行中断时能够提供容错保护。

问:DynamoDB Storage Backend for Titan 的安全性如何?

DynamoDB Storage Backend for Titan 将图形数据存储在多个 DynamoDB 表中,因此享有和所有 DynamoDB 工作负载一样高的安全性。精细访问控制、IAM 角色和 AWS 委托人/证书集会控制对 DynamoD 表及表中项目的访问。

问:DynamoDB Storage Backend for Titan 如何扩展?

DynamoDB Storage Backend for Titan 的扩展方式与任何其他 DynamoDB 工作负载的扩展方式一样。您随时都可以选择提高或降低所需的吞吐量。

问:我的图形可以包含多少个顶点和边缘?

当您使用多项目模型进行边缘存储时,您将受到 Titan 限值 (2^60) 的限制,这一数字代表了图形的最大边缘数及其一半的顶点数。如果您使用的是单项目模型,则可以在特定外顶点键值中存储的边缘数量将受到 DynamoDB 最大项目大小(当前为 400kb)的限制。

问:我的顶点和边缘属性可以为多大?

多项目模型中的所有边缘属性总和不得超过最大项目大小 (400kb)。在多项目模型中,每个顶点属性最高可达 400kb。在单项目模型中,总项目大小(包括顶点属性、边缘属性和边缘)不得超过 400kb。

问:具有多少种数据模型?它们有哪些不同之处?

DynamoDB Storage Backend for Titan 有两种不同的存储模型:单项目模型和多项目模型。在单项目存储模型中,顶点、顶点属性和边缘存储在一个项目中。在多项目数据模型中,顶点、顶点属性和边缘则存储在不同项目中。上述两种情况下,边缘属性将存储在边缘所对应的相同项目中。

问:我应使用哪种数据模型?

通常,我们建议您针对边缘存储和图形索引表使用多项目数据模型。否则,您就需要限制可以针对一个外顶点的边缘/顶点属性的数量,或者限制可以在图形索引的特殊属性名称值对中进行索引的实体数量。通常情况下,您可以在 Titan 版本 0.5.4 和 1.0.0 中针对其他 4 KCV 存储使用单项目数据模型,因为它们所存储的项目大小通常小于 400KB。有关 Tian 插件在 DynamoDB 中创建的表的完整列表,请参阅此处。

问:我是否必须为 Titan 图形数据库创建架构?

Titan 支持自动式创建,以便新的边缘/顶点属性和标签能在首次使用时随即注册(请参阅此处提供的详细信息)。默认情况下,将使用 Gremlin 结构(边缘标签 = MULTI,顶点属性 = SINGLE)。

问:我是否可以更改 Titan 图形数据库的架构?

可以。但是,您无法更改现有顶点/边缘属性和标签的架构。有关详细信息,请参阅此处。

问:DynamoDB Storage Backend for Titan 如何处理超级节点?

DynamoDB 通过对顶点标签进行分区来处理超级节点。如果您在创建管理系统时将顶点标签定义为分区,则可以在边缘存储表中根据分区-排序键值空间的不同分区键值输入边缘和超出顶点的顶点属性的不同子集。当您的边缘存储拥有多个物理分区时,这通常会导致虚拟顶点标签分区将存储在不同物理 DynamoDB 分区中。要估算为边缘存储表提供支持的物理分区的数量,请参阅文档中的指南。

问:DynamoDB Storage Backend for Titan 是否支持批量图形操作?

支持。DynamoDB Storage Backend for Titan 将通过蓝图批量图形实施和 Titan 的批量加载配置选项,为批量图形操作提供支持。

问:DynamoDB Storage Backend for Titan 是否支持事务?

DynamoDB Storage Backend for Titan 支持乐观锁定。这意味着,DynamoDB Storage Backend for Titan 可以根据所述“键列”对或“键值”的现有值,有条件地写入单个“键列”对(位于多项目模型中)或单个键值(位于单项目模型中)。

问:我是否可以在一个区域中存储 Titan 实例,然后在另一区域中访问 DynamoDB?

您可以在 EC2 Titan 实例以外的其他区域访问 DynamoDB 终端节点,但不推荐这样做。在 EC2 范围外运行 Gremlin 服务器时,我们建议连接至 EC2 实例区域的 DynamoDB 终端节点,以便降低跨区域请求的延迟影响。我们还建议在 VPC 下运行 EC2 实例以提高网络性能。CloudFormation 模板将为您执行这一整串配置。

问:我是否可以将此插件与其他 DynamoDB 功能(如更新流和跨区域复制)结合使用?

您可以将跨区域复制和 DynamoDB 流功能结合使用,以便在其他区域中创建图形表的只读副本。

DynamoDB CloudWatch 指标

问:Amazon DynamoDB 是否会报告 CloudWatch 指标?

会,Amazon DynamoDB 将报告数个表格级别的 CloudWatch 指标。您可以根据这些指标,制定有关 Amazon DynamoDB 表格的操作决策并采取特定措施(如设置警报)。有关报告指标的完整列表,请参阅文档的使用 CloudWatch 监控 DynamoDB 部分。

问:我如何从 Amazon DynamoDB 表格中查看 CloudWatch 指标?

在 Amazon DynamoDB 控制台上,选择想要在其中查看 CloudWatch 指标的表格,然后选择“指标”选项卡。

问:多久报告一次指标?

大多数用于 Amazon DynamoDB 的 CloudWatch 指标将每隔 1 分钟报告一次,其他指标将每隔 5 分钟报告一次。有关更多详细信息,请参阅文档的使用 CloudWatch 监控 DynamoDB 部分。

Tagging for DynamoDB

问:什么是标签?

标签是您为 AWS 资源分配的标记。每个标签都由您可以定义的键和值组成。AWS 使用标签作为一种机制,据此整理成本分配报告中的资源成本。有关标记的更多信息,请参阅 AWS 账单和成本管理用户指南。

问:可标记哪些 DynamoDB 资源?

您可以标记 DynamoDB 表。与已标记的表关联的本地二级索引和全局二级索引会自动标有相同的标签。本地二级索引和全局二级索引的成本将显示在用于相应 DynamoDB 表的标签下。

问:为什么应该使用 Tagging for DynamoDB?

您可以将 Tagging for DynamoDB 用于成本分配。通过将标签用于成本分配,您可以标记 DynamoDB 资源以根据项目或其他条件轻松跟踪相应成本,从而反映您自己的成本结构。

问:如何将标签用于成本分配?

您可以使用成本分配标签对 AWS 成本进行分类和跟踪。AWS 成本管理器和详细账单报告支持按标签细分 AWS 成本。通常情况下,客户会使用业务标签 (例如成本中心/业务部门、客户或项目) 来将 AWS 成本与传统成本分配维度关联起来。不过,成本分配报告中可以包含任何标签。这使您可以轻松将成本与技术或安全维度 (例如特定应用程序、环境或合规性项目) 关联起来。

问:如何查看分配给 AWS 标记资源的成本?

您可以通过成本管理器或成本分配报告查看分配给 AWS 标记资源的成本。

成本管理器是一款免费的 AWS 工具,您可以用其查看过去长达 13 个月的成本,并预测未来 3 个月可能需要花费的成本。您可以按“标签”进行筛选并选择标签键和值 (如果没有指定标签值,则选择“无标签”) 来查看特定标签的成本。

成本分配报告包括您每个账单周期的所有 AWS 成本。该报表包括标记和未标记资源,因此您可以清晰地排列资源费用。例如,如果您用某个应用程序名称作为多个资源的标签,则可以跟踪在这些资源上运行的单个应用程序的总成本。有关成本分配的更多信息,请参阅 AWS 账单和成本管理用户指南。

问:是否可以标记 DynamoDB Streams 使用量?

不可以。目前无法标记 DynamoDB Streams 使用量。

问:预留容量使用量是否会显示在我的账单中的表标签下?

会。每个表的 DynamoDB 预留容量费用将显示在相关标签下。请注意,预留容量基于先到先得的原则跨所有关联 AWS 账户应用于 DynamoDB 使用量。这意味着,即使您每月各个表和索引的 DynamoDB 使用量相似,每个标签的成本分配报告仍然可能存在差异,这是因为预留容量将基于 DynamoDB 资源的计量顺序进行分发。

问:数据使用费用是否会显示在我的账单中的表标签下?

不会。DynamoDB 数据使用费用没有标签。这是因为数据使用量是在账户级别而不是表级别计费的。

问:标签是否需要值属性?

不需要。标签值可以为空。

问:标签区分大小写吗?

区分。标签键和值要区分大小写。

问:可为一个 DynamoDB 表添加多少标签?

您最多可为一个 DynamoDB 表添加 50 个标签。前缀为“aws:”的标签不可以手动创建,且不会计入每项资源的标签数量限制。

问:是否可以将标签以回溯方式应用于 DynamoDB 表?

不可以。标签自应用之日开始整理和跟踪数据。如果您在 1 月 1 日创建了一个表,直到 2 月 1 日才为它指定一个标签,那么此表在 1 月的所有使用情况将保留为未标记状态。

问:如果在当月结束之前将某个标签从 DynamoDB 表中移除,该标签是否仍会在我的账单中显示?

如果您针对在特定时间段内跟踪到的开支情况创建了报告,则您的成本报告将显示在该时间段内标记的资源的成本。

问:删除 DynamoDB 表后,现有标签会出现什么情况?

删除 DynamoDB 表后,其标签将自动移除。

问:如果添加的标签的键与某个现有标签的键相同,会出现什么情况?

每个 DynamoDB 表最多只能有一个键与其他标签的键相同的标签。如果您添加的标签的键与现有标签的键相同,则现有标签的值将更新。

DynamoDB Time-to-Live (TTL)

问:什么是 DynamoDB Time-to-Live (TTL)?

DynamoDB Time-to-Live (TTL) 是一种机制,让您可以设置特定的时间戳,以便从表中删除过期项目。如果时间戳过期,那么相应项目将被标记为“已过期”,并在随后从表中删除。通过使用此功能,您无需再跟踪过期数据并手动将其删除。TTL 可以帮助您减少存储使用量,并降低不再关联的数据的存储成本。

问:为何需要使用 TTL?

TTL 主要用于两个场景:

删除不再关联的旧数据,例如事件日志、使用历史记录、会话数据等。尽管存储在系统中的旧数据可能不再关联,但堆积起来仍会随着时间的推移而变得过于庞大。在这种情况下,您最好从系统中清除这些陈旧的记录,以便节省用于存储这些记录的成本。

有时,为了遵守您的数据保留和管理策略,您可能希望将数据在 DynamoDB 中保留指定的一段时间。在义务期限届满后,您可能想要最终删除这些数据。但请您了解,TTL 会尽力确保有额外的吞吐量供其他关键操作使用。DynamoDB 的目标是在两天内删除过期项目,但实际花费的时间可能更长,具体取决于数据的大小。

问:DynamoDB TTL 的工作原理是什么?

要为表启用 TTL,请首先确保此表具有可以存储表中每个项目的到期时间戳的属性。时间戳必须采用纪元时间格式,这有助于避免客户端和服务器之间的时区差异。

DynamoDB 运行着一个用于监控所有项目的后台扫描器。如果时间戳已过期,则该进程会将相应项目标记为“已过期”,并将其存入队列以待后续删除。

注意:TTL 需要使用纪元格式时间戳填充的数字 DynamoDB 表属性来指定数据的过期条件。为 TTL 属性设置值时应小心,因为错误的值可能会导致提前删除项目。

问:如何指定 TTL?

要指定 TTL,请首先在表上启用 TTL 设置,并指定要用作 TTL 值的属性。在向表中添加项目时,如果您希望 DynamoDB 在项目到期后自动将其删除,可以指定 TTL 属性。这个值就是到期时间,采用纪元时间格式表示。DynamoDB 会负责其余的工作。TTL 可通过控制台中表的概览选项卡进行指定。或者,开发人员也可以调用 TTL API 在表上配置 TTL。请参阅我们的文档和 API 指南。

问:可以在现有表上设置 TTL 吗?

可以。如果已经创建了一个表,且该表具有可用作其项目的 TTL 的属性,则您只需为该表启用 TTL 并为 TTL 指定适当的属性即可。如果该表没有可用于 TTL 的属性,则您必须创建这样一个属性并使用 TTL 的值更新项目。

问:可以通过为整个表设置 TTL 来删除整个表吗?

不可以。虽然您需要在表级别定义可用于 TTL 的属性,但只能按项目粒度删除数据。也就是说,表中需要在过期后删除的每个项目都需要针对 TTL 属性定义一个值。无法选择自动删除整个表。

问:可以只为表中的部分项目设置 TTL 吗?

可以。TTL 仅对在 TTL 属性中具有定义值的项目有影响,表中的其他项目不受影响。

问:应将 TTL 指定为什么格式?

TTL 值应采用纪元时间格式,即自国际协调时间 (UTC) 1970 年 1 月 1 日到当前时间的秒数。如果项目在 TTL 属性中指定的值格式不正确,则该值将被忽略,该项目也不会被删除。

问:如何读取表中项目的 TTL 值?

TTL 值与项目的其他属性并无二致,您可以像读取任何其他属性一样来读取 TTL 值。为了更方便直观地确认 TTL 值,您可以通过 DynamoDB 控制台,将鼠标悬停在 TTL 属性上,即可看到使用人类可读的本地时间和 UTC 时间表示的 TTL 值。

问:是否可以基于分配给表中项目的 TTL 值创建索引?

可以。TTL 与任何其他项目属性一样,您可以像对其他项目属性那样基于它创建索引。

问:TTL 属性可以投射到索引吗?

可以。TTL 属性可以像任何其他属性一样投射到索引上。

问:为某个项目设置了 TTL 属性值后,是否可以对该值进行编辑?

可以。您可以修改 TTL 属性值,就像修改项目的任何其他属性一样。

是否可以修改表的 TTL 属性?

可以。如果表已经启用了 TTL 但您想为其指定其他 TTL 属性,则需要先禁用表的 TTL,然后使用新的 TTL 属性在表上重新启用 TTL。请注意,禁用 TTL 的设置可能需要一小时才能应用到所有分区,且在该操作完成之前,您无法再次启用 TTL。

问:是否可以使用 AWS 管理控制台查看和编辑 TTL 值?

可以。您可以使用 AWS 管理控制台轻松查看、设置或更新 TTL 值。

问:是否可以将 JSON 文档中的属性设置为 TTL 属性?

不可以。目前,我们不支持将 JSON 文档中的属性指定为 TTL 属性。要设置 TTL,您必须向每个项目显式添加 TTL 属性。

问:是否可以为 JSON 文档中的特定元素设置 TTL?

不可以。TTL 值只能针对整个文档进行设置,我们不支持在 JSON 文档中的特定项目过期后将其删除。

问:如果需要删除特定项目的 TTL,该怎么办?

删除 TTL 非常简单,只需删除分配给 TTL 属性的值或直接删除项目的 TTL 属性即可。

问:如果将 TTL 时间戳值设置成了过去的某个时间,该怎么办?

我们支持更新 TTL 值为过去时间的项目。当后台进程检查过期项目时,会找到该项目、进行标记并在随后将其删除。但如果 TTL 属性中的值是一个已经过去 5 年以上的时间戳纪元值,那么 DynamoDB 将忽略该时间戳且不会删除该项目。这是为了减少在 TTL 属性中存储特别低的值时发生意外删除项目的情况。

问:项目的 TTL 到期和实际删除该项目之间有多久延迟?

TTL 使用系统中的后台吞吐量来扫描和删除过期项目。因此,过期项目可能不会立即从表中删除。DynamoDB 会尽力在两天内删除过期项目,以确保系统中有足够的后台吞吐量供其他数据操作使用。从项目过期到真正被删除的确切时长将取决于工作负载的性质和表的大小。

问:如果尝试查询或扫描 TTL 已过期的项目,会发生什么?

考虑到项目过期和实际被后台进程删除之间可能存在延迟,如果您尝试读取已过期但尚未被删除的项目,则返回的结果将包括过期项目。如果不希望显示过期项目,您可以基于 TTL 值将这些项目筛选出去。

问:如果本地二级索引 (LSI) 中的数据已过期,会有什么影响?

其影响与任何删除操作相同。本地二级索引与项目本身存储在同一个分区中。因此,如果项目被删除,它将立即从本地二级索引中被删除。

问:如果全局二级索引 (GSI) 中的数据已过期,会有什么影响?

其影响与任何删除操作相同。全局二级索引 (GSI) 具有最终一致性,因此,当过期的原始项目将被删除时,GSI 可能需要一些时间才能更新。

问:TTL 如何与 DynamoDB Streams 配合使用?

因 TTL 值触发清除而导致的表中数据到期将被记录为删除操作。因此,Streams 中也记录有删除操作。删除记录中带有一个附加限定符,以便您可以区分常规删除操作和因 TTL 导致的删除操作。流条目将在删除时间点而非 TTL 到期时间写入,以反映记录被删除的实际时间。请参阅我们的文档和 API 指南。

问:删除操作和 TTL 分别应在何时使用?

TTL 是从表中删除过期记录的理想选择。但是,此操作只会尽力帮助您删除不需要的数据,而不能保证删除时间。因此,如果表中的数据需要在特定时间段 (通常是立即) 内删除,我们建议您使用删除命令。

问:是否可以控制哪些人有权设置或更新 TTL 值?

可以。TTL 属性与表的任何其他属性一样,您可以在表的属性级别控制访问权限。TTL 属性将遵循为表指定的常规访问控制。

问:是否可以检索 TTL 到期后删除的数据?

不能。过期项目在删除之前不会备份。您可以利用 DynamoDB Streams 跟踪表上发生的更改,并根据需要恢复相应值。过期项目删除之后,删除记录会在 Streams 中保存 24 小时。

问:如何知道表是否启用了 TTL?

您可以通过调用 DescribeTable API 或在 DynamoDB 控制台中查看表的详细信息,随时获取 TTL 的状态。请参阅我们的文档和 API 指南。

问:如何跟踪 TTL 删除的项目?

如果您启用了 DynamoDB Streams,则所有 TTL 删除都将显示在 DynamoDB Streams 中,并会被指定为系统删除,以便将其与您执行的显式删除区分开来。您可以从 Streams 中读取项目,并根据需要进行处理。此外,您还可以编写一个 Lambda 函数来单独归档这些项目。请参阅我们的文档和 API 指南。

问:是否需要支付一定费用才能为数据启用 TTL 功能?

不需要。启用 TTL 无需支付额外费用。

问:启用 TTL 会对总体的预配置吞吐量使用率造成什么影响?

TTL 所需的扫描和删除操作由系统执行,不会计入您的预配置吞吐量或使用率。

问:是否需要为监控 TTL 的扫描操作付费?

不需要。您不需要为用于监控项目的 TTL 到期情况的内部扫描操作付费。这些操作也不会影响表的吞吐量使用率。

问:过期项目是否会累积存储成本,直到被删除为止?

会。项目过期后会被添加到删除队列中以待后续删除。但在被删除之前,它就像任何常规项目一样可以读取或更新,并将产生存储成本。

问:查询过期项目是否使用读取容量?

是的。此操作与查询表中不存在的项目时情况相同。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  DynamoDB