大家
我使用的是AWS ElastiCache Redis OSS(集群模式),有3个分片,每个分片有3个节点,总共9个节点。
我还使用 Golang 中的 go-redis 库来连接到 Redis 集群。
我面临的问题是我经常遇到 MOVED 错误。
这是我用于初始设置的代码片段:
option := new(redis.ClusterOptions)
option.Addrs = []string{"qekc.clustercfg.usw1.cache.amazonaws.com:7480"} // configuration endpoint
option.Username = config.Username
option.Password = config.Password
option.ReadTimeout = time.Duration(config.Timeout) * time.Second
option.PoolSize = config.PoolSize
option.MaxRetries = 10
option.MaxRedirects = 20
option.ReadOnly = false
option.RouteByLatency = false
option.RouteRandomly = false
cluster.client = redis.NewClusterClient(option)
if pingResult, pingErr := cluster.client.Ping(ctx).Result(); pingErr != nil {
log.Error().Msgf("ping err: %v", pingErr)
}
这是我的初始设置代码。
根据我在线研究的内容,我尝试在 Addrs 字段中添加所有节点端点,并且还尝试仅使用单个节点端点。但问题仍然存在。
当我将 MaxRedirects 减小到非常低的值时,MOVED 错误的频率似乎增加,这表明它与重定向逻辑有关。
据我了解,使用ClusterClient时,在Redis中对节点进行shuffle时可能会出现MOVED错误,但客户端应该自动找到正确的节点并完成请求。因此,我预计 MaxRedirects 值为 20 就足够了,但我仍然看到 MOVED 错误和数据检索失败。
我已经被这个问题困扰好几天了,希望得到任何帮助或对可能出现问题的见解。如果有人能指出我可能缺少的内容,我将非常感激。
谢谢!
MOVED
当拓扑更改时会出现错误,原因可能有多种,例如故障转移、断开连接、缩小或缩小、手动更改、角色更改等。
我检查了 go-redis,如果我很友善的话,我认为拓扑刷新(用他们的术语来说是状态)背后的逻辑并不理想,而且你甚至无法配置定期检查。
拓扑变化识别的问题几乎在所有客户端中都很常见,我每天都在处理它,但似乎如果不发生错误,go-redis 根本不会触发它,这是一个极端的情况。
如果您看到很多动作,请尝试每 30/60 秒运行一次
ClusterClient.ReloadState()
。对于大多数情况应该可以解决。
请注意,每个调用都会花费一些性能代价,但您的集群并不大,所以对您来说,它并不昂贵,并且通过更少的移动,您将获得更好的整体性能。
无需添加多个端点,这实际上是一个坏主意。 通过发送
cluster slots
并从服务器获取拓扑视图来检索状态。
使用多个端点不会有帮助,并且由于节点端点可以更改,但配置端点不能更改,因此您应该仅使用配置来避免错误。
移动的重定向可能会发生的情况是,它的构建不正确,并且在移动时刷新拓扑的线程需要时间来更新其他线程。 当进行移动时,所有连接都需要时间来了解新的集群视图。 因此,您继续执行接下来的几个命令,降低重定向没有帮助,它只是将更多命令发送到错误的分片。 但这只是一个假设。
如有更多问题或后续问题,请随时联系。