DynamoDB 概述 - AWS 规范性指导

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

DynamoDB 概述

Amazon DynamoDB 是一个 NoSQL 键值和文档数据库,提供快速而可预测的性能,能够实现无缝扩展。它是一个完全托管的、多区域、多活跃和持久的数据库。(DynamoDB 中的全局表功能会自动将一个AWS区域中所做的修改同步到所有其他选定区域,以提供多活支持。) DynamoDB 具有内置的安全功能、备份和恢复选项以及适用于互联网规模应用程序的内存缓存。

NoSQL 数据库的无模式性质有助于减少将数据库(读取架构)更改推送到生产环境所需的时间和流程,从而实现快速应用程序开发 (RAD)。诸如 DynamoDB 之类的 NoSQL 数据库是为高性能读/写操作而构建的。

功能和优势

DynamoDB 具有以下功能和优势:

  • 无需管理服务器 — DynamoDB 是一项完全托管的 NoSQL 数据库服务,这意味着它不涉及任何服务器维护开销。

  • 无架构 — DynamoDB 支持快速的应用程序开发和部署。

  • 大规模性能 — DynamoDB 提供快速而可预测的性能,能够实现无缝扩展。

  • ACID 支持 — DynamoDB 支持原子性、一致性、隔离性和持久性 (ACID) 事务,帮助您维护数据正确性。

  • 高可用性和持久性-您的数据存储在固态硬盘 (SSD) 中,并自动复制到同一AWS区域的多个可用区,提供内置的高可用性和数据持久性。

  • 自动扩展 — DynamoDB 使用ApplAWS ication Auto Scaling 服务动态调整预调配的吞吐容量,以响应流量模式。

  • 灵活的定价选项 — DynamoDB 提供两种具有特定计费选项的容量模式:按需容量模式和预调配容量模式。

  • Point-in-time 恢复 — 您可以使用 point-in-time恢复功能启用连续备份,以帮助保护您的表免受意外写入或删除操作的影响,并将表恢复到过去 35 天内的任何时间点。

  • 存活时间 (TTL) — 您可以在指定的持续时间后自动从 DynamoDB 表中删除项目。

  • 全局表 — 您可以跨AWS区域部署多个副本,无需构建自己的复制解决方案。

  • 全局二级索引 — 您可以使用与表自己的分区和排序键不同的分区和排序键来查询 DynamoDB 表。

  • DAX — DynamoDB 加速器 (DAX) 缓存服务为读取操作提供亚毫秒级的响应时间。

  • DynamoDB Streams — 此功能在日志中提供按时间排序的项目级修改序列,以支持对 DynamoDB 表中的更改的实时跟踪和通知。

有关这些好处的更多信息,请参阅AWS网站上的 Amazon DynamoDB 功能。以下部分讨论了一些与通过从 RDBMS 迁移到 DynamoDB 来实现数据库工作负载现代化相关的功能。

分区键

DynamoDB 无架构,因此无需为表定义所有属性。分区键属性是必填的,排序键是可选的。其余属性是任意的,可以因项目而异。我们建议您选择具有高基数的分区键,这样经常访问的项目就不会位于同一个分区上。这种做法可以帮助您避免数据访问失衡和分区过热。有关更多信息,请参阅 DynamoDB 文档中设计分区键并有效使用的最佳实践

索引

索引使您可以访问替代查询模式,并可以加快查询速度。无论您使用的是关系数据库还是 DynamoDB,都应谨慎创建索引。每当对表进行写入操作时,都必须更新该表的所有索引。

全局二级索引包含从基表中选择的一组属性,但是这些属性按与表自己的主键不同的主键进行排列。在 DynamoDB 中,全局二级索引默认属于稀疏型。也就是说,排序键是可选的,并不出现在每个表项中。要利用此功能,您可以创建仅存储和投影所需属性的全局二级索引。一个 DynamoDB 表上最多可以具有 20 个全局二级索引。有关此功能的更多信息,请参阅 DynamoDB 文档中的在 DynamoDB 中使用全局二级索引

生存时间

可以在 DynamoDB 表上设置生存时间 (TTL) 属性以定义每个项目(记录)的时间戳,以指定何时不再需要某个项目。在指定的时间戳之后不久,DynamoDB 将该项目从表中删除,而不会消耗任何额外的容量单位。有关此功能的更多信息,请参阅 DynamoDB 文档中的使用 DynamoDB 存活时间使项目过期

定价模型

DynamoDB 提供两种定价模式可供选择:预置容量和按需容量。您选择的定价模式取决于您的预计工作量。

定价模型 工作负载类型 成本 读取/写入吞吐量
预配置容量 可预见 小于

