我已通过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
以下是我的Google计算控制台中的Redis群集:
答案 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连接。