HAProxy 检查显示服务器已关闭,但实际上服务器已启动

HAProxy 检查显示服务器已关闭,但实际上服务器已启动

我正在尝试使用 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

相关内容