AWS 替代 DNS 故障转移?

And*_*i G 5 failover high-availability amazon-web-services amazon-elb amazon-route53

我最近开始阅读和使用 AWS。我对可以使用该平台实现的不同高可用性架构特别感兴趣。具体来说,我正在寻找一个可靠的穷人解决方案,可以使用最少的服务器来实现。

到目前为止,我对主要 HA 问题的解决方案感到满意:负载平衡、冗余、自动恢复、可扩展性......

我唯一的症结是故障转移解决方案。

使用 ELB 可能看起来很棒,但 ELB 实际上在幕后使用 DNS 平衡。请参阅AWS 的弹性负载均衡器是否存在单点故障?. 同样来自 Netflix 博客文章:Netflix 从 AWS 中断中学到的教训

这是因为 ELB 是一个两层负载均衡方案。第一层包括基本的基于 DNS 的循环负载平衡。这将客户端带到云中的 ELB 端点,该端点位于您的 ELB 配置为使用的区域之一中。

现在,我了解到 DNS 故障转移并不是一个理想的解决方案,正如其他人指出的那样,主要是因为不可预测的 DNS 缓存。参见示例:为什么不推荐 DNS 故障转移?.

除了 ELB,在我看来,大多数 AWS HA 架构都依赖于使用路由 53 的 DNS 故障转移。

最后,浮动 IP/弹性 IP (EIP) 策略出现在极少数文章中,例如利用多个 IP 地址进行虚拟 IP 地址故障转移,我很难弄清楚这是否是一个生产系统的可行解决方案。此外,我遇到的所有示例都使用一组主动-被动实例实现了这一点。为每个主动者都拥有一个被动者来实现这一目标似乎是一种浪费。

有鉴于此,我想问您什么是执行故障转移的更快更可靠的方法?

更具体地说,请讨论如何在不使用 DNS的情况下对以下 2 个设置执行故障转移:

  1. 2 个双活 EC2 实例位于单独的 AZ 中。主动-主动,因为这是一个预算设置,如果我们负担不起一个实例闲置。

  2. 1 个 ELB 和区域 A 中的 2 个 EC2 实例,1 个 ELB 和区域 B 中的 2 个 EC2 实例。同样,这两个区域都处于活动状态并为流量提供服务。您如何处理从 1 个 ELB 到另一个 ELB 的故障转移?

Mic*_*bot 2

如果您像我一样好奇,那么通过使用 ELB,您会更好地理解它。

在 2 个可用区中配置的“1”ELB 按 1 个计费,但部署为 2 个。分配了 2 个 IP 地址,每个平衡器一个,并自动创建 2 个 A 记录,每个记录一个,TTL 非常短。

这 2 个平衡器中的每一个都会将流量转发到同一可用区中的实例,或者您可以启用跨可用区负载平衡(如果每个可用区中只有 1 个服务器实例,则应该启用)。

这些 IP 地址不会经常更改,尽管按理说 ELB 会像其他任何东西一样失败,但我可能有 30 个 IP 地址,并且从来没有在知情的情况下手上有一个已失效的 IP 地址,大概是因为 ELB 基础设施将替换已失效的实例并发生变化DNS 无需您的干预。

对于 2 个区域,除了在某种程度上使用 DNS 之外,您别无选择。来自 Route 53 的基于延迟的路由可以在正常操作中将人们发送到最近的站点,并在整个区域发生中断(由 Route 53 运行状况检查检测到)时将所有流量路由到另一个站点,但这样做有点麻烦当整个区域不可用时,更有可能遇到 DNS 缓存问题。

当然,使用弹性 IP 的单个区域中的部分主动/被动困境可以通过两个应用程序服务器上的 HAProxy 轻松解决。它是一个类似于 ELB 的 http 请求路由器和负载均衡器,但具有更广泛的功能集。该代码非常紧凑,您可以在应用程序服务器上运行它,而 CPU 消耗可以忽略不计。然后,具有 EIP 的实例将平衡其本地应用程序服务器和对等方之间的流量。跨区域,如果本地区域已启动,但由于某种原因应用程序无法处理来自本地区域的请求,ELB 后面的 HAProxy 可以将流量转发到远程区域中的伙伴。(我使用这样的设置来提高外部服务的可用性,当来自本地区域的直接 Internet 路径不起作用时,将请求退回到远程 AWS 区域。)