L3 负载均衡实现网速叠加
- 公司有 wifi 和 网线接入。但是每条链路都严格限制成了 8 Mbps 的速度。
- 同时连接 wifi 和 网线,修改路由表,让不同目的地址走不同链路,再结合 aria2c 的多源地址下载,可以实现网速叠加。示例命令:
aria2c -c -x 1 -s 2 https://alist.yfycloud.site:4433/d/Guest/Aria2/grpc.tar.xz\?sign\=JzEpqFm02IlJUuYfCQY3RZdU-NxYVyMElvQShef8Wy0\=:0 http://192.168.36.254: 8000/grpc.tar.xz
- -s 2 表示文件被分成 2 份并行下载,-x 1 表示每个 host 最大创建 1 个连接。这里指定了 2 个源 url,因此意思就是从每个源各创建 1 个连接。
- 其中源 alist.yfycloud.site 为公网地址,走以太网。源 192.168.36.254 走 wg(底层基于 wifi)
但是上面使用了两台服务器提供相同的文件,由于有两个公网地址(使用 LAN 地址的链接底层 wg 仍然需要一个公网地址),因此分流比较简单。如果要缩减为 1 台服务器,就得有让即使是只有一个公网地址,也可以走不同路由的方法(即分别从以太网和 wifi 出去)
我开始的想法是本地使用一个 nginx 反向代理远程的链接,使得请求不同本地地址 127.0.0.x bind 到不同出口出去。nginx 支持 proxy_bind
参数,支持绑定到不同源 ip 地址。但是没想到 Windows 的路由非常不灵活,无法实现源地址的路由1
后面我利用一个简单的千兆路由器(xiaomi 4A gigabit version)将多台设备连接起来,并在每台设备上开启 nginx 反代,实现了只有一个公网地址的情况下,对同一个服务器的网速叠加效果。
nginx 的方法虽然有效,但是整个 setup 有点复杂(windows 需要配置 nginx,设置路由表),并且只能针对一个目的地址叠加网速。访问网页其它内容就无法加速了。
之后又去了解了 ECMP 技术,其中 per flow 和 per packet 分流的想法看上去确实很美好。如果可以实现的话,可以真正实现针对任意协议的网速叠加。(单连接在 per flow 情况下还无法提升速度,但是能够对不同单连接负载均衡也足够了)
各方案总结
- 单机器 wifi 有线叠加
- 方法:aria2c 指定多个源地址,不同地址使用不同路由。
- 优点:简单,只需要使用 aria2c
- 缺点:
- 需要有多个公网 ip,否则无法根据目的地址路由
- 几个链路就需要几个公网 ip (windows 不支持源地址路由导致的)
- 多机器使用 nginx 反代
- 方法:对上面方法的扩展,每台机器使用 nginx 反代,类似于 CDN 节点。叠加所有机器的链路
- 优点
- 提升了扩展性,不同机器可以使用相同的公网 ip 反代
- 缺点
- 设置相对复杂
- 只能代理 HTTP(S)
- 只能对设置的单个公网 ip 叠加链路,没设置的 ip 仍然只能使用一个链路
- ECMP 负载均衡
- 方法:利用 linux 的等效多径路由,在路由器上就流量负载均衡到各节点出去
- 优点
- 设置好后,对所有流量都可以负载均衡到不同链路。多线程下载就可以叠加网速。
- 缺点
- windows 垃圾的网络能力,无法 masqerade 导致方案一度不可行(因为只有一个网段,最后回来的流量必然还是得走一个链路)
- 利用 wg 在 openwrt 路由器和 windows 间创建额外的局域网段,将 SRC NAT 转移到 openwrt 上,规避了 windows 的限制。
- ECMP 的不足
- 第一个问题是不知道怎么配置 ECMP 检测失效的链路。 wg 断开连接后,ECMP 并不会删除掉坏掉的 nexthop。在这种情况下,总是导致网络不可用(虽然其它 nexthop 是可用的)
- 第二个问题是链路利用率低,因为是 per-flow 进行负载均衡。计算 L4 hash 后,每个连接等可能分配到每个链路,并不保证不使用相同链路。而简单的数学计算我们可以得到 3 个链路,3 个连接时,使用全部链路的概率仅为 2/9,4 个连接时仅为 9/16。这也是为什么 iperf3 -P 3 每次结果可能不一样。n 个 链路 n 个连接情况下,利用率随着 n 增大,下降到极限值 \(1 - 1/e \approx 0.63\)
- ECMP 节点作为下载机器时,只能使用本地链路。
- 如果路由器可以作为一个反代节点就可以解决,可惜我的 mi4a 只有 16M 的 flash,应该装不下(TODO:可以试试自己编译镜像)
下载 windows11 镜像,从一小时二十分钟,下降到二十分钟
利用 mi4a + 两台 windows 共 3 个路径进行 ECMP,手机播放 B 站 4K 视频时的效果,CPU 有 %30-40 的占用。