AWS DynamoDB 学习

DynamoDB 的按需备份和还

https://docs.aws.amazon.com/zh_cn/amazondynamodb/latest/developerguide/BackupRestore.html

生存时间

https://docs.aws.amazon.com/zh_cn/amazondynamodb/latest/developerguide/TTL.html
自动删除过期的项,从而帮助您降低存储用量,减少用于存储不相关数据的成本

索引

在创建索引时应谨慎, 只要对表进行写入,就必须更新表的所有索引。在具有大型表的写入密集型环境中,这会占用大量系统资源。
DynamoDB 中的索引与其关系对应项不同。当您创建二级索引时,必须指定其键属性 - 分区键和排序键。在创建二级索引后,您可以对它执行 Query 或 Scan 操作,就如同对表执行这些操作一样。DynamoDB 没有查询优化程序,因此,仅在您对二级索引执行 Query 或 Scan 操作时使用它。
索引的键架构。索引键架构中的每个属性必须是类型为字符串、数字或二进制的顶级属性。其他数据类型,包括文档和集,均不受支持。键架构的其他要求取决于索引的类型:

  1. 对于全局二级索引,分区键可以是基表的任何标量属性。排序键是可选的,也可以是基表的任何标量属性。
  2. 对于local secondary index,分区键必须与基表的分区键相同,排序键必须是非键基表属性。

DynamoDB 支持两种不同的索引:

  1. 全局二级索引 - 索引的主键可以是其表中的任意两个属性。
  2. 本地二级索引 - 索引的分区键必须与其表的分区键相同。不过,排序键可以是任何其他属性。

您最多可以为每个表定义 5 个local secondary index和 5 个全局二级索引。
AWS 账户需要支付在基表中存储项目以及在表的任何全局二级索引中存储属性的费用. 索引项目所占用的空间大小就是以下内容之和:

  1. 基表的主键 (分区键和排序键) 的大小 (按字节计算)
  2. 索引键属性的大小(按字节计算)
  3. 投影的属性(如果有)的大小(按字节计算)
  4. 每个索引项目 100 bytes 的开销
    要估算全局二级索引的存储要求,您可以估算索引中项目的平均大小,然后乘以基表中具有全局二级索引键属性的项目数

本地二级索引:

  1. 主键必须是复合主键(分区键和排序键)
  2. 分区键必须与基表的分区键相同,排序键必须是非键基表属性, 排序键仅由一个标量属性构成
  3. 每个表创建最多 5 个local secondary index
  4. 查询或扫描local secondary index,可以请求未投影到索引中的属性
  5. 查询local secondary index时,您可以选择最终一致性或强一致性
  6. 在创建表的时候建立, 后期无法增删(Update操作不能更新本地二级索引)
  7. 对于每个分区键值,所有索引+项目的大小总和必须为 10GB 或更小, 参考 项目集合
    意思是: 表中具有同一个分区键所有项目的存储容量, 再加上本地二级索引的存储容量(基表的主键 + 索引键属性的大小 + 投影的属性大小 + N * 每个索引项目 100)之和不得超过10G.
    如果项目集合的大小超出 10GB 的限制,则 DynamoDB 返回 ItemCollectionSizeLimitExceededException,并且您无法向该项目集合添加更多项目,也不能增加该项目集合中项目的大小。(仍允许执行可减小项目集合大小的读写操作。)您仍然可以向其他项目集合中添加项目。

