4

我通过单击部署选项在Google 计算引擎中设置了 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

现在它抛出这个错误: 在此处输入图像描述

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

在此处输入图像描述

4

1 回答 1

9

好的,我认为这里有一个混乱。

Redis 集群部署与许多受Sentinel 保护的标准 Redis 实例不同。两种截然不同的东西。

GCE 的单击部署选项部署了许多受 Sentinel 保护的标准 Redis 实例,而不是 Redis 集群。

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'
});

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

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

于 2015-08-24T07:31:58.143 回答