如何创建一组监听同一 IP 地址的服务器,以允许故障转移/接管?

如何创建一组监听同一 IP 地址的服务器,以允许故障转移/接管?

我想以一种稳健的方式部署 Web 应用程序。

该应用程序本身是使用 Elixir 编写的,它运行在 Erlang/OTP 之上,这意味着该应用程序可以部署在不同的节点上,当其中一个节点由于某种原因出现故障时,这些节点可以在内部管理故障转移/接管。

然而,DNS不是为此而构建的:添加多个A记录并不意味着当客户端尝试连接的服务器没有及时响应时,他们会尝试其他服务器之一。

很多人会回答“使用负载均衡器”,这很好,但是负载均衡器本身就会成为单点故障。

幸运的是,我被引荐使用边界网关协议,如果我理解正确的话,该协议允许多台服务器监听同一个 IP 地址,因此也许可以作为一种替代方案。不过,我(目前)还不知道 BGP 内部是如何工作的,也不知道是否需要专用硬件才能使用它。

所以我想做的是:

  • 在正常使用期间,流量应大致平均地在两台服务器之间分配。
  • 当其中一台服务器出现故障时,另一台服务器应该接管所有流量。

如果服务器可以在较远的地理位置进行配置就太好了(即不是在同一栋楼里),以确保例如本地电源故障不会同时关闭两台服务器。我确实意识到 Erlang/OTP 和 BGP 都需要一些地理位置接近,因为网络延迟需要足够低才能使这些技术正常工作。

我的问题是:

  1. 这可能吗?如果可以,怎么做?
  2. 您是否需要专用硬件(如特殊路由器)来实现此功能,或者此功能是否可以在两个服务器是不同提供商(地理位置接近)的 VPS(虚拟专用服务器)的环境中工作?

答案1

不要使用 BGP,而是使用 haproxy(负载均衡器)和 keepalived VRRP 解决方案(解决 VIP - 虚拟 IP)的组合。操作方法很简单:

dasunhegoda.com/如何设置haproxy-with-keepalived/833/

或者也许 RH 文档中有更好的例子:

access.redhat.com/documentation/en-us/red_hat_ceph_storage/1.3/html/object_gateway_guide_for_red_hat_enterprise_linux/haproxy_keepalived_configuration

并且不要忘记设置内核参数:

net.ipv4.ip_nonlocal_bind=1

在 haproxy 节点上,以便两者都可以绑定 VIP。

对于 haproxy,您可以通过 Google 寻找更符合您需求的其他解决方案。

相关内容