我通过点击部署选项在Google compute Engine中设置了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
现在它抛出这个错误:
这是我的谷歌计算控制台中的Redis群集:
好吧,我觉得这里有一个混乱.
一个Redis的集群部署不比相同数量的受Sentinel保护标准的Redis实例.两件非常不同的事情.
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连接.