连接到 Redis 集群失败

Connection to Redis cluster failed

我在 Google compute Engine by click to deploy 选项中设置了 Redis 集群。现在我想使用 'ioredis' 从我的节点 js 代码连接到这个 redis 服务器这是我连接到单个 redis 实例的代码

var Redis = require("ioredis");

var store = new Redis(6379, 'redis-ob0g');//to store the keys
var pub =   new Redis(6379, 'redis-ob0g');//to publish a message to all workers
var sub =   new Redis(6379, 'redis-ob0g');//to subscribe a message 

var onError = function (err) {
    console.log('fail to connect to redis ',err);
};
store.on('error',onError);
pub.on('error',onError);
sub.on('error',onError);

它奏效了。现在我想作为集群连接到redis,所以我将代码更改为

/**
 * list of server in replica set
 * @type {{port: number, host: string}[]}
 */
var nodes =[
    {   port: port,    host: hostMaster},
    {   port: port,    host: hostSlab1},
    {   port: port,    host: hostSlab2}
];
var store =  new Redis.Cluster(nodes);//to store the keys
var pub =   new Redis.Cluster(nodes);//to publish a message to all workers
var sub =    new Redis.Cluster(nodes);//to subscribe a message channel

现在它抛出这个错误:

这是我的 google 计算控制台中的 Redis 集群:

好吧,我觉得这里有点混乱。

一个Redis Cluster deployment is not the same than a number of standard Redis instances protected by Sentinel。两种截然不同的东西。

GCE 的点击部署选项部署了一些受 Sentinel 保护的标准 Redis 实例,而不是 Redis Cluster。

ioredis 可以处理这两种部署,但您必须使用相应的 API。在这里,您尝试使用 Redis 集群 API,导致此错误(标准 Redis 实例未激活与集群相关的命令)。

根据 ioredis 文档,您应该连接:

var redis = new Redis({
    sentinels: [{ host: hostMaster, port: 26379 },
                { host: hostSlab1, port: 26379 },
                { host: hostSlab2, port: 26379 } ],
    name: 'mymaster'
});

当然要检查哨兵端口和master的名字。 ioredis 会自动管理当 master 失效时切换到 slave 实例,而 sentinel 会确保 slave 在之前被提升为 master。

请注意,由于您使用 pub/sub,您将需要多个 redis 连接。