我们已经使用AWS Elasticache大约6个月了,没有任何问题。每天晚上我们都有一个Java应用程序运行,它将刷新我们的redis缓存的DB 0,然后用更新的数据重新填充它。但是我们在7月31日到8月5日之间有3个实例,我们的数据库成功刷新,然后我们无法将新数据写入数据库。
我们在申请中遇到以下异常:
redis.clients.jedis.exceptions.JedisDataException: redis.clients.jedis.exceptions.JedisDataException:READONLY你不能 写一个只读的奴隶。
当我们查看Elasticache中的缓存事件时,我们可以看到
从主节点prod-redis-001到副本节点的故障转移 prod-redis-002完成了
我们无法诊断问题,因为应用程序在过去6个月内运行正常,我想知道它是否与最近在6月30日发布的Elasticache版本有关。 https://aws.amazon.com/releasenotes/Amazon-ElastiCache
我们一直在写我们的主节点,我们只有1个副本节点。
如果有人可以提供任何见解,那将非常感激。
编辑:这似乎是一个间歇性的问题。有些日子,它会在其他日子里运转良好。答案 0 :(得分:5)
过去几周我们一直与AWS支持人员保持联系,这就是我们所发现的。
大多数Redis请求都是同步的,包括刷新,因此它会阻止所有其他请求。在我们的例子中,我们实际上是冲洗19米键,它需要超过30秒。
Elasticache会定期执行运行状况检查,并且由于刷新正在运行,运行状况检查将被阻止,从而导致故障转移。
我们一直在询问支持团队执行健康检查的频率,以便我们了解为什么我们的同花顺每周只会造成3-4次故障转移。我们能得到的最好答案是“我们每隔30秒就会想到它”。然而,我们的冲洗始终需要超过30秒并且不会一直失败。
他们说他们可能会实现配置健康检查时间的能力,但是他们说这不会很快完成。
他们可以给我们的最佳建议是:
1)创建一个全新的集群,用于加载新数据,和 而不是刷新以前的群集,重新指向您的应用程序 到新群集,并删除旧群集。
2)如果您要刷新的数据是数据的更新版本, 考虑不刷新,但更新和覆盖新密钥?
3)不要刷新数据,而是设置项目的到期时间 当你正常冲洗,并让钥匙回收(可能 随机时间避免雷鸣般的群体问题),然后重新加载 数据。
希望这会有所帮助:)