我知道这个问题已经被问过很多次了,但我仍然找不到一个能满足我需要的好答案。
我想要做的是设置一些(至少 2 个) VPS托管我的网络应用程序。我想提供一些负载均衡(使用 Varnish 很容易实现),以及可用性相对较高-这是我的问题。
使用负载均衡器(我需要在一台 VPS 上托管)会带来单点故障这几乎和只有一台机器来提供内容一样糟糕。
https://i.stack.imgur.com/lFafj.png
据我所知DNS 循环这种方法不仅不利于负载平衡,而且没有提供故障转移机制。如果其中一个服务器出现故障,某些人(使用缓存的 DNS IP)仍会尝试连接到不可用的服务器。忘记短 TTL- 这是不是正确的解决方案。
https://i.stack.imgur.com/mTLRf.png
需要考虑的一个非常重要的事情是:我希望VPS 分布在多个数据中心,因此如果一个数据中心的电力或 ISP 出现故障,网站也不会瘫痪。
我能想到的唯一两个解决方案是,要么依靠 DNS 循环(并且在服务器出现故障的情况下至少向一定比例的用户提供内容直到恢复),要么在数据中心购买专用服务器,为停电做好准备并配备多个互联网连接(与租用 10 个 VPS 相比,这非常昂贵)。
所以问题是: 在拥有多个负载平衡 VPS 时避免单点故障的正确方法是什么?
请原谅这些图片。它们只是我所表达意思的最基本的例子。
答案1
笔记:
您愿意花多少钱,我还没有看到有人依赖 VPS 并真正愿意为数据中心故障案例花钱。
关于你的绘画:
第一个失败当且仅当负载均衡器是单台机器时才成立,如果它是一个单一系统(如由多台主机构建的系统),则不再成立。
SPA(最简短的答案):
答案很简单:您需要获取一个在所有位置都可用的服务 IP。并设置 BGP 路由。
稍微长一点:通常,这是通过使用 BGP 并在 2 个不同位置宣布 IP 来实现的。您可以设置 IP 始终宣布,但其中一个 IP 的优先级低于另一个 IP。这样,在正常情况下,您的流量将只流向一个站点,如果该站点失败,BGP 路由将被丢弃,流量将切换到仍然可用的 IP。
我们有几个类似的设置,典型的布局是:
(每个位置):
2 个负载均衡器
这是 BGP 运行和公布其 IP 的地方。通常是 Quagga 和一些 IPVS 设置(我们使用 keepalived)
n
处理负载的服务器(FE)
失败案例:
任何 1 个负载均衡器(在单个站点)发生故障
- 由 keepalived 处理,其他 LB 将继续其工作
任何
n-k
FE 发生故障(k
指在我们不遇到问题的情况下发生故障的 FE 数量)- 由 LB 处理,检查会将其移除,并且不会再接收任何流量
n-(k+1)
FE 发生故障(在单个站点)- 由 BGP 处理。我们将在太多 FE 发生故障的站点上终止 LB 上的 BGP 会话。其他位置将接管
单个站点发生的任何重大中断
- 由 BGP 处理,BGP 会话将被丢弃,其他位置将介入
抱歉,我现在没心情进一步了解手动执行此操作的细节。我猜你最好(也更便宜)租用一个负载均衡器服务,它会为你创造奇迹。我读到亚马逊提供了这些服务,但我不知道如果不使用其其余基础设施,是否可以使用这些服务。
答案2
我正在尝试实现完全相同的目标,如果您找到了好的解决方案,请发表!:)
到目前为止,我得到的是 Amazon EC2“弹性 IP”(以及“弹性负载平衡”),它可以路由到同一区域内不同数据中心的实例。(具有讽刺意味的是,他们曾经发生过一次中断,导致同一区域内的所有数据中心瘫痪)。
我也用谷歌搜索过这个:http://www.fibercloud.com/MatrixTechnology- 看起来他们也提供你正在寻找的东西。(我自己都不敢问价格:)
到目前为止,我认为最终答案是管理自己的 BGP,但至少对我来说这是不可能的。
对于 DNS 选项,我一般认为它并不完美,因为存在一些不可避免的缓存,主要是在最终用户浏览器内部。我也同意低 TTL 并不完美,因为我认为对于小型网站来说,低 TTL 会导致轻微的减速,因为对于大多数用户来说,递归 DNS 解析器不会将其缓存在缓存中。(不过值得一提的是,google.com 的 TTL 为 300 秒)。顺便说一句,据我所知,一旦浏览器连接到第一个 IP 超时,它们就会故障转移到 DNS 中公布的第二个 IP,所以它不会完全失败,但我称之为降级。
我正在考虑将两者结合起来 - 使用 2 个 VPS 提供商,每个提供商托管 2 个主机 - 同一数据中心的主机之间使用 IP 故障转移,跨数据中心使用 DNS(通常两个 IP 都公布,TTL 较低,一旦其中一个出现故障,就会删除故障 IP)。
您应该意识到脑裂的情况,即两个站点争相删除对方的 IP,因为它们认为对方不可用。我想我已经找到了一个很好的解决方案 - 在每个主机上运行 DNS 服务器,这样在脑裂时,每个站点只会从它有自己的 DNS 服务器因此,能够访问一台主机的用户也将获得该主机的 DNS 解析无障碍(他到达了,对吧?)主持人。
如果拥有 4 台主机太贵,我认为最好只使用一些可靠提供商的 IP 故障转移,而不要仅仅依赖 DNS。
问候,亚历克斯