您可以根据读取容量单位 (RCU) 和写入容量单位 (WCU) 指定每秒执行一次的读取/写入操作数。例如:

  • 对于大小最多为 4 KB 的项目,1 个 RCU 每秒执行一次最终一致性读取。

  • 对于大小最多为 1 KB 的项目,1 WCU 每秒执行一次最终一致性读取。

您可以启用自动扩展来调整容量以响应流量变化。

按需容量 动态 提高

您不指定吞吐量要求。DynamoDB 可自动适应您的工作负载。

按读取请求单位和写入请求单位对应用程序对表执行的读取和写入操作收费。例如:

  • 一个 8 KB 的项目需要 1 个读取请求单元才能实现最终一致的读取,而对于非事务性写入操作,需要 8 个写入请求单元。

有关这两个模型的更多信息,请参阅 DynamoDB 文档中的读/写容量模式

事务

DynamoDB 支持在单个AWS账户和AWS区域内跨一个或多个表执行原子性、一致性、隔离性和持久性 (ACID) 事务。

要管理表内和表间多个项目的更改,您可以使用 DynamoDB 交易TransactWriteItemsTransactGetItems API。

  • TransactWriteItems是一个批处理操作,它包含一个或多个PutItemUpdateItem、和DeleteItem操作的写入集。 TransactWriteItems可以选择检查在进行更新之前必须满足的先决条件。这些条件可能涉及与写入集相同的项目,也可能涉及不同的项目。如果任何条件未得到满足,则交易将被拒绝。

  • TransactGetItems是一个批处理操作,它包含一个或多个GetItem操作的读取集。如果您对属于活动写入事务一部分的项目发出TransactGetItems请求,则读取事务将被取消。要获取先前提交的值,可以使用标准的读取操作。

有关这些 API 的更多信息,请参阅 DynamoDB 文档中的Amazon DynamoDB 交易:其工作原理

限制

DynamoDB 事务 API 操作具有以下约束:

  • 一笔事务不能更新超过 100 个具有唯一性的项目。

  • 一个事务不能包含超过 4 MB 数据。

  • 不能对同一个表中的同一个项目执行事务中的两个操作。例如,不能在一次事务中对同一项目执行一次ConditionCheckUpdate操作。

  • 事务无法对超过一个 AWS 账户或区域中的表执行操作。

  • 事务操作仅在最初进行写入操作的AWS区域内提供 ACID 保证。全局表中不支持跨区域的事务。

  • 对象持久化模型不支持事务。要使用事务功能,您必须使用 DynamoDB 低级 API 访问数据库和表。

大型组件

DynamoDB 对每个项目的大小限制为 400 KB。此限制包括属性名称(使用 UTF-8 编码的二进制长度)和属性值(同为二进制长度)。属性名称计入大小限制。例如,假设一个具有两个属性的项目:一个名为 “国家/地区代码” 的属性值为 “IN”,另一个名为 “”country-phone-prefix,值为 “91” 的属性。该项目的总大小为 36 字节。

变通方法

如果一个项目与许多属性和属性相关联,或者与大量数据相关联,则其大小可能会超过 400 KB。在这种情况下,可以将序列化项目以 JSon 格式存储在 Amazon Simple Storage Service (Amazon S3) 中,然后将 Amazon S3 位置作为属性 (S3Location) 保存在项目中。该项目的读取和写入操作获取 S3 对象并更新 JSON 字符串。主键、排序键以及本地索引和全局二级索引使用的所有属性应与S3Location属性一起存储在表中。这需要在应用程序(数据访问层)中使用额外的逻辑来检查S3Location属性并从 Amazon S3 获取完整的项目数据。

备份与还原

Backup 和还原支持是任何数据库都期望的常见功能。DynamoDB 本机支持在同一账户内执行备份和还原操作,但您可以使用其他选项或流程跨多个账户执行表复制。这些进程不消耗任何读取/写入容量单位。有关更多信息,请参阅AWS规范指南网站上的 Amazon DynamoDB 跨账户全表复制选项指南。

限制

DynamoDB 目前支持使用AWS Backup进行跨账户备份和恢复,但该账户必须属于同一个组织。您可以通过采用以下解决方案之一来解决此限制:

语言和 SDK 支持

AWS软件开发工具包为AWS服务提供了简化的编程接口,并支持.NET、Java、Node.js JavaScript、Python、PHP 和 Ruby。

您可以从三种模式中选择使用 SDAWS K 访问 DynamoDB 表:对象持久化模型(高级接口)、文档接口和低级接口。有关详细信息,请参阅本指南下文中的访问模式