ioredis - ClusterAllFailedError: Failed to refresh slots cache

ioredis - ClusterAllFailedError: Failed to refresh slots cache

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

谢谢。

以下适合我。

Redis 版本5.0.4AWS ElastiCache 上与 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>
                }
            });

启动 ElastiCache 时,您需要指定一个或多个 Subnet Group(通常为私有子网)和 Security Group。当您 运行 来自任何计算(Lambda、EC2 等)的上述代码时,您需要确保以下内容

  • ElastiCache 可从您的计算访问(将计算放在可以与同一 VPC 中的 ElastiCache 的子网通信的子网中)。如果计算和 Elasticache 在不同的 VPC 上,确保在它们之间启用 VPC 对等。)
  • 确保 Security GroupNACL 允许从您的计算 Subnet[=50= 连接到 ElastiCache 端口(6379 是默认端口) ]
  • 最后确保 Compute 可以承担 IAM Role(EC2 实例配置文件、Lambda 角色等),该 IAM Role(EC2 实例配置文件、Lambda 角色等)可以适当访问 ElastiCache。如果您在 EC2 实例上 运行ning,请确保您的代码使用 EC2 实例配置文件中分配的角色的临时凭证。

这对我有用,但是我在打字稿中使用它时遇到了一些小技巧,在将 null 传递给回调函数的第一个参数时遇到了问题,该回调函数期望 NodeJS.ErrnoException 并且不允许使用任何类型(由于 eslint no-explicit-any 规则)。

我在 dnsLookup 上面使用了 @ts-expect-error 指令

    // @ts-expect-error this will ignore error
    dnsLookup: (address, callback) => callback(null, address),