我想为http请求提供容错设置。 为简洁起见,我们假设我们有一个非常简单的Web服务,服务器响应没有区别。
所以我会有以下设置(全部三个在同一个局域网中):
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响应将被caching,但时间很短。
现在Server1已closures。 只有Server2的硬件地址响应,一切如常。 所以如果我失败了
任何预防措施?
虽然你提出的是聪明的,但是一个问题是,数据包的路由可能在两台机器之间来回切换。 我强调数据包 ,而不是TCP连接。 所以随机的TCP连接将被重置,因为路由来回跳动。
对于一个纯粹的单包UDP服务,你可能会有更好的工作机会。
但是,有一些机制可以阻止您在同一networking上的多个NIC上拥有相同的IP。 你必须find解决这些保护措施的方法。
我采取的方法是有一个IP地址,两台机器将协商。 称之为“虚拟IP”。 主机通常会把这个IP作为别名添加到它。 辅助机器将监视主机并在检测到主机closures时接pipeIP。
辅助服务会通过添加一个别名来获得IP,然后发出一个特定的arping来让networking知道事情已经发生了变化。
您也可以随时切换angular色,方法是从第一台机器中删除别名,然后将其添加到第二台机器中,如上所述。
你有没有考虑起搏器或Keepalived。 在任何时候只有一个服务器可以在IP下使用,这也不是你所期望的(我敢说)循环容错。 但是这种configuration允许涉及更多的HTTP事务。 您所描述的可能会导致从不同服务器接收相同数据的客户端在会话中的时间不同。
希望这是有帮助的。
坦率地说,是的,这看起来不错 。 但我们都在这里学习。 如果你在一个Windows平台上工作,你应该看看networking负载平衡(下面的链接)的容错和性能。 我猜是有类似的东西的Linux。 我从来没有亲自使用NLB,但总是有一个或多个负载均衡器坐在http服务器前面,以提供容错和负载平衡。 当然,你正试图通过你的设置获得高可用性,但是网关仍然是单点故障。
这不会像你想象的那样工作,因为两台机器都在同一个广播域上。 当陈旧的ARP条目触发ARP广播请求和相关的单播应答时,IP分配触发ARP广播探测和通告。 所以至less有两件坏事会发生:
阅读RFC 5227的荣耀细节。