具有持久TCP服务器套接字的Java应用程序高可用性/故障切换

具有持久TCP服务器套接字的Java应用程序高可用性/故障切换,java,tcp,high-availability,failover,haproxy,Java,Tcp,High Availability,Failover,Haproxy,我正试图找出正确的方法来为基于java的服务器应用程序(netty)实现高可用性和故障切换设置。理想情况下,TCP连接可以运行数月,如果不是数年的话(它们用于服务器到服务器的通信),并且只有在远程服务器断开连接或由于无法控制的网络问题时才需要停机。目标是不存在任何单一的失败点 套接字连接中的数据看起来与protobuf数据结构非常相似。它不是HTTP 到目前为止,我一直在研究keepalived和HAProxy,但它们似乎都不允许在不断开前端会话的情况下将持久TCP会话重定向/故障切换到其他后端

我正试图找出正确的方法来为基于java的服务器应用程序(netty)实现高可用性和故障切换设置。理想情况下,TCP连接可以运行数月,如果不是数年的话(它们用于服务器到服务器的通信),并且只有在远程服务器断开连接或由于无法控制的网络问题时才需要停机。目标是不存在任何单一的失败点

套接字连接中的数据看起来与protobuf数据结构非常相似。它不是HTTP

到目前为止,我一直在研究keepalived和HAProxy,但它们似乎都不允许在不断开前端会话的情况下将持久TCP会话重定向/故障切换到其他后端服务器

我想弄清楚的是,FE1和BE1系统将运行什么,如下所示

        |        VIP         |
   +----+----+          +----+----+
   |   FE1   | <-VRRP-> |   FE2   |
   +----+----+          +----+----+
        |                    |               
        |                    |
  ------+---+------------+---+----------                                
            |            | 
        +---+---+    +---+---+
        |  BE1A |    |  BE1B |
        +---+---+    +---+---+
            |            |       
            +------------+
            |            | 
            |            |
        +---+---+    +---+---+
        |  BE2A |    |  BE2B |
        +---+---+    +---+---+
| VIP|
+----+----+          +----+----+
|FE1 | | FE2|
+----+----+          +----+----+
|                    |               
|                    |
------+---+------------+---+----------                                
|            | 
+---+---+    +---+---+
|BE1A | | BE1B|
+---+---+    +---+---+
|            |       
+------------+
|            | 
|            |
+---+---+    +---+---+
|BE2A | | BE2B|
+---+---+    +---+---+
外部服务器通过VIP连接到活动前端(FE)系统,然后建立到活动后端1(BE1)系统的TCP连接。或者如果TCP代理执行此操作;连接到两个BE1系统,并将流量发送到一个系统

BE1服务器运行一个自定义java应用程序,该应用程序负责确保请求和响应最终到达相应的BE2系统。如果需要,可以通过任何方式修改此选项,以处理来自FE服务器的连接/流

我要寻找的是,如果其中一个BE1系统发生故障(有意或无意),FE服务器会重定向/重新建立与另一个BE1系统的连接,而不会断开与远程服务器外部VIP的连接。Ie,持久TCP连接的透明故障切换

正如前面提到的,我已经看过keepalived/HAProxy,从我所知道的情况来看,它们不起作用——除非我错过了一个可能起作用的插件/模块

对于可以在FE层上运行的内容,有哪些选项?或者有什么东西可以在BE1层上运行,它可以处理故障转移,并向java通知在备用系统上移动/恢复的套接字(即LVS或tcpcp可以与java一起使用吗?我还没有找到太多关于它的讨论)


谢谢

我正在尝试实现这些,我已经看到这些方法与Websphere MQ一起工作,您可以将应用程序添加到故障转移控制器。 优点是:

  • 你只知道一个IP地址
  • 您不必对客户端的切换进行编码
致以最良好的祝愿。
Leonel dos Anjos

您希望连接不中断的原因是什么?我觉得你把事情弄得太复杂了。如果客户端在连接失败时重新连接,然后直接连接到新的服务器,这会更好。除了“连接中断”之外,还有太多的网络问题,你无论如何都要考虑。如果BE2服务器已启动,但返回错误怎么办。或者它是否正在超时?看起来您需要的是让FE1成为一个完整的tcp代理。如果它转发消息失败,它可以尝试转发到另一台服务器。@Dave因此,如果我们需要对后端系统进行维护或更新,它可以是透明的。有些客户端没有注意到任何断开连接,并立即重新连接,但是,其他客户端没有重新连接,对于任何断开连接,都需要事件报告(无论是100毫秒断开连接)。该协议处理超时、应用程序保留和问题,因此,如果消息失败,它将在外部服务器和FE2之间处理。我的结论是,大多数较大的客户端(以及投诉较多的客户端)都有多个连接(它们以捆绑方式查看这些连接,因此提供一个连接就可以了),我可以在1之间平衡。通过这种方式,我们可以关闭一个FE1系统,连接将转移到另一个系统,当它备份时,我们只需删除FE1系统上的故障切换连接即可使其恢复。所以总的来说,这是可行的。可能只是需要更多的参与。所以你需要FE1和FE2作为代理。客户端连接在FE1和FE2处终止。FE1和FE2上的软件足够智能,如果BE*断开连接,它将重新连接到另一个。在这种情况下,FE服务器不能是某种通用代理,而是理解您的协议的服务器