当使用 HAProxy 进行 TCP 负载平衡时,所有出站流量是否都会流经 LB?

当使用 HAProxy 进行 TCP 负载平衡时,所有出站流量是否都会流经 LB?

我正在设置一个使用虚拟机托管的应用程序(可能是亚马逊,但这不是一成不变的),这将需要 HTTP 负载平衡和大量(如果可能的话,50k 左右)持久 TCP 连接的负载平衡。数据量不是很高,但更新很频繁。

现在我正在评估负载均衡器,对 HAProxy 的架构有点困惑。如果我使用 HAProxy 来平衡 TCP 连接,那么所有产生的流量是否都必须流经负载均衡器?如果是这样,其他解决方案(例如 LVS 甚至 nginx_tcp_proxy_module)是否更合适?

答案1

HAProxy(与许多负载均衡器一样)通常维持两个对话。代理与客户端有一个会话(在本例中为 TCP),与服务器有一个会话。因此,使用代理,您最终会在负载均衡器上看到 2 倍的连接。因此,所有流量都会流经负载均衡器。

当涉及到跨多个负载均衡器进行扩展时,我认为你不需要这样做。但一个实用且相当简单的方法是使用类似 keepalived 的东西浮动 IP 和轮询 DNS这两个 IP 之间。使用 keepalived,如果其中一个负载均衡器发生故障,另一个将保留这两个 IP,因此您可以通过这种方式获得高可用性。话虽如此,我认为一个活动的 haproxy 实例就可以满足您的负载需求。

HAProxy 的扩展性非常好。例如,Stack Exchange 网络使用 Web 套接字来维护开放的 TCP 连接。在我发布这篇文章时,我们在 VMware 虚拟机上建立了 143,000 个 TCP 套接字,没有任何问题。虚拟机上的 CPU 使用率约为 7%。

使用 HAProxy 进行此类设置时,请确保设置得maxconn足够高。以下是一些示例 HAProxy 配置,可帮助您入门:

frontend fe_websockets
        bind 123.123.123.123:80
        mode tcp
        log global
        option tcplog
        timeout client 3600s
        backlog 4096
        maxconn 50000
        default_backend be_nywebsockets

backend be_nywebsockets
        mode  tcp
        option log-health-checks
        option redispatch
        option tcplog
        balance roundrobin
        server web1 10.0.0.1:1234
        server web2 10.0.0.2:1234
        timeout connect 1s
        timeout queue 5s
        timeout server 3600s

答案2

是的,所有流量通常都会通过负载均衡器。负载均衡器接收请求,并将响应发送回负载均衡器,负载均衡器再将其发送回客户端。

对于选择正确的工具,我对其他选项没有太多经验。我正在使用 haproxy,它非常好用、稳定,可以处理大量流量。此外,它的 ACL 功能也很棒。

答案3

可以使用和配置 DSR(直接服务器返回),但这与负载均衡器无关,而是在 tcp 堆栈(路由表)中配置。我们一直在为大型视频流门户使用它。虽然它可以工作,但它会给你带来很多麻烦,因为路由很复杂。

因此,在没有充分考虑用途和缺点的情况下,我不会建议使用这种技术。

也许有一些提示可以帮助你开始:

玩得开心!

相关内容