![通过 HAProxy 实现 RTMP 负载平衡](https://linux22.com/image/661506/%E9%80%9A%E8%BF%87%20HAProxy%20%E5%AE%9E%E7%8E%B0%20RTMP%20%E8%B4%9F%E8%BD%BD%E5%B9%B3%E8%A1%A1.png)
我有一个小问题需要解决:
我需要找到一种方法来对我的服务器上传入的 RTMP 流进行带宽负载平衡。
我有 2 个 RTMP 服务器(nginx-rtmp),我们将它们称为 S1 和 S2。
RTMP 服务器正在监听1936港口,HAProxy在与 S1 相同的机器上对流进行负载平衡,目前它运行良好,只是它使用了两个都服务器。
使用当前配置,客户端发送 RTMP 流,S1 上的 HAProxy 接收该流并选择 S2 作为接收服务器,最后将流重定向到该服务器。因此,对于 1Mbps 流,S1 使用 1Mbbs 接收流,并使用 1Mbps 将其转发到第二台服务器,该服务器在 S2 上也使用 1Mbps。
以下是 HAProxy 的配置:
global
log /dev/log local0
log /dev/log local1 notice
chroot /var/lib/haproxy
#user haproxy
#group haproxy
daemon
defaults
log global
mode http
option httplog
option dontlognull
contimeout 5000
clitimeout 50000
srvtimeout 50000
errorfile 400 /etc/haproxy/errors/400.http
errorfile 403 /etc/haproxy/errors/403.http
errorfile 408 /etc/haproxy/errors/408.http
errorfile 500 /etc/haproxy/errors/500.http
errorfile 502 /etc/haproxy/errors/502.http
errorfile 503 /etc/haproxy/errors/503.http
errorfile 504 /etc/haproxy/errors/504.http
frontend ft_rtpm
bind :1935
mode tcp
maxconn 400
default_backend bk_rtmp
backend bk_rtmp
mode tcp
server media01 127.0.0.1:1936 check maxconn 200 weight 1
server media02 ip.address.of.S2:1936 check maxconn 200 weight 1
我需要找到一种方法将请求直接传递到负载均衡器选择的服务器,而不使用负载均衡器的带宽。
我知道它叫 HA代理人但我希望这是可能的,所以与此同时我也搜索了其他解决方案,如DNS循环,Anycast,DNS的SRV记录(这些解决方案都很棒,但前提是它们被使用过...),但它似乎不如HAProxy那么有效(没有权重,健康检查,最大连接数...),因为它非常接近最终结果,因为“只有”带宽问题。
答案1
您正在寻找的是“直接服务器返回”,简称 DSR。
您无法使用 HAProxy 进行 DSR,但 LVS 或其他第 4 层负载均衡器可以做到。如果您只进行第 4 层,那么 HAPproxy 可能有点过头了。