我正在构建一个连接到redis的nodejs应用程序。我用我本地的redis实例实现了这一点。现在,我正在使用ioredis从我的nodejs应用程序连接到我在亚马逊网络服务的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实例吗?修复已移动错误的最佳方法是什么?
发布于 2020-11-17 16:41:19
直接使用Redis客户端和ElastiCache (Redis集群模式)的配置端点导致MOVED错误。这可以通过使用new Redis.Cluster([{ host: <cfg-endpoint>])来解决,它可以识别多个分片。
否则,禁用Redis集群模式,并使用您的ElastiCache集群的主(主) dns名称。即使没有Redis集群模式,仍然存在故障转移策略(AWS将在主节点发生故障时替换主节点),并且您可以将节点部署到多个可用性区。
此外,当您启用加密时,您将需要连接到启用了TLS的AWS ElastiCache (ioredis的tls: {}选项)。
https://aws.amazon.com/blogs/database/work-with-cluster-mode-on-amazon-elasticache-for-redis/
发布于 2021-07-03 07:03:47
您可以在这里了解更多关于移动错误的信息:https://redis.io/topics/cluster-spec#moved-redirection“已移动重定向Redis客户端可以自由地向集群中的每个节点发送查询,包括从节点。节点会分析查询,如果可以接受(即查询中只提到一个键,或者提到的多个键都在同一个哈希槽中),它会查找哪个节点负责一个或多个键所属的哈希槽。
如果哈希槽由节点提供服务,则简单地处理查询,否则节点将检查其内部哈希槽到节点的映射,并将向客户端回复已移动的错误,如下例所示:
GET x -MOVED 3999 127.0.0.1:6381错误包括键的哈希槽(3999)和可以服务于查询的实例的ip:port。客户端需要重新向指定节点的IP地址和端口发出查询。注意,即使客户端在重新发出查询之前等待了很长时间,并且在此期间集群配置改变,如果散列时隙3999现在由另一节点服务,则目的地节点将再次回复移动的错误。如果联系的节点没有更新的信息,也会发生同样的情况。“
ioredis支持redis集群。因此,您应该像这样创建redis集群:
new Redis.Cluster([{
host: process.env.REDIS_ENDPOINT, // Configuration endpoint address from Elasticache
port: process.env.REDIS_PORT
}]);ioredis将处理移动重定向错误。
发布于 2021-08-05 14:56:17
如果这不起作用,请使用:
const Redis = require('ioredis');
const ioCluster = new Redis.Cluster([redisConfig.redis]);
const slackQueue = new Queue('slack notifications', {
prefix: '{slack}' ,
createClient: () => ioCluster
});
const emailQueue = new Queue('email notifications', {
prefix: '{email}' ,
createClient: () => ioCluster
});我会放弃,或者尝试将redis引擎降级到4.x ioredis
https://stackoverflow.com/questions/64374113
复制相似问题