Я пытаюсь настроить 2 сервера Glassfish в конфигурации с балансировкой нагрузки с использованием UCARP и HAProxy.
Сервер1 имеет 2 IP-адреса x.x.x.17 и x.x.x.18
HAProxy слушает только x.x.x.18, а Glassfish слушает только x.x.x.17, работающий со следующей конфигурацией ...
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
Сервер2 с 1 IP x.x.x.19 работает Glassfish
Хотя я могу вручную получить страницу из x.x.x.17: 8080 и получить ответ 200 OK, HAProxy сообщает, что Server1 находится в состоянии DOWN и не направляет на него никаких запросов. Я не могу найти причины, почему.
Вот выдержка из журнала доступа 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)
Дополнение: я просто попытался добавить server3 x.x.x.13 под управлением Glassfish, но в Windows, и это также говорит о том, когда он включен и доступен с прокси-машины.
Addn2: После установки v1.4 haproxy для получения кодов ошибок возникает ошибка: неверная информация ответа Layer7: «HTTP / 1.1». Когда мы извлекаем страницу вручную, серверы UP и DOWN возвращают HTTP / 1.1 200 OK в качестве первой строки.
Итак, после запуска wirehark, чтобы посмотреть, что происходит. На работающем сервере glassfish (и на всех других проверенных мной веб-серверах) ответ HTTP / 1.1 200 OK приходит в первом пакете. На серверах Glassfish, которые не работают, ответ приходит в виде 3 пакетов HTTP / 1.1, затем 200, затем OK.
Итак, есть идеи, почему HAProxy не имеет дело с несколькими пакетами или как настроить Glassfish, чтобы не разбивать его? (maxKeepAliveRequests = 1 уже)
Ответ заключается в том, что Glassfish в последних версиях разбивает ответ на несколько пакетов.
Я выложил на хапрокси список рассылки и получил удивительно быстрый ответ.
Кшиштоф Оледски подтвердил, что haproxy предполагает, что весь ответ будет содержаться в первом пакете, поскольку это поведение большинства известных веб-серверов. Он создал патч с быстрым и грязным исправлением, который доступен в архивах списков рассылки, если вы ищете Glassfish, и может быть применен к бета-версии или последней стабильной версии 1.3.22.
Я также попытался выяснить, почему Glassfish так себя ведет, но без платной поддержки ничего не добился. Если кто-нибудь может на это ответить, награда все еще открыта.
запустите tcpdump и запишите проверки и их ответы каждому серверу. сравните результаты с сервера1 с результатами с сервера2.
если он работает на server1, но не на server2 или server3, то server1 должен возвращать что-то другое. Если они не возвращают что-то другое, значит, что-то не так с haproxy или вашей конфигурацией haproxy.
Попробуйте передать дополнительные аргументы в httpchk ...
т.е.
option httpchk HEAD /test.php HTTP/1.1