我希望为 http 请求设置一个容错设置。为简便起见,我们假设我们有一个非常简单的 Web 服务,并且服务器响应没有差异。
因此我将进行以下设置(三者均在同一个 LAN 中):
Upstream Gateway:
eth0 - 10.0.0.1
Server1:
eth0 - 10.0.0.10
eth1 - 10.0.0.11
Server2:
eth0 - 10.0.0.10
eth1 - 10.0.0.11
看起来很蠢?不,一点也不蠢。当 IP 数据包到达网关时,它会查找 2 级地址,因此它会发出 ARP 请求。响应包含硬件地址(它将是 Server1 或 Server2 的硬件地址,速度最快的那个获胜),并且 ARP 响应将被缓存,但时间很短。
现在 Server1 宕机了。只有 Server2 响应硬件地址,一切照常。所以如果发生故障,我有
有什么预防措施吗?
答案1
虽然你的想法很聪明,但有一个问题是数据包的路由可以在两台机器之间任意切换。我强调数据包,而不是 TCP 连接。因此,随着路由来回跳转,TCP 连接将被随机重置。
对于纯单包 UDP 服务,它可能有更好的工作机会。
但是,有些机制可以防止您在同一网络上的多个 NIC 上使用相同的 IP。您必须找到绕过这些保护措施的方法。
我采用的方法是让两台机器协商一个 IP 地址。称之为“虚拟 IP”。主机通常会将此 IP 添加为别名。辅助机器将监视主机,并在检测到主机停机时接管 IP。
辅助设备将通过添加别名来获取 IP,然后发出特定的 arping 来让网络知道事物已移动。
您还可以随时切换角色,方法是从第一台机器删除别名,然后将其添加到第二台机器,如上所述。
答案2
您是否考虑过 Pacemaker 或 Keepalived。两者都无法实现您所期望的那种(我敢说)循环容错能力,因为在任何时候,一个 IP 下都只有一个服务器可用。但这种配置允许更复杂的 HTTP 事务。您所描述的情况可能会导致客户端在会话中的不同时间从不同的服务器接收相同的数据。
希望这对您有帮助。
答案3
坦白说,确实如此坏的。但我们都是来学习的。如果您使用的是 Windows 平台,则应研究类似网络负载平衡(下面的链接)之类的东西,以实现容错和性能。我猜 Linux 也有类似的东西。我个人从未使用过 NLB,但总是在 http 服务器前面放置一个或多个负载平衡器来提供容错和负载平衡。当然,您正在尝试通过设置获得高可用性,但网关仍然会成为单点故障。
答案4
这不会像你想象的那样起作用,因为两台机器都在同一个广播域中。虽然过时的 ARP 条目会触发 ARP 广播请求和相关的单播回复,但 IP 分配会触发 ARP 广播探测和公告。因此至少会发生两件坏事:
- 由于 ARP 探测,第二台设备上的 IP 分配将失败。
- 由于 IP 地址防御机制,您最终可能会面临 IP 锁定或部分/完全未分配的情况。
读RFC 5227了解荣耀细节。