我正在设置一个使用虚拟机托管的应用程序(可能是亚马逊,但这不是一成不变的),这将需要 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 堆栈(路由表)中配置。我们一直在为大型视频流门户使用它。虽然它可以工作,但它会给你带来很多麻烦,因为路由很复杂。
因此,在没有充分考虑用途和缺点的情况下,我不会建议使用这种技术。
也许有一些提示可以帮助你开始:
- http://www.remsys.com/blog/configuring-dsr-on-the-alteon-load-balancers
- http://community.brocade.com/docs/DOC-1650
玩得开心!