我正在处理ioredis和Elasticache的ClusterAllFailedError: Failed to refresh slots cache.
问题。这是我的集群配置
const clusterOptions = {
enableReadyCheck: true,
retryDelayOnClusterDown: 300,
retryDelayOnFailover: 1000,
retryDelayOnTryAgain: 3000,
slotsRefreshTimeout: 200000000000000,
clusterRetryStrategy: (times) => Math.min(times * 1000, 10000),
dnsLookup: (address, callback) => callback(null, address),
scaleReads: 'slave',
showFriendlyErrorStack: true,
redisOptions: {
keyPrefix: config.queue.prefix,
autoResubscribe: true,
autoResendUnfulfilledCommands: true
}
}
const redisClientInstance = new Redis.Cluster([{ host: '', port: ''}], clusterOptions);
但是尝试访问Redis总是导致Failed refresh slots cache
。还有其他人处理过这个问题吗?
谢谢。
答案 0 :(得分:2)
以下对我有用。
Redis版本:位于AWS ElastiCache
上的 5.0.4 已启用TLS
和AUTH
的群集。
ioredis版本: 4.16.0
连接代码:
const redis = new Redis.Cluster(
[{ "host": <ELASTI_CACHE_CONFIGURATION_ENDPOINT> }], {
dnsLookup: (address, callback) => callback(null, address),
redisOptions: {
tls: true,
password: <ELASTI_CACHE_REDIS_AUTH>
}
});
确保您在正确的VPC,子网和安全组中,以正确的IAM角色连接到ElastiCache。
答案 1 :(得分:0)
这对我有用,但是由于我在打字稿中使用它时遇到了小小的麻烦,在将null传递给期望NodeJS.ErrnoException
的回调函数的第一个参数时遇到了问题,并且不想使用任何类型(由于eslint no-explicit-any
规则)。
我在dnsLookup上方使用了@ ts-expect-error指令
// @ts-expect-error this will ignore error
dnsLookup: (address, callback) => callback(null, address),