AWS Multi区域ElastiCache同步

时间:2017-08-09 14:33:07

标签: java amazon-web-services amazon-dynamodb amazon-elasticache

需要有关以下AWS特定用例的最佳做法的信息,

  1. 我们的Java Web应用程序部署在us-east-1和us-west-2区域。
  2. 它与Dynamo DB进行通信,基于Memcached的ElastiCache位于两个地区的Dynamo DB之上。
  3. 我们在us-east-1和us-west-2之间启用了Dynamo数据库复制。
  4. Route 53将API调用定向到适当的区域。
  5. 现在,问题是当我们在Dynamo DB中创建或更新记录时,它会被插入到Dynamo DB中并在特定区域中进行缓存。记录获取也被复制到其他区域Dynamo DB,但由于ElastiCache之间没有复制,因此缓存不会保持同步。

    我们如何以最佳方式解决此问题?

2 个答案:

答案 0 :(得分:2)

DAX在这里不是答案。我很惊讶没有人指出这一点。
伊万错了。

DAX确实是一种读写缓存,但是它不能捕获直接访问DynamoDB的数据更改(显然),也不会捕获通过“其他” DAX集群发生的数据更改。

在这种情况下,
您在西1有2个DAX集群,在东1有一个DAX集群,而这两个集群是完全独立的。 因此,如果您通过DAX在west-1上进行数据更改,则该更改确实会传播到 DynamoDB表级别,而不是 cache(DAX)级别 换句话说,如果更新从两个区域访问的记录(而不是在两个DAX群集中缓存的记录),您仍然会遇到相同的问题。

从根本上讲,这是跨不同区域同步缓存层的问题,这非常困难。如果您确实需要它,可以通过一些自己的Kafka或Kinesis流来实现,以保持Cache条目的更改并由多区域中的缓存集群使用。现在仅凭弹性疼痛是不可能的。 (但是,如果仅为此任务设置lambda或EC2,则可以这样做) 结帐case studies from Netflix

答案 1 :(得分:1)

其他建议的一个选项是使用DynamoDB DAX。它是一个直写缓存,这意味着您不需要将数据库数据与缓存同步。当您使用普通的DynamoDB API编写数据时,它会在窗帘后面发生。

但是如果您仍想使用ElastiCache,可以使用DynamoDB Streams。您可以实现一个Lambda函数,该函数将在表中的每个DynamoDB更新中触发,并将新数据写入ElastiCache。

This文章可能会为您提供有关如何执行此操作的一些建议。