没有负载平衡器的负载平衡?

我有4个nginx驱动的图像服务器在他们自己的子域,用户随机访问。 我决定把它们全部放在HAProxy负载均衡器的后面,以提高可靠性,并从一个地方查看stream量统计信息。 这似乎是一个简单的方法。

不幸的是,这个举动完全失败了,因为负载平衡器的100mbit端口已经完全满足了所有的请求。

我想知道该怎么做 – 我可以得到一个端口升级($$)或返回到随机访问的4个独立的映像服务器。 我想把HAProxy放在每个映像服务器上,如果服务器的nginx服务有问题的话,映像服务器又会路由到另一台映像服务器。

你会怎么做? 我想不必花太多额外的钱。

无论打破你的nginx(过载,硬件缺陷)可能也会打破你的haproxy。 这可能最好是为每个服务器获得一个额外的IP(用作接口上的别名),并将其用作通过图像URL公开的IP(直接或通过DNS名称)。 构build一个脚本,在出现严重问题的情况下将辅助IP重定位到另一台服务器。 细节中的魔鬼将确保IP被安全地从其他服务器拿走 。 如果脚本无法再login失败的服务器并取消分配IP别名,最好的办法是通过IPMI将其closures(如果可用)。

作为替代scheme,您可以在第四台服务器上安装一些CGIish,然后redirect到随机select的可用服务器; 通过定期的监控脚本控制它可以redirect到的服务器列表(例如,你可能会滥用nagios check_http)。 作为一个扩展,该脚本还可以接受来自另一个文件的排除列表 – 如果您需要暂停其中一台服务器进行维护,那么该脚本非常方便。

另外,有关使用CDN的build议并不是这样的错误。如果你的静态文件stream量达到了100MB的线路,那么根据使用模式,你每个月的stream量都是TB级到几十TB。

解决scheme1.主动DNS监控/广告

使用低TTL(30s-ish)设置images.domain.com来发送您的4个IP:
10.1.1.1,10.1.1.2,10.1.1.3,10.1.1.4

然后你的名字服务器需要主动轮询每个IP的http状态(就像你用负载均衡器监控的那样),当状态“停止”时停止发布一个IP。做一个彻底的testing,但是避免所有的服务(例如单个数据库后端)。 当节点失败监视器时,它将停止在DNS中发布。

捕获,由于低TTL,更多的DNS请求。 故障转移需要“DNS TTL”秒(有些人也喜欢违反TTL)您的名字服务器需要相对接近服务,或者configuration了合理的默认configuration,说明NS和您的映像服务器之间是否存在networking中断。

你也可以做4个独立的域名,通过相同的方法回到另一个IP。

解决scheme2. IP故障转移

在使用VRRP协议的keepalived / lvs的情况下,rackandboneman的IP接pipe在linux中没有太多麻烦。 (假设你的盒子在networking和linux上是相互靠近的,os就像bsd和solaris一样有vrrp / carp实现)

有4个盒子可以为Virutal IP故障转移创build一个圆形拓扑结构,这意味着您可以相互丢弃2个盒子,但只丢失1个VIP,[]的左边的盒子具有VIP的最高优先级。

vip 1 vip 2 vip3 vip4 nodes [ 1 <-> 2 ] [ 2 <-> 3 ] [ 3 <-> 4 ] [ 4 <-> 1 ] 

或者每个VIP有3个节点,按优先级顺序,更复杂的设置,但更好的可用性。

 nodes [1 - 2 - 3] [2 - 3 - 4] [3 - 4 - 1 ] [ 4 - 1 - 2] 

使用keepalived,我会设置监视器脚本来击中本地http服务器,负载均衡器会判断服务器的健康状况。 如果您有多个nics,请确保VRRPstream量使用与真实stream量相同的接口。