如何平衡TCP流量?

Bri*_*asa 20 tcp load-balancing

我正在尝试确定如何平衡TCP流量.我理解HTTP负载平衡是如何工作的,因为它是一个简单的请求/响应架构.但是,当您的服务器尝试将数据写入其他客户端时,我不确定如何平衡TCP流量.我附上了一个简单的TCP聊天服务器的工作流图像,我们希望在N个应用服务器之间平衡流量.是否有任何负载平衡器可以做我正在尝试做的事情,或者我是否需要研究不同的主题?谢谢.

在此输入图像描述

Jam*_*tle 16

首先,您的图表假定负载均衡器充当(TCP)代理,但情况并非总是如此.通常使用直接路由(或直接服务器返回),或执行目标NAT.在这两种情况下,后端服务器和客户端之间的连接都是直接的.因此,在这种情况下,它实质上是在后端服务器之间分配的TCP握手.有关详细信息,请参阅以下内容

显然,TCP代理确实存在(HAProxy就是其中之一),在这种情况下,代理管理连接的两端,因此您的应用程序需要能够通过传入的IP /端口识别客户端(这可能恰好来自代理而不是客户).代理将处理将消息发送回客户端.

无论哪种方式,它归结为应用程序设计,因为我认为棘手的一点是拥有一个公共会话存储(某种类型的数据库,或key =>值存储,如Redis),所以当你的应用服务器说"我需要向Frank发送消息"它可以确定哪个后端服务器Frank连接到(来自DB),并通知该服务器向其发送消息.通过持久连接(所有负载均衡器可以执行此操作)或使用像websocket这样本质上持久的内容,可以减少在不同后端服务器上移动的连接(来自同一客户端)的问题.

这可能是一个巨大的过度简化,因为我没有聊天软件的经验.显然,DB服务器本身可以分布在多台机器中,以实现容错和负载平衡.