问题现象
用户在使用 Node.js ioredis 连接到 Redis 分片集群,报错如下:
ClusterAllFailedError: Failed to refresh slots cache.
at tryNode (/root/node_modules/ioredis/built/cluster/index.js:308:31)
at /root/node_modules/ioredis/built/cluster/index.js:325:21
问题复现
准备如下 Node.js 脚本,实现基本的连接,set key,get key 逻辑:
const Redis = require('ioredis');
// create client
const redis = new Redis.Cluster([
{ host: 'redis-xxxxxxx.redis.ivolces.com', port: 6379 }
],
{
slotsRefreshTimeout:300,
slotsRefreshInterval:1,
redisOptions: {
password: "your password",
},
}
);
redis.on('connect', () => {
console.log('successfully connect to redis cluster');
});
redis.on('error', (err) => {
console.error('An error occurred while connecting to the cluster.:', err);
});
// set a key
redis.set("mykey", "value");
// get a key
redis.get("mykey", (err, result) => {
if (err) {
console.error(err);
} else {
console.log(result); // Prints "value"
}
});
根因和解决方案
ioredis 可以兼容火山引擎 Redis,出现 ClusterAllFailedError: Failed to refresh slots cache 报错通常有如下两类场景:
- 密码错误:在连接时指定的密码错误,导致无法客户端无法连接到 Redis 分片集群
- 网络连通性:需要保证客户端与 Redis Cluster 的网络连通性:
- 如果使用私网地址,那么客户端所在的 ECS 实例与目标 Redis 实例在同一 VPC 网络。
- ECS 的 IP 地址或客户端 IP 地址是否已加入 Redis 实例的 IP 白名单中。设置白名单的方法,请参见设置白名单。
参考文档