假设我向服务器提供商租用了 6 台专用服务器用于我的网站http://example.com:
#1:203.2.113.1
#2:203.2.113.2
#3:203.2.113.3
...
#6:203.2.113.6
每个的最大上传速率为 10 MB/s。
我决定使用机器#1作为负载均衡器,因此通过我的注册商,我设置了 DNS“A”记录:example.com A 203.2.113.1
。
两种情况:
50 个客户端希望从我的服务接收 200KB/s 的视频流同时:一切似乎都很好:
它们连接http://example.com在他们的浏览器中,DNS 为他们提供 IP 203.2.113.1,他们的浏览器向此 IP 发出 HTTP 请求,负载均衡器(机器 #1)接收 HTTP 请求,将任务分配给机器 #2、#3、...、#6,这些机器首先通过传递数据将流发送到客户端通过负载均衡器。我说的对吗?客户端不会接受来自 203.2.113.2 的响应,因为他们的请求被发送到 203.2.113.1?
200 个客户端想要从我的服务接收每秒 200KB 的视频流:这是行不通的:
客户端连接http://example.com在他们的浏览器中,DNS 为他们提供 IP 203.2.113.1,他们的浏览器向此 IP 发出 HTTP 请求,负载均衡器(机器 #1)接收 HTTP 请求,将任务分配给机器 #2、#3、...、#6。这 5 台机器中的每一台都处理 200 个客户端中的 1/5,即 40 个客户端 * 200KB/s = 8 MB/s。
如果 #2、#3、...、#6 可以发送数据直接面向客户,这样就没问题了(8 MB/s)。
但由于数据必须通过负载均衡器机器 #1 传输,因此它不起作用,因为机器 #1 无法以 40 MB/s 的速度上传。
如何配置负载均衡器(机器#1)来解决这个问题?
或者负载均衡器可以将请求传递给机器 #2、#3、...、#6,然后它们再回复客户端直接地,而无需通过机器 #1 获取响应?
答案1
答案2
你确定http://www.haproxy.org/无法处理来自 200 多个客户的流量?请阅读以下示例:http://www.haproxy.org/#perf。
实际上,它所要做的就是将 TCP/IP 流量路由到特定机器并返回。从 CPU 角度来看,除了连接数量非常大之外,这并不昂贵。我更担心网络控制器的容量,您还必须记住诸如打开文件的最大数量等可能会对处理网络流量产生负面影响的事情。似乎仔细调整网络堆栈比 HAProxy 的容量更重要:
所有这些微优化都使 CPU 使用率即使在中等负载下也非常低。即使在非常高的负载下,当 CPU 饱和时,也经常会出现用户使用率为 5%、系统使用率为 95% 这样的数字,这意味着 HAProxy 进程的消耗比系统进程少大约 20 倍。这就解释了为什么操作系统的调整非常重要。
答案3
或者负载均衡器是否可以将请求传递给机器#2,#3,...,#6,然后它们直接答复客户端,而不需要通过机器#1来获得响应?
是的,这被称为“直接返回”负载平衡,任何像样的 L4 负载平衡器都能够做到这一点。
答案4
我刚刚找到了该问题的潜在解决方案,具体如下:
解决方案 1
客户端的浏览器连接到
example.com
,即经过 DNS 解析后,连接到服务器 #1 (203.2.113.1)服务器 #1 查看机器 #2、#3、…、#6 中哪个可用,假设 #5 当前负载最小,可以承担这项工作
服务器#1向客户端发送HTTP响应:
yourworker=203.2.113.5
或yourworker=worker5.example.com
客户端收到此信息,并知道它现在必须连接
203.2.113.5
或worker5.example.com
(通过 AJAX/XMLHttpRequest)接收视频流。
因此视频流量永远不会经过负载均衡器yourworker=...
机器#1一开始只为每个客户端发送几个字节( ),即不再存在瓶颈。
唯一的潜在问题是:如果浏览器已经加载了页面http://example.com从 203.2.113.1 开始,它能否对 203.2.113.5 执行 AJAX/XHR 操作或worker5.example.com
接收视频流,或者这会被拒绝,因为CORS?
编辑:已测试,有效。如果您启用,它就可以工作Access-Control-Allow-Origin
,例如使用 Apache .htaccess
(我们可以设置更精确的控制,但这里测试没问题):
Header set Access-Control-Allow-Origin "*"
解决方案 2
另一个更简单的解决方案:负载均衡器#1不能只分析哪些机器#2,#3,...,#6可用,并将其返回给客户端:
<?php
$i = which_worker_available();
header('Location: https://worker' . $i . '.example.com/');
?>
?
然后其余所有流量再也不会经过负载均衡器。不再有瓶颈。
问题在于:客户端浏览器中显示的 URL 将从https://example.com到https://worker5.example.com这对于最终用户来说不是很好。
编辑:已测试,有效(但浏览器栏中的 URL 确实从http://example.com到http://worker5.example.com/..。