我对如何通过Node.js连接到AWS的ElastiCache Redis感到困惑。我已成功通过node_redis NPM连接到主要主机(001),但我无法使用ioredis的群集功能,因为显然ElastiCache没有实现CLUSTER命令。
我认为必须有另一种方式,但AWS SDK for Node只有管理ElastiCache的命令,而不是实际连接它。
如果不使用CLUSTER,我担心如果主节点出现故障,我的应用程序将无法进行故障转移,因为我无法回退到其他群集。当主人切换时,我也从我的Redis客户端Error: READONLY You can't write against a read only slave.
收到错误,我不确定如何正常处理。
我是否过度思考这个?我发现很少有关于使用带有Node.js的ElastiCache Redis集群的信息。
答案 0 :(得分:6)
我在想这个。
问: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
}
}
});