如何平衡TCP流量?

时间:2012-01-18 19:17:06

标签: tcp load-balancing

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

enter image description here

1 个答案:

答案 0 :(得分:14)

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

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

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

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