我们使用带有 mod_proxy、mod_proxy_balancer 和 mod_status 的 apache2-worker 包。Apache 被配置为 WFS 服务器的负载平衡器/调度器。
操作系统:SuSE SLES 11 SP2
Apache httpd:版本 2.2.12
我们所有的工作人员(WFS 服务器)一次只能处理一个请求。所以在/etc/apache2/server-tuning.conf
第 部分中<IfModule worker.c>
,我们将参数ServerLimit
设置为1
。在 BalancerMember 的配置中,我们使用了参数max=1
。即/etc/apache2/conf.d/proxy.conf
看起来像这样:
<Proxy balancer://wfscluster>
BalancerMember http://wfsserver01:9090 max=1 timeout=3600 acquire=30000
BalancerMember http://wfsserver01:9091 max=1 timeout=3600 acquire=30000
BalancerMember http://wfsserver02:9090 max=1 timeout=3600 acquire=30000
</Proxy>
ProxyPass /wfs balancer://wfscluster/ nofailover=On
参数acquire
:
文档说:
如果设置,这将是在连接池中等待空闲连接的最长时间,以毫秒为单位。如果池中没有空闲连接,Apache 将返回 SERVER_BUSY 状态给客户端。
我对参数acquire
的理解如下,也是我想要的行为:
负载均衡器从客户端获取一些请求。在某个时间点,所有工人都很忙。负载均衡器将保持下一个请求保持暂停状态,直到工作人员空闲为止。如果工作人员空闲,则将挂起的请求分配给空闲工作人员,然后该工作人员接受连接。如果在参数指定的时间内没有空闲的工作人员,acquire
客户端会收到错误响应。
但是该参数acquire
没有按预期工作。负载均衡器将下一个请求分配给忙碌的工作人员。即使在此期间另一个工作人员空闲,该请求仍会分配给忙碌的工作人员,客户端必须等到忙碌的工作人员完成当前请求并接受新的请求。
如果你这样做,/etc/init.d/apache2 reload
你会在 apaches error_log 中收到一条错误消息:
BalancerMember 获取超时格式错误
在那条消息之后,httpd 死了。如果您只启动或重新启动 httpd,您不会收到该消息并且 httpd 是活动的。
我还尝试指定一个单位,如 in acquire=30000ms
。但错误仍然存在。唯一有帮助的是删除acquire
参数,但所描述的行为是相同的。
所以问题是:
- 我必须如何使用参数
acquire
?有人有工作的例子吗? - 我是否必须使用其他参数才能获得所需的行为?