我想要做的是设置几个(至少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出现故障,网站就不会出现问题.
我能想到的唯一两个解决方案是依靠dns循环(如果服务器故障至少为某些百分比的用户提供内容直到恢复),或者在数据中心购买一台专门用于停电和装备的服务器有几个互联网连接(与租用甚至10 VPS相比,这是非常昂贵的).
所以问题是:
在具有多个负载平衡VPS的情况下,避免单点故障的正确方法是什么?
请原谅这些图片.它们只是我所说的基本可能的例子.
解决方法
你愿意花多少钱,我还没有看到有人依赖VPS并且真的想花钱购买数据中心故障案例.
关于你的图纸:
如果(并且仅当)负载均衡器是单个机器,如果它是单个系统(如在从多个主机构建的系统中),则第一个中的失败是真的,它不再是真实的.
SPA(最短的答案):
> Datacenter power failure failover
真的简短回答:
您需要获得所有位置都可用的服务IP.并设置BGP路由.
再长一点:
通常,这是通过使用BGP并在2个不同位置宣布IP来完成的.您可以按照IP一直宣布的方式进行设置,但其中一个的优先级低于另一个.这种方式在正常情况下,您的流量将只到达一个站点,如果失败,则BGP路由被丢弃,流量切换到仍然可用的IP.
我们有一些类似的设置,典型的布局是:
(每个地点):
> 2个负载均衡器
这也是BGP运行并宣布其IP的地方.通常是Quagga和一些IPVS设置(我们使用keepalived)
> n个服务器来处理负载(FE)
失败案例:
>通过keepalived处理,其他LB将继续它的工作
>任何n-k的FE都会失败(k是在没有我们遇到问题的情况下可能失败的FE数量)
>由LB处理,支票将删除它们,他们将不会再收到任何流量
> n-(k 1)FE失败(在一个站点)
>由BGP处理.我们将在太多FE失败的站点上终止LB上的BGP会话.另一个位置接管
>单个站点的任何重大中断
>由BGP处理,BGP会话将被丢弃,另一个位置将跳入
对不起,我现在没心情进一步了解手动执行此操作的详细信息.我的猜测是,通过租用一个能为你带来魔力的负载均衡器服务,你会更好(也更便宜).我已经读过亚马逊提供的这些,但我不知道如果不使用其他基础设施就可以使用它们.