没有负载均衡器,如何实现负载均衡?

没有负载均衡器,如何实现负载均衡?

我在自己的子域上有 4 个由 nginx 驱动的图像服务器,用户可以随机访问它们。我决定将它们全部放在 HAProxy 负载均衡器后面,以提高可靠性并从单个位置查看流量统计信息。这似乎是轻而易举的事。

不幸的是,这次迁移彻底失败了,因为负载均衡器的 100mbit 端口已经完全饱和,所有请求都通过它。

我不知道该怎么做 - 我可以升级端口 ($$) 或返回到 4 个随机访问的独立图像服务器。我考虑将 HAProxy 放在每个图像服务器上,如果该服务器的 nginx 服务出现问题,它会依次路由到另一台图像服务器。

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

答案1

任何导致 nginx 崩溃(过载、硬件缺陷)的原因都可能也会使 haproxy 崩溃。最好的办法可能是为每台服务器获取一个额外的 IP(用作接口上的别名),并将其用作通过图像 URL 公开的 IP(直接或通过 DNS 名称)。编写一个脚本,在出现严重问题时将辅助 IP 重新定位到另一台服务器。细节中的魔鬼在于确保 IP 安全带走了来自另一台服务器。如果脚本无法再登录到发生故障的服务器并解除分配 IP 别名,最好的办法是通过 IPMI 强制关闭它(如果可用)。

作为替代方案,您可以在第四台服务器上安装一些 CGIish,只需重定向到随机选择的可用服务器即可;使用定期监控脚本控制它可以重定向到的服务器列表(例如,您可以为此滥用 nagios check_http)。作为扩展,该脚本还可以接受来自另一个文件的排除列表 - 如果您需要暂停其中一台服务器进行维护,这非常方便。

此外,关于使用 CDN 的建议并不是那么误导......如果您的静态文件流量占满了 100MBit 线路,那么根据使用模式,您每月的流量将以 TB 到数十 TB 为单位......

答案2

解决方案 1. 主动 DNS 监控/广告

设置一个具有低 TTL(30 秒左右)的 images.domain.com 来宣传您的 4 个 IP:
10.1.1.1、10.1.1.2、10.1.1.3、10.1.1.4

然后,您的名称服务器需要主动轮询每个 IP 的 http 状态(就像您使用负载平衡器进行监控一样),并在 IP 状态为“关闭”时停止宣传该 IP。进行全面测试,但避免所有框(例如单个数据库后端)共用任何服务。当节点无法通过监控时,它将停止在 DNS 中宣传。

问题在于,由于 TTL 低,DNS 请求更多。故障转移需要“DNS TTL”秒(有些人也喜欢违反 TTL)您的名称服务器需要相对靠近服务,或者配置合理的默认值,例如如果 NS 和您的图像服务器之间发生网络中断。

您还可以通过相同方法将 4 个单独的域名恢复到另一个 IP。

解决方案 2. IP 故障转移

rackandboneman 的 IP 接管在 Linux 中很容易实现,keepalived/lvs使用 VRRP 协议。(假设您的机器在网络上彼此靠近,并且 Linux、操作系统像北达科他州索拉里斯有 vrrp/carp 实现)

使用 4 个盒子,您可以为虚拟 IP 故障转移创建一个圆形拓扑,这意味着您可以丢失彼此相邻的 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 服务,以判断服务器的健康状况。此外,如果您有多个网卡,请确保 VRRP 流量使用与实际流量相同的接口。

相关内容