全局二级索引:

  1. 分区键可以是基表的任何标量属性。排序键是可选的,也可以是基表的任何标量属性. 每个索引键的属性必须是标量类型:String、Number 或 Binary。 (不可以是文档或集。)您可以将任何数据类型的属性投影到全局二级索引中,其中包括标量、文档和集
  2. 对于全局二级索引查询或扫描,您只能请求投影到索引中的属性
  3. 每个表创建最多 5 个全局二级索引
  4. 查询仅支持最终一致性
  5. 可以通过Update操作进行增删
  6. 在表中放置或删除项目时,表的全局二级索引会以最终一致性方式进行更新。在正常情况下,对表数据进行的更改会瞬间传播到全局二级索引。但是,在某些不常发生的故障情况下,可能出现较长时间的传播延迟。因此,应用程序需要预计和处理对全局二级索引进行的查询返回不是最新结果的情况。
  7. 必须为索引提供 ProvisionedThroughput 设置,该设置包括 ReadCapacityUnits 和 WriteCapacityUnits。这些预置吞吐量设置独立于表的相应设置,但是行为是类似的. 一般原则是,建议将索引的预置写入容量设置为表的写入容量的 1.5 倍。
  8. 在索引处于 ACTIVE 状态之前,您无法对其执行 Query 或 Scan 操作。

数据类型

以下是 DynamoDB 数据类型描述符的完整列表:

  1. S – 字符串
  2. N – 数字
  3. B – 二进制
  4. BOOL – 布尔值
  5. NULL – Null
  6. M – 映射
  7. L – 列表
  8. SS – 字符串集
  9. NS – 数字集
  10. BS – 二进制集

属性分类:

  1. 标量类型 - 标量类型可准确地表示一个值。标量类型包括数字、字符串、二进制、布尔值和 null。

    1. S – 字符串
    2. N – 数字
      数字可为正数、负数或零。数字最多可精确到 38 位。超过此位数将导致异常。
      1. 正数范围:1E-130 到 9.9999999999999999999999999999999999999E+125
      2. 负数范围:-9.9999999999999999999999999999999999999E+125 到 -1E-130
        数字以可变长度形式表示。系统会删减开头和结尾的 0.
    3. B – 二进制
      1. 二进制属性的长度必须大于零且受限于最大 DynamoDB 项目大小 400 KB
      2. 将主键属性定义为二进制类型属性,以下附加限制将适用:
        1. 对于简单的主键,第一个属性值 (分区键) 的最大长度为 2048 字节。
        2. 对于复合主键,第二个属性值 (排序键) 的最大长度为 1024 字节。
      3. 在将二进制值发送到 DynamoDB 之前,您的应用程序必须采用 Base64 编码格式对其进行编码。收到这些值后,DynamoDB 会将数据解码为无符号字节数组,将其用作二进制属性的长度
    4. BOOL – 布尔值
    5. NULL – Null
      空代表属性具有未知或未定义状态。
  2. 文档类型 - 文档类型可表示具有嵌套属性的复杂结构 - 例如您将在 JSON 文档中找到的结构。文档类型包括列表和映射。
    文档类型包括列表和映射。这些数据类型可以互相嵌套,用来表示深度最多为 32 层的复杂数据结构。
    只要包含值的项目大小在 DynamoDB 项目大小限制 (400 KB) 内,列表或映射中值的数量就没有限制。
    属性值不能是空字符串或空集 (字符串集、数字集或二进制集),但可以是空列表和映射。

    1. M – 映射
      映射类型属性可以存储名称/值对的无序集合。映射用大括号括起:{ … }
      映射类似于 JSON 对象。映射元素中可以存储的数据类型没有限制,映射中的元素也不一定为相同类型
    2. L – 列表
      列表类型属性可存储值的有序集合。列表用方括号括起:[ … ]
      列表类似于 JSON 数组。列表元素中可以存储的数据类型没有限制,列表元素中的元素也不一定为相同类型。
  3. 集类型 - 集类型可表示多个标量值。集类型包括字符串集、数字集和二进制集。

主键属性定义为字符串类型属性,以下附加限制将适用:

  1. 对于简单的主键,第一个属性值 (分区键) 的最大长度为 2048 字节。
  2. 对于复合主键,第二个属性值 (排序键) 的最大长度为 1024 字节。

日期

  1. 使用字符串数据类型表示日期或时间戳。执行此操作的一种方法是使用 ISO 8601 字符串,如以下示例所示:
    1. 2016-02-15
    2. 2015-12-21T17:42:34Z
    3. 20150311T122706Z
      有关更多信息,请访问 http://en.wikipedia.org/wiki/ISO_8601
  2. 使用数字数据类型表示日期或时间戳。执行此操作的一种方法是使用纪元时间 - 自 1970 年 1 月 1 日 00:00:00 UTC 以来的秒数。例如,纪元时间 1437136300 表示 2015 年 7 月 17 日 12:31:40 UTC。
    有关更多信息,请访问 http://en.wikipedia.org/wiki/Unix_time。

