AWS ElastiCache Redis OSS(集群模式)- Go-Redis 客户端不断出现 MOVED 错误

问题描述 投票:0回答:1

大家

我使用的是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 错误和数据检索失败。

我已经被这个问题困扰好几天了,希望得到任何帮助或对可能出现问题的见解。如果有人能指出我可能缺少的内容,我将非常感激。

谢谢!

amazon-web-services go redis go-redis
1个回答
0
投票

MOVED
当拓扑更改时会出现错误,原因可能有多种,例如故障转移、断开连接、缩小或缩小、手动更改、角色更改等。

我检查了 go-redis,如果我很友善的话,我认为拓扑刷新(用他们的术语来说是状态)背后的逻辑并不理想,而且你甚至无法配置定期检查。

拓扑变化识别的问题几乎在所有客户端中都很常见,我每天都在处理它,但似乎如果不发生错误,go-redis 根本不会触发它,这是一个极端的情况。

如果您看到很多动作,请尝试每 30/60 秒运行一次

ClusterClient.ReloadState()
。对于大多数情况应该可以解决。 请注意,每个调用都会花费一些性能代价,但您的集群并不大,所以对您来说,它并不昂贵,并且通过更少的移动,您将获得更好的整体性能。

无需添加多个端点,这实际上是一个坏主意。 通过发送

cluster slots
并从服务器获取拓扑视图来检索状态。 使用多个端点不会有帮助,并且由于节点端点可以更改,但配置端点不能更改,因此您应该仅使用配置来避免错误。

移动的重定向可能会发生的情况是,它的构建不正确,并且在移动时刷新拓扑的线程需要时间来更新其他线程。 当进行移动时,所有连接都需要时间来了解新的集群视图。 因此,您继续执行接下来的几个命令,降低重定向没有帮助,它只是将更多命令发送到错误的分片。 但这只是一个假设。

如有更多问题或后续问题,请随时联系。

© www.soinside.com 2019 - 2024. All rights reserved.