TCP 负载均衡

TCP 负载均衡

我需要实现一个架构,可以为 300 万台 GPS 设备提供服务,这些设备会每 10 秒向我们的系统发送位置更新/警报进行处理。

特点:1) TCP 通信。1) 长寿命连接(每天约 12 小时)。仅当 IP 地址更改时才会更改。2) GPRS 通信。3) 简单解析数据并存储在数据库中。

目前,我们有一个基本系统(Active-Pasive),使用 Netty Framework for Java NIO 在单个服务器上处理~50K 个连接。

我考虑增加服务器节点的数量,比如每 10 万个连接增加一个。问题是我只能为这些客户端提供几个公共 IP 或一个主机名,所以我需要一个代理来管理请求。

Haproxy 是否能在某些配置下管理 300 万个 tcp 会话的负载,或者我需要硬件负载平衡器,或者两者结合。

此外,Netty 也是一个不错的选择,或者我可以通过其他框架/技术处理每个应用服务器的更多负载。

答案1

我无法代表您正在考虑的两种解决方案的具体设计。但是,我可以解释一种设计,该设计可以在软件中实现,并且如果部署在足够数量的标准机器上,则可以扩展到单个 IP 上的数百万个 TCP 连接。

首先,IP 地址可以被任播到负责处理传入数据包的机器池。

为了实现这一点,这些机器之间必须能够通信。因此,每台机器都必须有一个单播 IP 地址,因为这些单播 IP 地址不用于与客户端通信,因此它们可以是 RFC 1918 地址或 IPv6,这样您就有足够的地址用于机器之间的通信。

收到数据包时,会在接收数据包的机器上的表中查找客户端 IP 和端口。如果找到,表条目会指示数据包将由哪个后端处理。然后,接收机器会将数据包封装到到该后端的隧道中。

如果未找到任何条目,则对客户端 IP 和端口进行哈希处理,以便生成两个(用于冗余)索引到分布式哈希表中。所有机器必须使用相同的哈希函数才能实现此目的。

如果数据包是 SYN 数据包,则接收机器会选择一个后端,并将信息发送到哈希选择的两台机器,并将其存储在自己的表中。这与将数据包转发到后端同时发生。

如果数据包不是 SYN 数据包,则数据包将存储在接收机器上,同时询问两台机器(并行)哪个后端应该处理它。一旦第一个回复返回,指示数据包要发送到哪里,数据包将被转发到后端,到后端的映射将存储在本地表中,并发送到通过哈希挑选的两台机器中的另一台。

必须配置后端,以便将公共 IP 分配给虚拟接口(Linux 有一个虚拟网络驱动程序用于此类目的)。实际用于路由数据包的接口必须具有单播地址。这样,后端的 TCP 堆栈将很乐意接受到公共地址的 TCP 连接,但不会将其用于它自己发起的连接。

后端的回复只是使用公共 IP 作为源地址发送,而无需经过任播池(这种方法称为直接服务器返回或 DSR)。

相关内容