您可以通过多种方式处理跨服务器分发请求。根据您的部署环境,有些可能比其他更可取。
Fabio 负载平衡器文档有一个关于 deployment configurations 的部分,我将用作参考。
直接使用 DNS 故障转移
在此模型中,您可以将 DNS 配置为指向所有三台服务器的 IP。客户端将收到所有三个 IP 以响应 DNS 查询,并随机连接到可用实例之一。
如果 IP 不正常,客户端应该重试对其他 IP 之一的请求,但如果服务器长时间不可用并且客户端可能会遇到较慢的响应时间偶尔会将请求路由到那个不可用的 IP。
您可以通过将 DNS 服务器配置为对后端实例执行健康检查(假设它支持)来缓解此问题。 AWS Route 53 提供此功能(请参阅Configuring DNS failover)。如果您的 DNS 服务器不支持健康检查,但提供了更新记录的 API,您可以使用 Consul Terraform Sync 在 Consul 中随着 Fabio 实例的健康状况发生变化而自动添加/删除服务器 IP。
负载均衡器背后的 Fabio
正如您所提到的,另一种选择是将 Fabio 置于负载平衡器之后。如果您在云中部署,这可能是云提供商的 LB。 LB 可以让您更好地控制到 Fabio 的流量路由、提供 TLS/SSL 终止和其他功能。
如果您在本地,您可以使用任何可用的负载均衡器(如 F5、A10、nginx、Apache Traffic Server 等)在其前面。您需要确保 LB 以高度可用的方式部署。下一节将介绍一些有关执行此操作的建议。
直接使用 IP 故障转移
无论您是直接在 Internet 上运行 Fabio,还是在负载均衡器后面运行,您都需要确保客户端连接的 IP 具有高可用性。
如果您在本地部署,实现此目的的一种方法是为每个 Fabio 服务器分配一个公共环回 IP(例如 192.0.2.10),然后使用像 Virtual Router Redundancy Protocol 这样的 L2 冗余协议( VRRP)或 L3 路由协议(如 BGP),以确保网络将请求路由到可用实例。
L2 故障转移
Keepalived 是一个用于 Linux 的 VRRP 守护进程。网上可以找到很多安装配置教程。
使用 BGP 的 L3 故障转移
GoCast 是一个基于GoBGP 的 BGP 守护进程,它根据健康检查的状态有条件地将 IP 通告给上游网络。该工具的作者发表了一篇名为 BGP based Anycast as a Service 的博客文章,其中介绍了在 Nomad 上部署 GoCast,并将其配置为使用 Consul 获取健康信息。
使用静态 IP 的 L3 故障转移
如果您在本地部署,比上述两种解决方案更简单的配置可能是配置您的路由器,以根据后端实例的运行状况检查安装/删除静态路由。 Cisco 路由器通过其 IP SLA 功能支持这一点。本教程将介绍基本设置配置http://www.firewall.cx/cisco-technical-knowledgebase/cisco-routers/813-cisco-router-ipsla-basic.html。
如您所见,有多种方法可以为 Fabio 或上游 LB 配置 HA。在不了解您的环境的情况下很难提供好的建议。希望这些建议之一对您有用。