是否可以建立高可用性设置(在此示例中为 2 个 Web 服务器),并允许其在不断开连接的情况下进行故障转移?
我有两个使用 comet 的网络服务器,这是一种 HTTP 技术,可以实现长寿命 HTTP 连接。我有两个负载均衡器在前端运行 heartbeat,使用共享 IP。如果其中一个前端服务器发生故障,所有连接都会丢失。
我听说有一种技术,也许是 HAProxy,其中两个服务器跟踪连接状态,如果其中一个服务器发生故障,另一个服务器将接管,而不会断开连接。我似乎不知道这是如何做到的。
答案1
我还研究了如何对长期存在的 telnet 连接进行负载平衡。即使是像 F5 这样昂贵的大型负载平衡器似乎也不支持将开放的 tcp 连接从死机服务器“迁移”到另一台服务器。我考虑在我们的负载平衡器上捕获来自 telnet 的握手和连接数据包,然后在必须重新连接到另一台服务器时重放这些数据包。问题是每个应用程序(telnet、comet、ssh 等)都有一组不同的规则来启动连接和登录。如果不为每个应用程序编写代码,我不知道有哪个负载平衡器可以做到这一点。
最后,我放弃了,并花时间重新配置客户端应用程序,以便以一种对用户透明的方式重新连接到服务。
对于 comet,我建议您配置 web 服务以在检测到断开连接时重新连接。 这篇关于 HTTP 流的文章ajaxpatterns.org 上有一个用于检测断开连接的代码片段。
一旦 comet 可以重新连接,那么您当前的负载均衡器设置就应该按预期运行。
答案2
您无法通过 HAProxy 执行此操作,因为它位于错误的 OSI 层 - 在 HTTP 级别,而不是在 TCP 级别。一些较低层的负载平衡器具有一项功能,该功能可能能够实现您所谈论的内容,至少对于许多连接而言,通过在主动节点和被动节点之间来回传递信息。查看 Linux 虚拟服务器 (LVS) 与服务级守护程序(如 ldirectord)的组合,以完成您正在寻找的内容。
答案3
这实际上是不可能的。更好的想法是编写客户端程序以容忍服务器故障并自动重新连接。这将允许单台服务器故障,并且可能允许站点故障转移(如果整个站点发生故障)。
假设:可以创建一个客户端-服务器动态,其中中间负载平衡器或代理可以自动建立与故障转移服务器的新连接,并将任何往返于客户端的新流量转发到该新服务器。服务器必须以某种方式了解客户端的会话信息,也许可以通过将会话信息存储在共享存储中来实现。或者,可以对客户端进行编程,以容忍没有其先前会话信息的服务器(只要我们正在修改客户端,我们不妨执行第 1 段并使其简单地重新连接到新的故障转移服务器)。这样的配置几乎肯定会比它的价值更复杂且更容易出错。
答案4
在 esx/esxi 上使用 vmwares 容错可以实现这一点,但它也有很多限制。
抱歉没有链接,我在回家的路上用手机拍的:-)。