replyerror:连接到redis群集后发生移动错误

vltsax25  于 2021-06-09  发布在  Redis
关注(0)|答案(1)|浏览(879)

我正在构建一个连接到redis的nodejs应用程序。我用我的redis本地示例处理这个。现在,我正在使用 ioredis 从我的nodejs应用程序连接到aws中k8s中的redis集群。这就是我所拥有的。

const Redis = require("ioredis");

this.redis = new Redis({
 port: 6379, // Redis port
 host: rhost, // Redis host
 password: password
});

this.redis.on('connect', () => {
 console.log('connected to redis')
})

似乎我成功地连接到我的集群作为消息 connected to redis 在日志上打印出来。但是,每次尝试使用redis对象时,都会出现移动错误:

UnhandledPromiseRejectionWarning: ReplyError: MOVED 5011 <ip address>:6379
  at parseError (/node_modules/ioredis/node_modules/redis-parser/lib/parser.js:179:12)
  at parseType (/node_modules/ioredis/node_modules/redis-parser/lib/parser.js:302:14)

连接在我的本地服务器上工作。然而,在美国焊接学会(aws)中却不是这样。我试着用 Redis.Cluster 对象而不是 Redis ,但在我部署应用程序之后,应用程序挂起,连接事件从不触发。这个 close 以及 reconnecting 事件似乎在无限循环。
据我所知,这是集群中节点之间重定向的问题。可能是主/从配置的问题。错误是aws中的配置问题吗?我需要用电脑吗 Redis.Cluster 对象而不是平面 Redis 示例?修复移动错误的最佳方法是什么?

pvcm50d1

pvcm50d11#

这个 MOVED 错误是由于直接使用redis客户端和elasticache的配置端点(redis集群模式)造成的。这可以通过使用 new Redis.Cluster([{ host: <cfg-endpoint>]) 它知道多个shard或者通过禁用redis集群模式(单shard)和使用主(主)dns名称。
即使没有redis集群模式,仍然有一个故障转移策略(当主节点发生故障时,aws将替换主节点),并且您可以将节点部署到多个可用区域。
此外,如果启用了加密,则需要连接到启用tls的aws elasticache( tls: {} ioredis的选项)。
https://aws.amazon.com/blogs/database/work-with-cluster-mode-on-amazon-elasticache-for-redis/

相关问题