9

我对如何通过 Node.js 连接到 AWS 的 ElastiCache Redis 感到困惑。我已经成功地通过 node_redis NPM 连接到主主机 (001),但我无法使用 ioredis 的集群能力,因为显然 ElastiCache 没有实现 CLUSTER 命令。

我认为必须有另一种方法,但适用于 Node 的 AWS 开发工具包只有用于管理 ElastiCache 的命令,而不是用于实际连接它的命令。

如果不使用 CLUSTER,我担心如果主节点发生故障,我的应用程序将无法进行故障转移,因为我无法回退到其他集群。当主切换时,我也从我的 Redis 客户端收到错误,我Error: READONLY You can't write against a read only slave.不确定如何优雅地处理。

这是我想太多了吗?我发现关于将 ElastiCache Redis 集群与 Node.js 一起使用的信息非常少。

4

1 回答 1

8

这个我想多了。

问: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
    }
  }
});
于 2016-01-27T17:58:47.433 回答