七层负载均衡-多公网出口
一般情景
在典型的网络设计中,一个请求通常只能通过一个公网出口建立连接,因为每个 TCP 或 UDP 连接是基于源 IP 地址、源端口、目的 IP 地址和目的端口建立的。因此,同一个请求在标准的网络栈上,通常不会通过多个公网出口同时建立连接
实现方式
1. 基于连接的负载均衡 (ECMP)
允许单个 TCP 连接使用多个路径
等价多路径路由 (Equal-Cost Multi-Path, ECMP) 是一种网络层的路由机制,允许多个具有相同路径代价的出口同时存在,并根据流量负载自动选择一条路径。
- 原理:当有多个公网出口时,可以通过路由器或负载均衡设备对流量进行散列(hashing),使不同的流量通过不同的出口发送。每个请求(TCP/UDP 连接)仍然只能通过一个出口,但不同的请求可以通过不同的出口发送。
- 适用场景:ECMP 适用于具有多个公网 IP 出口的场景,比如多个 ISP 链接、SD-WAN 等。通常用于分散流量,提高带宽利用率。
ECMP 不能让单个请求同时使用多个公网出口,但可以在多个出口间分配请求。
2. Multipath TCP (MPTCP)
在多个出口之间实现带宽聚合和冗余
Multipath TCP (MPTCP) 是对标准 TCP 协议的扩展,它允许单个 TCP 连接在多个路径上并行传输数据。这意味着一个请求可以使用多个公网出口建立多个子连接。
- 原理:MPTCP 在应用层看来是一个单一的连接,但在传输层,它可以通过多个路径同时发送数据(即多个公网出口)。这种技术可以实现带宽聚合、故障转移等特性。例如,如果一条路径断开,连接可以通过另一条路径继续传输数据。
- 典型应用场景:
- 手机的 4G/5G 和 Wi-Fi 混合连接:通过 MPTCP,手机可以同时利用蜂窝网络和 Wi-Fi 网络进行数据传输。
- 数据中心多链路连接:MPTCP 可以通过多个 ISP 或多个网卡传输相同的请求数据,提升性能和容错。
实现步骤:
- 服务器端支持:MPTCP 需要服务器端的操作系统(如 Linux)支持 MPTCP 协议。
- 客户端支持:同样,客户端也必须支持 MPTCP。
可以在 Linux 系统上通过如下配置启用 MPTCP:
1 sysctl -w net.mptcp.enabled=1此后,系统可以通过多个公网出口(如多个网卡、多个 ISP)发送和接收同一个 TCP 连接的流量。
3. VPN Bonding 或 SD-WAN
实现多出口的请求分发,虽然单个请求只能通过一个出口,但不同的请求可以走不同的出口
VPN Bonding 或 SD-WAN 是另一种可以实现多个出口的解决方案,特别是在不同的网络出口(如多个 ISP 或多个 VPN 通道)之间进行带宽聚合和负载均衡。
- 原理:通过 VPN Bonding 或 SD-WAN 技术,多个出口链路被虚拟为一个链路,流量会被智能地分配到不同的出口路径上,实际流量的传输可能通过多个链路并行完成。即使一个请求是从一个公网出口发起的,它的数据包可能会被拆分并通过不同的物理链路发送,最终到达同一个目的地。
- 实现效果:多个出口之间可以根据负载情况动态切换,某些解决方案还支持带宽聚合。这意味着你可以通过多个链路并发处理数据流量,而不依赖单个链路。
一些常见的 SD-WAN 解决方案如:
- OpenMPTCProuter:使用 MPTCP 和 VPN 实现多路径传输和聚合。
- Peplink、Mushroom Networks:专门的 SD-WAN 硬件设备和软件可以实现多出口聚合。
4. 负载均衡代理
应用程序自己实现流量的分片和多路径传输
负载均衡代理(如 HAProxy、Nginx、Traefik)可以将不同的请求分发到不同的出口进行处理。
- 代理服务器选择出口:在使用负载均衡代理时,可以基于请求的头部、路径、源 IP 等规则,将请求发送到不同的后端服务器或出口网关。这虽然不能将单个请求分割成多个出口,但能实现多个请求同时通过不同出口的效果。
5. 应用层的负载均衡或分片传输
在某些应用场景中,应用层(如 HTTP/HTTPS 协议)可以自己实现数据分片,并通过多个出口建立多个连接来传输数据。
- HTTP/2 or QUIC 协议:现代的 HTTP/2 和 QUIC 协议允许多条流(streams)在一个连接中传输,你可以在不同的连接上发送这些流。
- 文件传输分片:在下载大文件或视频流媒体时,可以使用应用层的逻辑将大文件分片,并通过多个连接并行传输到客户端。
本文由作者按照
CC BY 4.0
进行授权