如何使用多节点连接串连接Redis集群,ioredis报ClusterAllFailedError怎么解决
排查步骤
该报错本质是ioredis无法成功连接到任意集群节点拉取槽位映射信息,按以下顺序逐一排查:
- 首先验证网络连通性
在运行代码的机器上执行nc -zv 172.x.x.x 6379分别测试三个集群节点的端口连通性,如无法连通先检查机器防火墙、Redis服务端的bind配置、云服务器安全组规则是否放行了当前客户端IP。 - 验证权限配置
确认填写的集群密码正确,且对应账号拥有CLUSTER SLOTS命令的执行权限,ioredis初始化阶段必须调用该拉取槽位信息,无权限会直接触发该报错。 - 检查集群本身状态
登录任意一个Redis集群节点,执行CLUSTER INFO命令,确认cluster_state字段值为ok,如果集群本身处于故障状态,槽位信息拉取也会失败。 - 补全ioredis配置项并调整调用逻辑
你的现有配置缺少连接超时、就绪检查等必要参数,且在集群未完成初始化前就发送命令,建议修改为以下代码:
const Redis = require("ioredis"); const cluster = new Redis.Cluster([ { port: 6379, host: "172.x.x.x", }, { port: 6379, host: "172.x.x.x", }, { port: 6379, host: "172.x.x.x", }, ], { redisOptions: { password: "ssffvggfg", connectTimeout: 10000, // 连接超时设为10秒,避免网络抖动直接失败 }, enableReadyCheck: true, // 开启就绪检查,集群初始化完成后才触发ready事件 maxRedirections: 16, // 槽位重定向最大次数 // 若集群节点内部注册IP无法被当前客户端访问,需添加NAT映射,替换为你实际的映射关系即可 // natMap: { // "节点内部注册IP:端口": "客户端可访问的对外IP:端口" // } }); // 监听集群就绪事件后再执行业务操作 cluster.on('ready', () => { cluster.set("foo", "bar"); cluster.get("foo", (err, res) => { console.log(res); }); }); // 添加错误监听,打印详细错误信息方便定位 cluster.on('error', (err) => { console.error('集群连接异常', err); });
- 排查节点注册IP映射问题
如以上配置调整后仍报错,在Redis节点执行CLUSTER SLOTS命令,查看返回的节点IP是否和你代码中填写的172段IP一致。如果不一致(比如节点内部用127.0.0.1或其他私网IP注册),需要在配置中添加natMap参数做IP映射。
内容的提问来源于stack exchange,提问作者user557657
相关产品推荐
相关产品推荐

