ioredis-ClusterAllFailedError:无法刷新插槽缓存

时间:2019-08-04 23:50:32

标签: node.js redis

我正在处理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。还有其他人处理过这个问题吗?

谢谢。

2 个答案:

答案 0 :(得分:2)

以下对我有用。

Redis版本:位于AWS ElastiCache上的 5.0.4 已启用TLSAUTH的群集。

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),