我正在尝试确定如何进行TCP流量负载均衡。我了解HTTP负载均衡的工作原理,因为它是一种简单的请求/响应架构。然而,当您的服务器试图向其他客户端写入数据时,我不确定如何负载平衡TCP流量。我附上了一个简单TCP聊天服务器的工作流程图,我们希望在N个应用程序服务器之间平衡流量。是否有任何负载均衡器可以做到我所尝试的事情,或者我需要研究不同的主题?谢谢。
首先,你的图表假定负载均衡器充当(TCP)代理,但并非总是如此。通常采用直接路由(或直接服务器返回)或目标NAT。在这两种情况下,后端服务器与客户端之间的连接是直接的。因此,在这种情况下,基本上是将TCP握手分布在后端服务器之间。了解更多信息,请参见以下链接: http://www.linuxvirtualserver.org/VS-DRouting.html http://www.linuxvirtualserver.org/VS-NAT.html 显然,确实存在TCP代理(例如HAProxy),在这种情况下,代理管理连接的双方,因此您的应用程序需要能够通过传入的IP/端口(来自代理而不是客户端)识别客户端。代理将处理将消息发送回客户端的工作。无论哪种方式,都归结于应用程序设计,我想棘手的部分是具有共同的会话存储(某种类型的数据库或键值存储,例如Redis),以便当您的应用程序服务器说“我需要向Frank发送消息”时,它可以确定Frank连接到哪个后端服务器(从DB),并向该服务器发出信号以向其发送消息。通过使用持久连接(所有负载均衡器都可以实现)或使用一些本质上持久的东西,例如websocket,可以减少连接(来自同一客户端)在不同的后端服务器之间移动的问题。由于我没有聊天软件方面的经验,这可能是一个非常简单化的解释。显然,DB服务器本身可以分布在多台机器上,以实现容错和负载平衡。