【问题标题】:Connect to ElastiCache cluster via Node.js通过 Node.js 连接到 ElastiCache 集群
【发布时间】:2016-05-03 20:07:51
【问题描述】:

我对如何通过 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 结合使用的信息非常少。

【问题讨论】:

  • 对this有什么建议吗?

标签: node.js amazon-web-services redis amazon-elasticache redis-cluster


【解决方案1】:

我想多了。

问: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
    }
  }
});

【讨论】:

  • 这是否意味着你不再使用 Redis 集群模式了?
  • 不,它只是意味着那是抽象的。基本上,ElastiCache 只有一个集群端点可以连接,但如果该端点的节点出现故障,AWS 会自动将另一个从属节点提升为主节点。所以你会有一个临时的连接错误,但你应该能够立即重新连接到同一个主机,然后它会自动连接到集群中的另一个节点。
  • 据我了解,这基本上就像在集群前面有一个负载均衡器,如果节点变得不健康,它会删除节点。
  • @MMiller 你确定吗?来自blog post:正如我们稍后将讨论的,支持集群的 Redis 客户端允许您指定单个端点,然后在内部透明地映射到集群中的节点。 据我了解,客户端使用主要端点来获取节点配置并使用它通过散列键选择正确的节点。虽然我也在寻找这个问题的答案,但我可能是错的。
  • @MMiller 好消息是,如果节点或可用区出现故障,非集群模式也应该选择另一个主节点(只要您有 >1 个实例)。只有当您需要数百万 RPS 或 TB 的数据时,才真正需要集群模式。
猜你喜欢
  • 2017-10-07
  • 2016-10-23
  • 2015-11-21
  • 2019-09-12
  • 2020-03-31
  • 1970-01-01
  • 1970-01-01
  • 2015-02-10
  • 2019-07-01
相关资源
最近更新 更多