AWS DynamoDB

Amazon DynamoDB

第一章:核心定义与本质

Amazon DynamoDB 是一种完全托管的 NoSQL 数据库服务,提供快速、可预测的性能和无缝的扩展性。

  • 无服务器 (Serverless): 你无需管理服务器、安装补丁或维护底层基础设施。
  • 高可用性: 数据自动在区域内的多个可用区(AZ)之间进行同步复制。
  • 性能: 无论数据规模如何,都能提供稳定、个位数毫秒级的响应延迟。
  • 安全性: 提供默认的静态加密(Encryption at Rest),并与 IAM 集成进行细粒度的访问控制。

第二章:数据模型与核心组件

1. 基础结构

  • 表 (Tables): 数据的集合。DynamoDB 的表是无模式(Schema-less)的,除了主键外,不需要预先定义属性。
  • 项目 (Items): 表中的单条记录(类似于行)。每个项目的大小上限为 400 KB。
  • 属性 (Attributes): 项目中的基本数据元素(类似于列)。支持标量、集合及嵌套的文档类型(List 和 Map),嵌套深度可达 32 层。

2. 主键 (Primary Key)

主键必须在创建表时定义,且必须是标量类型(String, Number, Binary)。

  • 分区键 (Partition Key/Hash Key): 决定数据存储在哪个物理分区。
  • 排序键 (Sort Key/Range Key): 可选。与分区键结合形成“复合主键”,允许在相同分区键下进行范围查询和排序。

第三章:二级索引 (Secondary Indexes)

当主键无法满足查询需求时,使用二级索引来提供查询灵活性。

特性 本地二级索引 (LSI) 全局二级索引 (GSI)
分区键 (PK) 必须与原表的分区键相同 可以与原表不同
排序键 (SK) 必须与原表不同 可以与原表不同
创建时机 仅限在建表时创建 可以在建表后随时创建、修改或删除
范围限制 仅限于单个分区键值内(本地) 跨越表的所有分区(全局)
读一致性 支持强一致性或最终一致性 仅支持最终一致性

第四章:读一致性与容量单位

1. 读一致性模型

  • 最终一致性 (Eventually Consistent): 默认模式,性能最高。响应可能包含过时数据,但通常在 1 秒内达到一致。
  • 强一致性 (Strongly Consistent): 返回最准确的数据。但在网络延迟或故障时可用性略低,且不支持跨区域读取。

2. 吞吐量单位计算

  • 写入 (WCU): 1 个 WCU = 每秒 1 次写入(项大小不超过 1 KB)。
  • 读取 (RCU): 1 个 RCU = 每秒 1 次强一致性读取,或每秒 2 次最终一致性读取(项大小不超过 4 KB)。

第五章:容量管理模式

  • 预置模式 (Provisioned): 你指定固定的 RCU 和 WCU。适合流量平稳、可预测的场景。

  • Auto Scaling: 开启后,DynamoDB 会根据实际流量自动调整预置的容量,防止因请求超限导致的 Throttling(节流)。

  • 按需模式 (On-Demand): 按请求付费,无需容量规划。适合流量不可预测或有突发尖峰的负载。


第六章:查询操作 (Query vs Scan)

  • Query (查询): 基于主键值定位。必须指定分区键的等值条件。性能极高且消耗吞吐量低。

  • Scan (扫描): 读取表或索引中的所有项目,然后进行过滤。

  • 注意: 对于大表,Scan 非常慢且非常昂贵,因为它会消耗大量的 RCU。

  • 优化: 尽可能使用 Query;如必须 Scan,可尝试“并行扫描 (Parallel Scan)”。

  • 数据限制: 单次 Query 或 Scan 操作返回的数据上限为 1 MB


第七章:高级特性与集成

1. DynamoDB Streams

捕获表的增删改操作。

  • 记录保留 24 小时
  • 常用于触发 AWS Lambda,实现数据同步、实时分析或跨区域复制。

2. DAX (DynamoDB Accelerator)

专为 DynamoDB 设计的内存中缓存集群。

  • 提供微秒级的响应速度。
  • 主要针对频繁读取、重复读取的场景,但不适合需要强一致性读的应用。

3. 全球表 (Global Tables)

提供全托管、多区域、多活跃(Multi-active)的复制方案。

  • 允许在多个 AWS 区域提供极低延迟的读写。
  • 依赖 DynamoDB Streams 实现。

4. 其他核心特性

  • TTL (生存时间): 自动删除过期项目。系统自动执行,不消耗吞吐量。
  • Transactions (事务): 提供原子性、一致性、隔离性和持久性(ACID)。单次事务最多处理 25 个项目(4 MB)。

第八章:架构设计最佳实践 (解决热点问题)

1. 热点分区 (Hot Partitions)

  • 原因: 如果大量请求集中在同一个分区键(例如热门产品 ID),会导致该物理分区达到 RCU/WCU 上限,产生节流错误。
  • 对策:
  • 高基数键: 选择具有大量唯一值的分区键(如 UserID 而非 Gender)。
  • 写入分片 (Write Sharding): 在分区键末尾添加随机后缀,将压力分散到多个分区。
  • 利用缓存: 使用 DAX 处理读取热点。

2. 节流处理 (Throttling)

  • 当请求被节流时,客户端会收到 HTTP 400 (ProvisionedThroughputExceededException) 错误。
  • 解决方案: 增加预置容量、开启 Auto Scaling 或切换到按需模式。

第九章:架构师对比 (什么时候选 DynamoDB?)

需求 推荐方案
关系型数据、多表 Join、复杂 SQL 选择 RDSAurora
超高性能、毫秒级响应、键值对存储 选择 DynamoDB
微秒级读取延迟 在 DynamoDB 前端部署 DAX
事件驱动、数据库变动触发逻辑 使用 DynamoDB Streams + Lambda
存储大文件(如图片) 将文件存入 S3,仅在 DynamoDB 存入 URL