DynamoDB 中的表、属性和其他对象必须具有名称

所有名称都必须使用 UTF-8 进行编码,并且区分大小写。

表名称和索引名称的长度必须介于 3 到 255 个字符之间,而且只能包含以下字符:

1. a-z
2. A-Z
3. 0-9
4. _ (下划线)
5. - (短划线)
6. . (圆点)

属性名称的长度必须介于 1 到 255 个字符之间。
具有特殊含义:# (散列) 和 : (冒号)
保留关键字: https://docs.aws.amazon.com/zh_cn/amazondynamodb/latest/developerguide/ReservedWords.html

读取一致性

1. Amazon DynamoDB 在全世界多个 AWS 区域可用。每个区域均与其他 AWS 区域独立和隔离
2. 每个 AWS 区域包含多个不同的称为“可用区”的位置。每个可用区都与其他可用区中的故障隔离,并提供与同一区域其他可用区的低成本、低延迟网络连接。这使您可以在某个区域的多个可用区之间快速复制数据。
3. 当您的应用程序将某个数据写入 DynamoDB 表并收到 HTTP 200 响应 (OK) 时,该数据的所有副本都会更新。该数据最终将在所有存储位置中保持一致,通常只需一秒或更短时间。
4. 最终一致性读取
  当您从 DynamoDB 表中读取数据时,响应反映的可能不是刚刚完成的写入操作的结果。响应可能包含某些陈旧数据。如果您在短时间后重复读取请求,响应将返回最新的数据。
5. 强一致性读取
   当您请求强一致性读取时,DynamoDB 会返回具有最新数据的响应,从而反映来自所有已成功的之前写入操作的更新。如果网络延迟或中断,可能会无法执行强一致性读取。
   读取操作 (例如 GetItem,Query 和 Scan) 提供了一个 ConsistentRead 参数。如果您将此参数设置为 true,DynamoDB 将在操作过程中使用强一致性读取。

读取和写入吞吐容量

在 Amazon DynamoDB 中创建表或索引时,必须指定读写活动的容量要求。通过提前定义您的吞吐容量,DynamoDB 可以预留必要的资源,以满足您的应用程序所需的读写活动,同时确保一致的低延迟性能。
一个 读取容量单位 表示对大小最多为 4 KB 的项目每秒执行一次强一致性读取,或每秒执行两次最终一致性读取。如果您需要读取大于 4 KB 的项目,DynamoDB 需要消耗额外的读取容量单位。所需的读取容量单位的总数取决于项目大小以及您需要最终一致性读取还是强一致性读取。
一个 写入容量单位 表示对大小最多为 1 KB 的项目每秒执行一次写入。如果您需要写入大于 1 KB 的项目,DynamoDB 需要消耗额外的写入容量单位。所需的写入容量单位的总数取决于项目大小。
例如,假设您创建了具有 5 个读取容量单位和 5 个写入容量单位的表。使用这些设置,您的应用程序可以:

1. 执行高达每秒 20KB 的强一致性读取 (4 KB × 5 个读取容量单位)。
2. 执行高达每秒 40KB 的最终一致性读取 (读取吞吐量的两倍)。
3. 每秒写入高达 5KB (1 KB × 5 个写入容量单位)。

如果您的应用程序读取或写入较大型的项目 (最大为 DynamoDB 的项目大小上限 400 KB),它将消耗更多的容量单位。
您的读取或写入请求超过了表的吞吐量设置,则 DynamoDB 可能会限制 该请求。DynamoDB 也可以限制超过了索引吞吐量的读取请求。限制会阻止您的应用程序消耗太多容量单位。当请求受到限制时,它将失败并出现代码 HTTP 400 (Bad Request) 和一个 ProvisionedThroughputExceededException

