我正在尝试使用 UCARP 和 HAProxy 在负载平衡配置中设置 2 个 Glassfish 服务器
服务器1有 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
服务器21 IP xxx19 正在运行 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)
附加:我刚刚尝试添加运行 Glassfish 的 server3 xxx13,但在 Windows 上,当它启动并可从代理机器访问时,它也显示关闭。
补充2:安装 haproxy v1.4 后获取错误代码,错误为 Layer7 无效响应信息:“HTTP/1.1”。当我们手动检索页面时,UP 和 DOWN 服务器都返回 HTTP/1.1 200 OK 作为第一行。
因此,运行 wireshark 后,查看发生了什么。在正常运行的 glassfish 服务器上(以及我检查过的所有其他 Web 服务器),响应 HTTP/1.1 200 OK 全部出现在第一个数据包中。在无法正常运行的 glassfish 服务器上,响应分为 3 个数据包,分别是 HTTP/1.1、200 和 OK。
那么,您知道为什么 HAProxy 不处理多个数据包或如何配置 glassfish 不拆分它吗?(maxKeepAliveRequests=1 已经)
答案1
答案是最新版本的 Glassfish 将响应分成多个数据包。
我在 haproxy 上发帖邮件列表并做出了非常迅速的反应。
Krzysztof Oledzki 证实,haproxy 假设响应将全部包含在第一个数据包中,因为这是大多数已知 Web 服务器的行为。他构建了一个补丁,其中包含一个快速而粗糙的修复程序,如果您搜索 Glassfish,可以在邮件列表档案中找到该补丁,并且可以应用于测试版或最新稳定版本 1.3.22
我也尝试找出 Glassfish 为何开始出现这种行为,但由于没有付费支持,我无计可施。如果有人能解答这个问题,悬赏仍然开放。
答案2
运行 tcpdump 并捕获对每个服务器的检查及其响应。将服务器 1 的结果与服务器 2 的结果进行比较。
如果它在 server1 上有效,但在 server2 或 server3 上无效,那么 server1 一定返回了不同的内容。如果它们没有返回不同的内容,那么 haproxy 或您的 haproxy 配置存在问题。
答案3
尝试将附加参数传递到 httpchk...
IE。
option httpchk HEAD /test.php HTTP/1.1