这个我想多了。
问:Amazon ElastiCache for Redis 为节点故障提供哪些选项?
Amazon ElastiCache for Redis 将通过获取新的服务资源来修复节点,然后将节点的现有 DNS 名称重定向到新的服务资源。因此,Redis 节点的 DNS 名称保持不变,但 Redis 节点的 IP 地址会随时间变化。如果您有一个具有一个或多个只读副本的复制组并且启用了多可用区,则在主节点发生故障的情况下,ElastiCache 将自动检测故障,选择一个副本并将其提升为新的主节点。它还将传播 DNS,以便您可以继续使用主端点,并且在升级后它将指向新升级的主端点。有关更多详细信息,请参阅此常见问题解答的多可用区部分。在禁用多可用区的情况下选择 Redis 复制选项时,如果主节点发生故障,您将可以选择启动到只读副本节点的故障转移。故障转移目标可以在同一个区域或另一个区域中。要故障回复到原始区域,请将原始区域中的只读副本提升为主区域。您可以选择构建您的应用程序以强制 Redis 客户端库重新连接到已修复的 Redis 服务器节点。这会有所帮助,因为某些 Redis 库在遇到通信错误或超时时会无限期地停止使用服务器。
解决方案是仅连接到主主节点,而不在客户端使用任何集群。当主节点失败时,从节点被提升并更新DNS,使从节点成为主节点,而无需在客户端更改主机。
为了防止发生故障转移时出现临时连接错误,您可以向 ioredis 添加一些配置:
var client = new Redis(port, host, {
retryStrategy: function (times) {
log.warn('Lost Redis connection, reattempting');
return Math.min(times * 2, 2000);
},
reconnectOnError: function (err) {
if (err.message.slice(0, targetError.length) === 'READONLY') {
// When a slave is promoted, we might get temporary errors saying
// READONLY You can't write against a read only slave. Attempt to
// reconnect if this happens.
log.warn('ElastiCache returned a READONLY error, reconnecting');
return 2; // `1` means reconnect, `2` means reconnect and resend
// the failed command
}
}
});