1. 增加预置吞吐量
  可以根据需要使用 AWS 管理控制台或 UpdateTable 操作增加 ReadCapacityUnits 或 WriteCapacityUnits。
2. 减少预置吞吐量
  每天最多可执行 4 次调低操作. 如果过去 4 小时内未执行减小操作,则可以执行额外的调低操作

表大小
表的大小没有实际限制。表的项目数和字节数是无限制的。

每个账户中表的数量
对于任何 AWS 账户,每个区域的初始限制为 256 个表。

批处理

DynamoDB 低级 API 支持批量读取和写入操作.
批量操作可以容忍批处理中的个别请求失败。举例来说,假设一个 BatchGetItem 请求读取五个项目。即使某些底层 GetItem 请求失败,这也不会导致整个 BatchGetItem 操作失败。另一方面,如果所有五个读取操作都失败,则整个 BatchGetItem 将失败。
批量操作会返回有关各失败请求的信息,以便您诊断问题并重试操作。对于 BatchGetItem,在请求的 UnprocessedKeys 参数中会返回有问题的表和主键。对于 BatchWriteItem,在 UnprocessedItems 中返回类似信息。
如果 DynamoDB 返回了任何未处理的项目,应对这些项目重试批量操作。然而,我们强烈建议您使用指数回退算法。如果立即重试批量操作,底层读取或写入请求仍然会由于各表的限制而失败。如果使用指数回退延迟批量操作,批处理中的各请求成功的可能性更大。

Query

Query 操作基于主键值查找项目。您可查询具有复合主键 (分区键和排序键) 的任何表或二级索引。 您必须提供分区键属性的名称以及该属性的一个值。Query 将返回具有该分区键值的所有项目。您可以选择提供排序键属性,并使用比较运算符来优化搜索结果。
Query 操作始终返回结果集。如果未找到完全匹配项目,则结果集将为空。
Query 结果始终按排序键值排序。如果排序键的数据类型是数字,则会按数字顺序返回结果;否则,会按 UTF-8 字节的顺序返回结果。默认情况下,系统按升序排序。要颠倒顺序,请将 ScanIndexForward 参数设置为 false。
单个 Query 操作最多可检索 1 MB 的数据。在向结果应用任何 FilterExpression 之前,将应用此限制。如果 LastEvaluatedKey 包含在响应中且为非 null 值,则您将需要为结果集分页

  1. 键条件表达式
    要指定搜索条件,请使用键条件表达式 - 用于确定要从表或索引中读取的项目的字符串。您必须指定分区键名称和值作为等式条件。
    分区键: 必须指定分区键名称和值作为等式条件。
    您可选择为排序键提供另一个条件(如果有)。排序键条件必须使用下列比较运算符之一:

    1. a = b - 如果属性 a 等于值 b,则为 true
    2. a < b - 如果 a 小于 b 则为 true
    3. a <= b - 如果 a 小于或等于 b 则为 true
    4. a > b - 如果 a 大于 b 则为 true
    5. a >= b - 如果 a 大于或等于 b 则为 true
    6. a BETWEEN b AND c - 如果 a 大于或等于 b 且小于或等于 c,则为 true。
    7. 以下函数也受支持:
      begins_with (a, substr) - 如果属性 a 的值以特定子字符串开头,则为 true。
  2. 筛选表达式
    筛选表达式在 Query 已完成但结果尚未返回时应用。因此,无论是否存在筛选表达式,Query 都将占用同等数量的读取容量。
    筛选表达式不得包含分区键或排序键属性。您需要在关键字条件表达式而不是筛选表达式中指定这些属性。

graph BT subgraph AWS DynamoDB D1(Apply KeyConditionExpression) D2(Apply Page Size - Limit) D3(Apply 1M Limitation) D4(Apply FilterExpression) D1 --> D2 D2 --> D3 D3 --> D4 end A[Query/Scan] --> |request|D1 D4 --> |Response|B[Result
Pagination: LastEvaluatedKey & ExclusiveStartKey] B -. Next Page .- A