我想以一种稳健的方式部署 Web 应用程序。
该应用程序本身是使用 Elixir 编写的,它运行在 Erlang/OTP 之上,这意味着该应用程序可以部署在不同的节点上,当其中一个节点由于某种原因出现故障时,这些节点可以在内部管理故障转移/接管。
然而,DNS不是为此而构建的:添加多个A记录并不意味着当客户端尝试连接的服务器没有及时响应时,他们会尝试其他服务器之一。
很多人会回答“使用负载均衡器”,这很好,但是负载均衡器本身就会成为单点故障。
幸运的是,我被引荐使用边界网关协议,如果我理解正确的话,该协议允许多台服务器监听同一个 IP 地址,因此也许可以作为一种替代方案。不过,我(目前)还不知道 BGP 内部是如何工作的,也不知道是否需要专用硬件才能使用它。
所以我想做的是:
- 在正常使用期间,流量应大致平均地在两台服务器之间分配。
- 当其中一台服务器出现故障时,另一台服务器应该接管所有流量。
如果服务器可以在较远的地理位置进行配置就太好了(即不是在同一栋楼里),以确保例如本地电源故障不会同时关闭两台服务器。我确实意识到 Erlang/OTP 和 BGP 都需要一些地理位置接近,因为网络延迟需要足够低才能使这些技术正常工作。
我的问题是:
- 这可能吗?如果可以,怎么做?
- 您是否需要专用硬件(如特殊路由器)来实现此功能,或者此功能是否可以在两个服务器是不同提供商(地理位置接近)的 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 寻找更符合您需求的其他解决方案。