我正在尝试使用UCARP和HAProxy在负载平衡configuration中安装2个Glassfish服务器
Server1有2个IP xxx17和xxx18
HAProxy正在侦听仅xxx18和Glassfish侦听只有xxx17运行与以下configuration…
global maxconn 4096 debug user haproxy group haproxy defaults mode http retries 3 option redispatch listen wms xxx18:8080 source xxx18 option httpchk balance leastconn server Server1 xxx17:8080 check inter 2000 fastinter 500 fall 2 weight 50 server Server2 xxx19:8080 check inter 2000 fastinter 500 fall 2 weight 50
具有1个IP xxx19的Server2正在运行Glassfish
即使我可以从xxx17:8080手动wget页面并收到200 OK响应,HAProxy表示Server1处于closures状态,并且不会向其发送任何请求。 我找不到任何理由。
这是一个摘录从Server1访问日志与检查…
"xxx18" "NULL-AUTH-USER" "14/Jan/2010:14:44:23 +0000" "OPTIONS / HTTP/1.0" 200 0 "xxx18" "NULL-AUTH-USER" "14/Jan/2010:14:44:23 +0000" "OPTIONS / HTTP/1.0" 200 0 "xxx18" "NULL-AUTH-USER" "14/Jan/2010:14:44:23 +0000" "OPTIONS / HTTP/1.0" 200 0 "xxx18" "NULL-AUTH-USER" "14/Jan/2010:14:44:29 +0000" "OPTIONS / HTTP/1.0" 200 0 "xxx18" "NULL-AUTH-USER" "14/Jan/2010:14:44:29 +0000" "OPTIONS / HTTP/1.0" 200 0
这是一个摘录从Server2访问日志与检查…
"xxx18" "NULL-AUTH-USER" "14/Jan/2010:14:58:25 +0000" "OPTIONS / HTTP/1.0" 200 0 "xxx18" "NULL-AUTH-USER" "14/Jan/2010:14:58:25 +0000" "OPTIONS / HTTP/1.0" 200 0 "xxx18" "NULL-AUTH-USER" "14/Jan/2010:14:58:31 +0000" "OPTIONS / HTTP/1.0" 200 0 "xxx18" "NULL-AUTH-USER" "14/Jan/2010:14:58:31 +0000" "OPTIONS / HTTP/1.0" 200 0
如果我删除了httpchk选项,那么Server1将检查为UP,但是这不是一个永久的解决scheme,因为如果响应真的失败,我们需要它来正确地进行故障切换。
有任何想法吗?
(HAProxy是v1.3.22)
Addn:我刚刚尝试添加运行Glassfish的server3 xxx13,但是在Windows上,并且在代理服务器启动并可以访问的时候也会提示。
Addn2:在安装haproxy v1.4后得到错误码,错误是Layer7无效响应信息:“HTTP / 1.1”。 当我们手动检索页面时,UP和DOWN服务器都返回HTTP / 1.1 200 OK作为第一行。
所以在运行wireshark看看是怎么回事。 在工作的glassfish服务器(以及我检查过的所有其他web服务器)上,响应HTTP / 1.1 200 OK全部出现在第一个数据包中。 在没有工作的glassfish服务器上,响应来自HTTP / 1.1的3个数据包,然后是200,然后是OK。
因此,任何想法为什么HAProxy不处理多个数据包或如何configurationglassfish不分裂它? (maxKeepAliveRequests = 1已经)
答案是最新版本的Glassfish将响应分成多个包。
我发布在haproxy 邮件列表上 ,反应非常快。
Krzysztof Oledzki证实,haproxy认为响应将被包含在第一个数据包中,因为这是大多数已知的Web服务器的行为。 他build立了一个修补程序,可以在邮件列表归档中find,如果您searchGlassfish,可以应用到testing版或最新的稳定版本1.3.22
我也试图找出为什么Glassfish开始这样做,但没有付费的支持,我没有任何地方。 如果任何人都可以回答的话,赏金仍然是开放的。
运行tcpdump并将检查及其响应捕获到每个服务器。 将server1的结果与server2的结果进行比较。
如果它在server1上工作,但不在server2或server3上,那么server1必须返回不同的东西。 如果他们没有返回不同的东西,那么haproxy或者haproxy的configuration就有问题。
尝试传入额外的参数到httpchk …
即。
option httpchk HEAD /test.php HTTP/1.1