问题描述
当使用Azure Redis 集群服务时候,发生了Moved的几点分析
问题分析
1. 关于 Moved 问题,原因有可能是内存碎片整理,从而引起Redis发生failover。
2. 内存碎片多数情况是由于key值较大导致的,同时内存使用率较高也会影响内存碎片,从可以根据Redis的Memory指标判断(Used memory RSS比Used memory高不少),由于内存碎片会降低Redis的可用性以及Redis本身内存的不足,所以服务端会在碎片率较大的时候选择整理,该动作会导致failover,而此时客户端就会有moved的报错,原因在于切换前的master被关闭,发生failover。
3. 在Redis进行缩放操作(scale out) 期间,客户端也会出现Moved异常。
4. 关于timeout,可以从慢指令(slowlog)中发现执行超时的均为eval执行lua脚本时超时。执行eval通常是在事务中执行,且从堆栈上看出执行了exists命令,目的是否是为了加分布式锁呢?由于这个命令时间复杂度为O(N),所以建议使用 SCAN 代替该操作。
5. 当内存使用率较高的情况,可以参考以下几个:
- 减小redis中存储的值的大小,文档中建议在100kb以下:https://docs.azure.cn/zh-cn/azure-cache-for-redis/cache-best-practices-memory-management#configure-your-maxmemory-reserved-setting
- 增加分片数量 : https://docs.azure.cn/zh-cn/azure-cache-for-redis/cache-how-to-premium-clustering#change-the-cluster-size-on-a-running-premium-cache
- 提升定价层 :https://docs.azure.cn/zh-cn/azure-cache-for-redis/cache-how-to-scale