我正在尝试使用 UCARP 和 HAProxy 在负载平衡配置中设置 2 个 Glassfish 服务器
Server1有 2 个 IP xxx17 和 xxx18
HAProxy 仅在 xxx18 上侦听,Glassfish 仅在 xxx17 上侦听,使用以下配置运行...
global
maxconn 4096
debug
user haproxy
group haproxy
defaults
mode http
retries 3
option redispatch
listen wms x.x.x.18:8080
source x.x.x.18
option httpchk
balance leastconn
server Server1 x.x.x.17:8080 check inter 2000 fastinter 500 fall 2 weight 50
server Server2 x.x.x.19:8080 check inter 2000 fastinter 500 fall 2 weight 50
具有 1 个 IP xxx19 的Server2正在运行 Glassfish
即使我可以手动从 xxx17:8080 获取页面并收到 200 OK 响应,HAProxy 说 Server1 已关闭并且不会将任何请求定向到它。我找不到任何理由。
以下是带有检查的 Server1 访问日志的摘录...
"x.x.x.18" "NULL-AUTH-USER" "14/Jan/2010:14:44:23 +0000" "OPTIONS / HTTP/1.0" 200 0
"x.x.x.18" "NULL-AUTH-USER" "14/Jan/2010:14:44:23 +0000" "OPTIONS / HTTP/1.0" 200 0
"x.x.x.18" "NULL-AUTH-USER" "14/Jan/2010:14:44:23 +0000" "OPTIONS / HTTP/1.0" 200 0
"x.x.x.18" "NULL-AUTH-USER" "14/Jan/2010:14:44:29 +0000" "OPTIONS / HTTP/1.0" 200 0
"x.x.x.18" "NULL-AUTH-USER" "14/Jan/2010:14:44:29 +0000" "OPTIONS / HTTP/1.0" 200 0
这是带有检查的 Server2 访问日志的摘录...
"x.x.x.18" "NULL-AUTH-USER" "14/Jan/2010:14:58:25 +0000" "OPTIONS / HTTP/1.0" 200 0
"x.x.x.18" "NULL-AUTH-USER" "14/Jan/2010:14:58:25 +0000" "OPTIONS / HTTP/1.0" 200 0
"x.x.x.18" "NULL-AUTH-USER" "14/Jan/2010:14:58:31 +0000" "OPTIONS / HTTP/1.0" 200 0
"x.x.x.18" "NULL-AUTH-USER" "14/Jan/2010:14:58:31 +0000" "OPTIONS / HTTP/1.0" 200 0
如果我删除 httpchk 选项,则 Server1 会检查为 UP,但这不是永久解决方案,因为如果响应确实失败,我们需要它正确地进行故障转移。
有任何想法吗?
(HAProxy 是 v1.3.22)
Addn:我刚刚尝试添加运行 Glassfish 但在 Windows 上的 server3 xxx13,当它启动并可以从代理机器访问时,它也会显示失败。
Addn2:安装haproxy v1.4后得到错误码,报错Layer7 invalid response info: "HTTP/1.1 "。当我们手动检索页面时,UP 和 DOWN 服务器都返回 HTTP/1.1 200 OK 作为第一行。
所以在运行wireshark之后看看发生了什么。在工作的 glassfish 服务器(以及我检查过的所有其他网络服务器)上,响应 HTTP/1.1 200 OK 都出现在第一个数据包中。在不工作的 glassfish 服务器上,响应来自 3 个 HTTP/1.1 数据包,然后是 200,然后是 OK。
那么知道为什么 HAProxy 不处理多个数据包或如何配置 glassfish 不拆分它吗?(maxKeepAliveRequests=1 已经)
答案是最新版本的 Glassfish 将响应拆分为多个数据包。
我在 haproxy邮件列表上发帖,得到了非常快的回复。
Krzysztof Oledzki 证实 haproxy 假定响应将全部包含在第一个数据包中,因为这是大多数已知 Web 服务器的行为。如果您搜索 Glassfish,他构建了一个快速而肮脏的修复补丁,可以在邮件列表存档中找到,并且可以应用于 beta 或最新的稳定版本 1.3.22
我还试图找出为什么 Glassfish 开始以这种方式行事,但在没有付费支持的情况下,我一无所获。如果有人能回答这个问题,赏金仍然是开放的。
运行 tcpdump 并捕获检查及其对每个服务器的响应。将 server1 的结果与 server2 的结果进行比较。
如果它在 server1 上工作但在 server2 或 server3 上不工作,则 server1 必须返回不同的东西。如果他们没有返回不同的东西,那么 haproxy 或您的 haproxy 配置有问题。
尝试将其他参数传递到 httpchk...
IE。