如何排查 DynamoDB Accelerator(DAX)集群上的高延迟问题?

1 分钟阅读
0

我在 Amazon DynamoDB Accelerator(DAX)中的读取或写入请求发生高延迟。如何排查此问题?

解决方法

您的请求可能会出现延迟的原因有很多。请参阅以下每个潜在问题,以排查您的延迟问题。

集群或节点遇到高负载

延迟通常因集群或节点在 DAX 集群上遇到高负载造成。如果您将客户端配置为单节点 URL 而不是集群 URL,则此延迟可能会受到进一步影响。在这种情况下,如果节点在高负载期间遇到任何问题,则客户端请求会遇到延迟或节流。

要解决单个集群或节点的高负载导致的延迟和节流问题,请使用横向扩展纵向扩展

DAX 客户端中的配置错误

如果您减小 withMinIdleConnectionSize 参数,那么整个 DAX 集群的延迟可能会增加。此参数设置与 DAX 集群的最小空闲连接数。对于每个请求,客户端都将使用可用的空闲连接。如果连接不可用,则客户端会建立一个新连接。例如,如果参数设置为 20,则与 DAX 集群至少有 20 个空闲连接。

客户端将维护一个连接池。当应用程序对 DynamoDB 或 DAX 进行 API 调用时,客户端会从连接池租用一个连接。然后,客户端发出 API 调用并将连接返回到池中。但是,连接池有上限。如果您一次对 DAX 进行大量 API 调用,则它们可能会超过连接池的限制。在这种情况下,某些请求必须等待其他请求完成,然后才能从连接池获得租用。这会导致请求在连接池级别排队。结果,应用程序的往返延迟增加。

因此,要减少应用程序中周期性的流量峰值,请调整参数 setMinIdleConnectionSizegetMinIdleConnectionSizewithMinIdleConnectionSize。这些参数在 DAX 集群的延迟中起着关键作用。为您的 API 调用配置它们,以便 DAX 使用适当数量的空闲连接,而无需重新建立新的连接。

缓存中错过的项目

如果读取请求错过了项目,则 DAX 会将请求发送到 DynamoDB。DynamoDB 使用最终一致读数来处理请求,然后将项目返回给 DAX。DAX 将它们存储在项目缓存中,然后将其返回到应用程序。底层 DynamoDB 表中的延迟可能会导致请求延迟。

发生缓存丢失通常有两个原因:

1.    **强一致性读取:**DAX 不会缓存同一项目的强一致性读取。这会导致缓存丢失,因为条目绕过 DAX,并且是从 DynamoDB 表本身检索的。您可以使用最终一致读数来解决此问题,但请注意,DynamoDB 必须先读取数据才能缓存数据。

2.    **DAX 中的驱逐策略:**已从缓存中驱逐出的查询数据会导致丢失。DAX 使用三个不同的值来确定缓存驱逐情况:

  • DAX 集群使用最近最少使用(LRU)算法来确定项目的优先级。缓存已满时,优先级最低的项目将被驱逐。
  • DAX 使用生存时间(TTL)值来表示缓存中项目可用的时间段。超过某个项目的 TTL 值后,该项目将被驱逐。
    **注意:**如果您使用五分钟的默认 TTL 值,请检查您是否在 TTL 时间之后查询数据。
  • DAX 使用直写功能在写入新值时移出旧值。这有助于使用单个 API 调用将 DAX 项目缓存与基础数据存储保持一致。

要扩展项目的 TTL 值,请参阅配置 TTL 设置
**注意:**在正在运行的 DAX 实例中使用某个参数组时,您将无法修改该参数组。

对 DAX 集群应用维护补丁时也可能发生缓存丢失。使用多节点集群来减少停机时间。

维护时段

延迟可能会在每周维护时段内发生,尤其是在集群节点有软件升级、补丁或系统更改时。在大多数情况下,请求会由未进行维护的其他可用节点成功处理。在繁重维护期间请求数量高的集群可能会出现故障。

要减少延迟或故障几率,请将维护时段配置为非高峰时段。这样做可以让集群在请求负载较轻的时期内升级。

DynamoDB 表中的延迟

通过写入操作,数据首先写入 DynamoDB 表,然后写入 DAX 集群。只有将数据成功写入表和 DAX,操作才会成功。底层 DynamoDB 表中的延迟可能会导致请求延迟。要降低此延迟,请参阅如何排查 Amazon DynamoDB 表中的高延迟问题?

要进一步配置 DynamoDB 以满足应用程序的延迟要求,请参阅调整具有延迟感知能力的 Amazon DynamoDB 应用程序的 AWS Java SDK HTTP 请求设置

请求超时时间

参数 setIdleConnectionTimeout 确定空闲连接的超时时间,setConnectTimeout 确定与 DAX 集群的连接的超时时间。这两个参数用于处理连接池的超时,这可能会影响集群的延迟。

通过调整 setRequestTimeout 参数来配置与 DAX 集群的连接的请求超时。有关更多信息,请参阅 DAX 文档中的 setRequestTimeout

使用指数回退重试也是一项最佳实践,这样可以减少请求错误和降低运营成本。

**注意:**DAX 不支持 CloudWatch 指标中集群的延迟。


AWS 官方
AWS 官方已更新 1 年前