为路由器后面的宕机机器重新路由(纯文本)协议的方法

为路由器后面的宕机机器重新路由(纯文本)协议的方法

我已经寻找了一段时间如何实现这一点,但我似乎无法找到类似的解决方案或从我的知识中综合出一个。

以下是有关我的设置的详细信息:我有一个网关/路由器,它具有到互联网的上行链路。“后面”是几台不同的服务器。其中一些有公共 IP,其他没有。无论哪种方式,我想要公开的所有服务都通过解锁目标 IP 上的相应端口或将端口 DNATing 到没有公共 IP 的其中一台机器来公开。整个设置运行良好(对于更大的部分来说,它是一个基于 netfilter 的规则集与一些路由表条目的组合)。

现在的问题是:有时路由器后面的机器可能会停机(我目前无法承受额外的冗余)。如果发生这种情况,我希望服务(特别是 HTTP)的用户能够获得比网络超时“更好”的用户体验,并提供一个“备份”服务器,该服务器只会显示一条简短的通知,告知路由器后面的服务目前已停机。因此,如果路由器无法访问该服务,它应该动态地将流量重新路由到“备份”。

有人知道这个问题的解决方案吗?或者可以建议一种解决方法吗?也欢迎对搜索词提出建议...

答案1

一个解决方案是使用负载均衡器HAProxy。它支持备份服务器的概念,因此只要您的常规服务器能够响应负载均衡器所做的常规检查,您就可以将流量路由到常规服务器。如果它不再响应,流量将被路由到备份服务器,在您的情况下,备份服务器可能只会显示“抱歉”的提示。

这种方法的缺点当然是您必须维护负载均衡器,这可能是另一个单点故障。如果您的网关/路由器是一个真正的 Linux 系统(而不是一些塑料盒),这可能不是问题,因为它已经是一个单点故障,并且可能还可以运行负载均衡器 :)

更一般地讲,要解决的问题不是重定向流量(对此有很多解决方案),而是实际检测主机是否已关闭,然后相应地更改路由/重定向。当服务器再次启动时也需要执行相同的操作,以便将流量再次路由到实际服务器。

答案2

最便宜的解决方案是,您必须编写一个脚本,轮询后端服务器并在其发生故障时更新端口转发。您可以将流量转发到包含错误消息的其他服务器。

脚本的细节完全取决于系统的具体细节。一些非常粗略的伪 bash 代码:

wget backendserver > /dev/null
test_for_failure
if failed; then
  iptables -D <port forward rule>
  iptables -A <new forward rule>
else
  verify iptables is sending to the backend
fi

在我们的环境中,所有流量都转发到一台服务器,然后该服务器代理到后端。它的设置为在中断期间显示正确的消息。但是它仍然可能会失败导致超时。但它专注于自己的任务,因此很少发生中断。下一步是使其成为集群的一部分,以增加正常运行时间;对我们来说,成本/收益不存在。

相关内容