DAX:工作原理
Amazon DynamoDB Accelerator (DAX) 设计在 Amazon Virtual Private Cloud (Amazon VPC) 环境中运行。Amazon VPC 服务定义一个与传统数据中心非常相似的虚拟网络。利用 VPC,可以控制 IP 地址范围、子网、路由表、网络网关和安全设置。可以在虚拟网络中启动一个 DAX 集群,使用 Amazon VPC 安全组控制对该集群的访问。
注意
如果您的 AWS 账户是在 2013 年 12 月 4 目之后创建的,则您在每个 AWS 区域已经有一个默认 VPC。VPC 可以立即使用,而不需要执行任何其他配置步骤。
有关更多信息,请参阅《Amazon VPC 用户指南》中的默认 VPC 和默认子网。
下图显示 DAX 的高级概述。
![显示 VPC 中应用程序、DAX 客户端和 DAX 集群之间交互的工作流图表。](images/dax_high_level.png)
要创建 DAX 集群,请使用 AWS Management Console。除非另有指定,否则 DAX 集群在默认 VPC 内运行。要运行应用程序,请在 Amazon VPC 中启动 Amazon EC2 实例。然后,在 EC2 实例上部署应用程序(与 DAX 客户端一起)。
在运行时,DAX 客户端会将应用程序的所有 DynamoDB API 请求定向到 DAX 集群。如果 DAX 可以直接处理这些 API 请求之一,则会直接处理。否则,将请求传递到 DynamoDB。
最后,DAX 集群将结果返回到应用程序。
DAX 处理请求的方式
DAX 集群由一个或多个节点组成。每个节点运行自己的 DAX 缓存软件实例。其中一个节点将充当集群的主节点。其他节点(如果有)将充当只读副本。有关更多信息,请参阅 Nodes。
应用程序可通过为 DAX 集群指定端点来访问 DAX。DAX 客户端软件与集群端点协同工作,执行智能负载均衡和路由。
读取操作
DAX 可响应以下 API 调用:
-
GetItem
-
BatchGetItem
-
Query
-
Scan
如果请求指定最终一致性读取(默认行为),将尝试从 DAX 读取项目:
-
如果 DAX 有可用项目(缓存命中),DAX 将项目返回到应用程序而无需访问 DynamoDB。
-
如果 DAX 没有可用项目(缓存未命中),DAX 将请求传递到 DynamoDB。如果收到来自 DynamoDB 的响应,DAX 将结果返回到应用程序。还会将结果写入主节点上的缓存中。
注意
如果集群中有任何只读副本,DAX 将自动保持副本与主节点同步。有关更多信息,请参阅 集群。
如果请求指定强一致性读取,DAX 会将请求传递到 DynamoDB。来自 DynamoDB 的结果不在 DAX 中缓存,而是仅将其返回到应用程序。
写入操作
以下 DAX API 操作被视为“直写”:
-
BatchWriteItem
-
UpdateItem
-
DeleteItem
-
PutItem
采用这些操作,数据将首先写入 DynamoDB 表,然后写入 DAX 集群。仅当数据同时成功写入表和 DAX 后,操作才成功。
其他操作
DAX 无法识别用于管理表的任何 DynamoDB 操作(如 CreateTable
、UpdateTable
等)。如果应用程序需要执行这些操作,必须直接访问 DynamoDB 而不是使用 DAX。
有关 DAX 和 DynamoDB 一致性的详细信息,请参阅 DAX 和 DynamoDB 一致性模型。
有关事务如何在 DAX 中工作的信息,请参阅 在 DynamoDB Accelerator(DAX)中使用事务 API。
请求速率限制
如果发送到 DAX 的请求数超过节点的容量,则 DAX 返回 ThrottlingException,限制接受额外请求的速率。DAX 持续评估 CPU 利用率,确定在保持正常集群状态的情况下可处理的请求数目。
可以监控 DAX 发布到 Amazon CloudWatch 的 ThrottledRequestCount 指标。如果经常看到这些异常,应考虑向上扩展集群。
项目缓存
DAX 将保留一个项目缓存存储 GetItem
和 BatchGetItem
操作的结果。缓存中的项目表示来自 DynamoDB 的最终一致性数据,由主键值存储。
如果应用程序发送 GetItem
或 BatchGetItem
请求,DAX 尝试使用指定键值直接从项目缓存读取项目。如果找到项目(缓存命中),DAX 将立即返回到应用程序。如果找不到项目(缓存未命中),则 DAX 将请求发送到 DynamoDB。DynamoDB 使用最终一致性读取处理请求,将项目返回到 DAX。DAX 将项目存储在项目缓存中,然后返回应用程序。
项目缓存具有存活时间 (TTL) 设置,默认为 5 分钟。DAX 向写入项目缓存的每个项目分配时间戳。如果项目在缓存中保留的时间超出 TTL 设置,将过期。如果针对已过期项目发出 GetItem
请求,将视为缓存未命中,DAX 将 GetItem
请求发送到 DynamoDB。
注意
创建新的 DAX 集群时,可以为项目缓存指定 TTL 设置。有关更多信息,请参阅 管理 DAX 集群 。
DAX 还将保留项目缓存的最近最少使用的 (LRU) 列表。LRU 列表跟踪项目首次写入到缓存的时间以及上次从缓存读取项目的时间。如果项目缓存已满,DAX 将移出较旧的项目(即使尚未过期),为新项目腾出空间。将始终为项目缓存启用 LRU 算法,用户无法配置。
如果指定零作为项目缓存 TTL 设置,项目缓存中的项目将仅由于 LRU 移出或“直写”操作而进行刷新。
有关 DAX 中项目缓存一致性的详细信息,请参阅 DAX 项目缓存行为。
查询缓存
DAX 还将保留一个查询缓存存储 Query
和 Scan
操作的结果。此缓存中的项目表示来自对 DynamoDB 表的查询和扫描的结果集。这些结果集由参数值存储。
如果应用程序发送一条 Query
或 Scan
请求,DAX 将尝试使用指定参数值从查询缓存读取匹配的结果集。如果找到结果集(缓存命中),DAX 会将结果集立即返回到应用程序。如果找不到结果集(缓存未命中),则 DAX 将请求发送到 DynamoDB。DynamoDB 使用最终一致性读取来处理请求,将结果集返回给 DAX。DAX 将其存储在查询缓存中,然后返回到应用程序。
注意
创建新的 DAX 集群时,可以为查询缓存指定 TTL 设置。有关更多信息,请参阅 管理 DAX 集群 。
DAX 还保留查询缓存的 LRU 列表。列表跟踪结果集首次写入到缓存的时间以及上次从缓存读取结果的时间。如果查询缓存已满,DAX 会移出较旧的结果集(即使尚未过期),为新结果集腾出空间。将始终为查询缓存启用 LRU 算法,用户无法配置。
如果指定零作为查询缓存 TTL 设置,将不会缓存查询响应。
有关 DAX 中查询缓存一致性的详细信息,请参阅 DAX 查询缓存行为。