我正在构建一个连接到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
示例?修复移动错误的最佳方法是什么?
1条答案
按热度按时间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/