AWS 多区域 ElastiCache 同步
AWS Multi region ElastiCache sync
需要有关以下 AWS 特定用例的最佳实践的信息,
- 我们的 Java Web 应用程序部署在 us-east-1 和 us-west-2 区域。
- 它与 Dynamo DB 通信,基于 Memcached 的 ElastiCache 位于两个区域的 Dynamo DB 之上。
- 我们在 us-east-1 和 us-west-2 之间启用了 Dynamo DB 复制。
- Route 53 将 API 呼叫定向到适当的区域。
现在,问题是当我们在 Dynamo DB 中创建或更新记录时,它会插入到 Dynamo DB 中并缓存在该特定区域中。记录也被复制到其他区域 Dynamo DB,但缓存不会保持同步,因为 ElastiCache 之间没有复制。
我们如何以最佳方式解决这个问题?
其他建议的一个选项是使用 DynamoDB DAX。它是一个直写缓存,这意味着您不需要将数据库数据与缓存同步。当您使用普通 DynamoDB API.
写入数据时,它会在幕后发生
但如果您仍想使用 ElastiCache,可以使用 DynamoDB Streams。您可以实施一个 Lambda 函数,该函数将在 table 中的每次 DynamoDB 更新时触发,并将新数据写入 ElastiCache。
This 文章可能会给您一些关于如何执行此操作的想法。
DAX 不是这里的答案。我很惊讶没有人指出这一点。
Ivan 错了。
DAX 确实是读写缓存,但它不会捕获通过直接访问 DynamoDB(显然)发生的数据更改,也不会捕获通过 "other" DAX 集群发生的数据更改。
所以在这种情况下,
你有 2 个 DAX 集群,一个在 west-1,一个在 east-1,这两个集群是完全独立的。
因此,如果您通过 DAX 在 west-1 上进行数据更改,该更改会在 DynamoDB Table 级别 上传播到 east-1,而不是 the缓存(DAX)级别
换句话说,如果您更新从两个区域访问的记录(而不是缓存在两个 DAX 集群中),您仍然会遇到同样的问题。
从根本上讲,这是跨区域同步缓存层的问题,这很难。如果你真的需要它,有一些方法可以通过制作你自己的 Kafka 或 Kinesis 流来保持缓存条目的变化并被多区域的缓存集群使用。现在单独使用 elasticache 是不可能的。 (但如果您仅为此任务设置 lambda 或 EC2 是可能的)
签出 case studies from Netflix
需要有关以下 AWS 特定用例的最佳实践的信息,
- 我们的 Java Web 应用程序部署在 us-east-1 和 us-west-2 区域。
- 它与 Dynamo DB 通信,基于 Memcached 的 ElastiCache 位于两个区域的 Dynamo DB 之上。
- 我们在 us-east-1 和 us-west-2 之间启用了 Dynamo DB 复制。
- Route 53 将 API 呼叫定向到适当的区域。
现在,问题是当我们在 Dynamo DB 中创建或更新记录时,它会插入到 Dynamo DB 中并缓存在该特定区域中。记录也被复制到其他区域 Dynamo DB,但缓存不会保持同步,因为 ElastiCache 之间没有复制。
我们如何以最佳方式解决这个问题?
其他建议的一个选项是使用 DynamoDB DAX。它是一个直写缓存,这意味着您不需要将数据库数据与缓存同步。当您使用普通 DynamoDB API.
写入数据时,它会在幕后发生但如果您仍想使用 ElastiCache,可以使用 DynamoDB Streams。您可以实施一个 Lambda 函数,该函数将在 table 中的每次 DynamoDB 更新时触发,并将新数据写入 ElastiCache。
This 文章可能会给您一些关于如何执行此操作的想法。
DAX 不是这里的答案。我很惊讶没有人指出这一点。
Ivan 错了。
DAX 确实是读写缓存,但它不会捕获通过直接访问 DynamoDB(显然)发生的数据更改,也不会捕获通过 "other" DAX 集群发生的数据更改。
所以在这种情况下,
你有 2 个 DAX 集群,一个在 west-1,一个在 east-1,这两个集群是完全独立的。
因此,如果您通过 DAX 在 west-1 上进行数据更改,该更改会在 DynamoDB Table 级别 上传播到 east-1,而不是 the缓存(DAX)级别
换句话说,如果您更新从两个区域访问的记录(而不是缓存在两个 DAX 集群中),您仍然会遇到同样的问题。
从根本上讲,这是跨区域同步缓存层的问题,这很难。如果你真的需要它,有一些方法可以通过制作你自己的 Kafka 或 Kinesis 流来保持缓存条目的变化并被多区域的缓存集群使用。现在单独使用 elasticache 是不可能的。 (但如果您仅为此任务设置 lambda 或 EC2 是可能的) 签出 case studies from Netflix