跨不同数据中心的多个 VPS 集的负载平衡/故障转移

use*_*921 5 domain-name-system vps high-availability load-balancing round-robin

我知道已经问过这个问题的许多变体,但我仍然找不到满足我需求的好答案。

我想要做的是设置几个(至少 2 个)VPS来托管我的网络应用程序。我想提供一些负载平衡(使用 Varnish 很容易实现)和相对较高的可用性 - 这是我的问题。

使用负载平衡器(我需要在其中一个 VPS 上托管)会引入单点故障,这几乎与只有一台机器来提供内容一样糟糕。

http://i.stack.imgur.com/lFafj.png

而且 AFAIK DNS 循环方法不仅是负载平衡的坏主意,而且不提供故障转移机制。如果其中一台服务器出现故障,一些人(使用缓存的 DNS IP)仍会尝试连接到不可用的服务器。忘记短 TTL - 这不是正确的解决方案。

http://i.stack.imgur.com/mTLRf.png

需要考虑的一件非常重要的事情:我希望将我的VPS 划分到多个数据中心,这样如果一个数据中心的电力或 ISP 出现故障,网站就不会关闭。

我能想到的唯一 2 个解决方案是依赖 dns 循环(如果服务器出现故障,至少将内容提供给一定比例的用户直到恢复),或者在数据中心购买专用服务器,为停电​​做好准备并配备有几个互联网连接(与租用甚至 10 个 VPS 相比,这是非常昂贵的)。

所以问题是:在拥有多个负载平衡 VPS 时避免单点故障的正确方法什么?

请原谅图片。它们只是我的意思的基本示例。

Mar*_* M. 4

笔记:

你愿意花多少钱,我还没有看到有人依赖 VPS 并且真的愿意为数据中心故障案例花钱。

关于你的图纸:

当(且仅当)负载均衡器是一台机器时,第一个失败是正确的,如果它是单个系统(如在由多个主机构建的系统中),则它不再正确。

SPA(最短的可能答案):

非常简短的回答:您需要获得一个在您的所有位置都可用的服务 IP。并设置BGP路由。

稍微长一点:通常这是通过使用 BGP 并在 2 个不同位置公布 IP 来完成的。您可以将其设置为始终公布 IP,但其中一个的优先级低于另一个。这样,在正常情况下,您的流量将仅流向一个站点,如果失败,BGP 路由将被丢弃,并且流量会切换到仍然可用的 IP。

我们有一些与此类似的设置,典型的布局是:

(每个地点):

  • 2 个负载均衡器

    这也是 BGP 运行并公布其 IP 的地方。通常是 Quagga 和一些 IPVS 设置(我们使用 keepalived)

  • n处理负载的服务器 (FE)

失败案例:

  • 任何 1 个负载均衡器(位于单个站点)失败

    • 由 keepalived 处理,其他 LB 将继续其工作
  • 任何n-kFE 失败(k即在我们不会遇到问题的情况下可能发生故障的 FE 的数量)

    • 由负载均衡器处理,检查后会将它们删除,并且它们不会再收到任何流量
  • n-(k+1)FE 失败(在单个站点)

    • 由 BGP 处理。我们将在过多 FE 发生故障的站点终止 LB 上的 BGP 会话。另一个位置接管
  • 单个站点的任何重大中断

    • 由BGP处理,BGP会话将被丢弃,其他位置跳入

很抱歉,我现在没有心情进一步了解手动执行此操作的细节。我的猜测是,租用负载均衡器服务会更好(而且更便宜),它将为您带来魔力。我读过亚马逊提供了这些,但我不知道在不使用其其余基础设施的情况下是否可以使用它们。