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.4 在 AWS ElastiCache
上与 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>
}
});
启动 ElastiCache
时,您需要指定一个或多个 Subnet Group
(通常为私有子网)和 Security Group
。当您 运行 来自任何计算(Lambda、EC2 等)的上述代码时,您需要确保以下内容
ElastiCache
可从您的计算访问(将计算放在可以与同一 VPC
中的 ElastiCache
的子网通信的子网中)。如果计算和 Elasticache
在不同的 VPC 上,确保在它们之间启用 VPC 对等。)
- 确保
Security Group
、NACL
允许从您的计算 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),
我正在处理来自 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.4 在 AWS ElastiCache
上与 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>
}
});
启动 ElastiCache
时,您需要指定一个或多个 Subnet Group
(通常为私有子网)和 Security Group
。当您 运行 来自任何计算(Lambda、EC2 等)的上述代码时,您需要确保以下内容
ElastiCache
可从您的计算访问(将计算放在可以与同一VPC
中的ElastiCache
的子网通信的子网中)。如果计算和Elasticache
在不同的 VPC 上,确保在它们之间启用 VPC 对等。)- 确保
Security Group
、NACL
允许从您的计算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),