use*_*875 19 load-balancing haproxy lvs
我正在设置一个使用虚拟机(可能是亚马逊,但不是一成不变的)托管的应用程序,这将需要 HTTP 负载平衡和负载平衡大量(如果可能,50k 左右)的持久 TCP 连接。数据量并不高,但更新频繁。
现在我正在评估负载均衡器,并且对 HAProxy 的架构有点困惑。如果我使用 HAProxy 来平衡 TCP 连接,是否所有产生的流量都必须流经负载平衡器?如果是这样,另一种解决方案(例如 LVS 甚至 nginx_tcp_proxy_module)是否更合适?
Kyl*_*ndt 33
HAProxy(像许多负载均衡器一样)通常维护两个对话。代理与客户端有一个会话(在本例中为 tcp),并与服务器有另一个会话。因此,使用代理,您最终会在负载均衡器上看到 2 倍的连接。因此,所有流量都流经负载平衡器。
当涉及跨多个负载均衡器扩展时,我认为您不需要。但一种实用且相当简单的方法是使用带有两个浮动 IP 的keepalived和这两个 IP 之间的循环 DNS 之类的东西。使用 keepalived,如果其中一个负载均衡器出现故障,另一个将持有两个 IP,因此您可以通过这种方式获得高可用性。话虽如此,我认为您可以使用一个带有负载的活动 haproxy 实例。
HAProxy 的扩展性非常好。例如,Stack Exchange 网络使用 Web 套接字来维护开放的 TCP 连接。当我发布这篇文章时,我们在 VMware 虚拟机上建立了 143,000 个 TCP 套接字,没有任何问题。VM 上的 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
Run Code Online (Sandbox Code Playgroud)