与Redis群集的连接失败

时间:2015-08-19 06:50:45

标签: node.js redis cluster-computing node-redis google-cloud-console

我已通过Google compute Engine选项在click to deploy中设置了Redis群集。现在我想从我的节点js代码连接到这个redis服务器使用'ioredis'这里是我的代码连接到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

现在它抛出这个错误: enter image description here

以下是我的Google计算控制台中的Redis群集:

enter image description here

1 个答案:

答案 0 :(得分:8)

好的,我觉得这里有一个混乱。

Redis Cluster部署与number of standard Redis instances protected by Sentinel不同。两件截然不同的事情。

GCE的click-to-deploy选项部署了许多受Sentinel保护的标准Redis实例,而不是Redis Cluster。

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

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

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

当然,请检查主要的标记端口和名称。当主设备发生故障时,ioredis将自动管理切换到从设备实例,并且Sentinel将确保从设备在之前被提升为主设备。

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