Я использую apache httpd с ProxyPass и DNS RR и липкие сеансы Java для Tomcat.
Это не работает.
Моя конфигурация apache:
ProxyPass "/" "balancer://mycluster/" stickysession=JSESSIONID|jsessionid scolonpathdelim=On
<Proxy balancer://mycluster>
BalancerMember http://stest:8080/
</Proxy>
<Location "/balancer-manager">
SetHandler balancer-manager
Require host localhost
</Location>
Когда я делаю nslookup stest
на хосте httpd у меня есть 5 хостов, которые возвращаются:
root@sproxy:/app# nslookup stest
Server: 127.0.0.11
Address: 127.0.0.11#53
Non-authoritative answer:
Name: stest
Address: 10.0.0.7
Name: stest
Address: 10.0.0.6
Name: stest
Address: 10.0.0.8
Name: stest
Address: 10.0.0.2
Name: stest
Address: 10.0.0.5
Таким образом, мой httpd-сервер должен маршрутизировать один из этих IP-адресов до тех пор, пока JSESSIONID
cookie установлен, и тогда он должен быть прикреплен к этому IP.
Проблема в том, что это не работает. Когда я делаю:
while true; do curl -b /tmp/cj.txt -c /tmp/cj.txt -w '\n' localhost/test-session-servlet/json ; done
Я получаю вывод своего сервлета, который включает в себя выбранный мной хост Tomcat и идентификатор сеанса.
Я ожидал, что это коснется только одного сервера, поскольку файл cookie устанавливается в /tmp/cj.txt
и передается на каждый запрос. Я получаю тот же результат с помощью приведенной выше команды, что и с:
while true; do curl -w '\n' localhost/test-session-servlet/json ; done
(обратите внимание, что приведенная выше команда не использует файлы cookie, поэтому она должна быть сбалансирована по нагрузке даже с участием липкие сеансы, потому что он не передает cookie)
По сути, обе команды curl отправляются на разные серверы, как если бы липкие сеансы не были включены должным образом, но первая не должна этого делать.
Что я здесь делаю не так?
Tomcat и httpd работают так, как задумано. Проблема в том, что созданная вами архитектура никогда не будет работать. Вам нужен route
в httpd.conf
и jvmRoute
в server.xml
быть установленным и последовательным.
Одно из возможных решений - явно определить каждый из лучших хостов в вашем файле httpd.conf. Что-то вроде:
<Proxy balancer://mycluster>
BalancerMember http://10.0.0.2:8080/ route=tc01
BalancerMember http://10.0.0.5:8080/ route=tc02
BalancerMember http://10.0.0.6:8080/ route=tc03
BalancerMember http://10.0.0.7:8080/ route=tc04
BalancerMember http://10.0.0.8:8080/ route=tc05
</Proxy>
Вам также необходимо установить jvmRoute
на <Engine>
элемент в server.xml
каждого экземпляра Tomcat и убедитесь, что он соответствует маршруту, определенному выше.