【发布时间】:2013-12-07 20:29:56
【问题描述】:
我正在尝试找出正确的部分来为基于 Java 的服务器应用程序 (netty) 实现高可用性和故障转移设置。理想情况下,TCP 连接将持续数月甚至数年(它们用于服务器到服务器的通信),并且只有在远程服务器断开连接或由于不受控制的网络问题时才需要关闭。目标是没有任何单点故障。
套接字连接中的数据看起来非常类似于 protobuf 数据结构。这不是 HTTP。
到目前为止,我一直在研究 keepalived 和 HAProxy,但它们似乎都不允许在不断开前端会话的情况下将持久 TCP 会话重定向/故障转移到不同的后端服务器。
我想弄清楚的是 FE1 和 BE1 系统上会运行什么,如下所示;
| VIP |
+----+----+ +----+----+
| FE1 | <-VRRP-> | FE2 |
+----+----+ +----+----+
| |
| |
------+---+------------+---+----------
| |
+---+---+ +---+---+
| BE1A | | BE1B |
+---+---+ +---+---+
| |
+------------+
| |
| |
+---+---+ +---+---+
| BE2A | | BE2B |
+---+---+ +---+---+
外部服务器通过 VIP 连接到活动前端 (FE) 系统,然后与活动后端 1 (BE1) 系统建立 TCP 连接。或者如果 TCP 代理这样做;连接到两个 BE1 系统,并将流量发送到一个系统。
BE1 服务器运行一个自定义 Java 应用程序,该应用程序处理确保请求和响应最终到达适当的 BE2 系统。如果需要,可以以任何方式对其进行修改以处理来自 FE 服务器的连接/流。
我正在寻找的是,如果一个 BE1 系统出现故障(有意或无意),FE 服务器是否会重定向/重新建立与另一个 BE1 系统的连接,而不会断开与外部 VIP 的连接远程服务器。即,持久 TCP 连接的透明故障转移。
如前所述,我已经查看了 keepalived / HAProxy,据我所知,它们不会起作用 - 除非我错过了可能会起作用的插件/模块。
可以在 FE 层上运行哪些选项?或者是否有可以在 BE1 层上运行的东西可以处理故障转移并通知 java 在备用系统上移动/恢复的套接字(即 LVS 或 tcpcp 可以与 java 一起使用 - 我没有找到太多关于它)。
谢谢!
【问题讨论】:
-
您希望连接不中断的原因是什么?我认为你把它弄得太复杂了。如果客户端在连接失败时重新连接,然后被定向到新服务器,那会更好。除了“连接中断”之外,还有很多网络问题你必须考虑。如果 BE2 服务器已启动,但返回错误怎么办。或者如果它正在超时?看来您需要 FE1 成为一个完整的 tcp 代理。如果它转发一条消息但失败了,它可以尝试转发到另一台服务器。
-
@Dave 因此,如果我们需要对后端系统进行维护或更新,它可以是透明的。一些客户端不会注意到任何断开连接并立即重新连接,但是,其他客户端不会重新连接并且对于任何断开连接都需要事件报告(无论它是否是 100 毫秒的断开连接)。该协议处理超时、应用保活和问题,因此如果消息失败,它会在外部服务器和 FE2 之间进行处理。
-
我得出的结论是,大多数较大的客户(以及那些抱怨更多的客户)都有多个连接(他们以捆绑的形式查看它们 - 所以只要提供一个连接就可以了) ,我可以在BE1之间进行平衡。这样,我们可以关闭一个 FE1 系统,连接将转移到另一个,当它备份时,我们只需要删除 FE1 系统上的故障转移连接即可将它们故障恢复。所以总的来说它会起作用。可能只是比需要的更多。
-
那么你需要 FE1 和 FE2 作为代理。客户端连接在 FE1 和 FE2 终止。 FE1 和 2 上的软件足够智能,如果 BE* 断开连接,它将重新连接到另一个。在这种情况下,FE 服务器不能是一些通用代理,而是能够理解您的协议的东西
标签: java tcp high-availability failover haproxy