Принудительно использовать Apache proxy_balancer для конкретного работника

Я хотел бы иметь два сервера tomcat за proxy_balancer, чтобы я мог выполнять развертывание развертывания.

У меня это работает, так что я могу снять одного кота, а другой принимает запросы на фюрера

<Proxy balancer://production>
    BalancerMember http://10.10.10.111:8080 route=s1
    BalancerMember http://10.10.10.112:8080 route=s2
    ProxySet stickysession=ROUTEID
</Proxy>
ProxyPass /services balancer://production/services
Header add Set-Cookie "ROUTEID=.%{BALANCER_WORKER_ROUTE}e; path=/;" env=BALANCER_ROUTE_CHANGED

Теперь я хотел бы отключить один сервер и отключить его от пула, что я могу сделать с помощью балансировщика-менеджера. Затем, когда я обновил и запустил этот сервер и запустил его - прежде чем вернуться в пул, я хотел бы иметь возможность получить к нему доступ, чтобы проверить его работоспособность, прежде чем вернуться в пул. Например

ProxyPass /sanity_check http://10.10.10.111:8080/services

но это не сработает, потому что сервер перенаправляет себя в /services и проходит через балансировщик. Я мог бы сделать это с отдельным доменом, но хочу избежать этого.

Я думал о настройке cookie на основе параметра URL, который мог бы работать, но было неудобно. Есть ли какая-то особенность, чтобы позволить это легко. Например в HAProxy я могу это сделать

use-server tomcat_01 if { path_end TOMCAT_01 }
use-server tomcat_02 if { path_end TOMCAT_02 }

1 ответ

Решение

Вот как я это сделал. Настройте 3 пула балансировки - основной и один для каждого отдельного сервера:

<Proxy balancer://tomcat1>
   BalancerMember http://10.10.10.111:8080 route=t1
   ProxySet stickysession=ROUTEID
</Proxy>
<Proxy balancer://tomcat2>
   BalancerMember http://10.10.10.112:8080 route=t2
   ProxySet stickysession=ROUTEID
</Proxy>
<Proxy balancer://production>
   BalancerMember http://10.10.10.111:8080 route=p1
   BalancerMember http://10.10.10.112:8080 route=p2
   ProxySet stickysession=ROUTEID
</Proxy>

Наличие пула для отдельных серверов обеспечивает согласованность.

route=p1 используется для установки файла cookie, чтобы балансировщик мог использовать привязку сеанса stickysession - то есть использовать тот же сервер для сеанса браузера. Даже если сеансы распределяются между серверами, это полезно для непрерывного развертывания, потому что я не хочу, чтобы пользователь запускал старую версию, а затем получал файлы.js и т. Д. С нового сервера.

Я буду использовать этот файл cookie, чтобы решить, какой пул использовать. Например, если ROUTEID печенье это .t1 (обратите внимание на начальную точку - это необходимо, по-видимому), затем используйте балансировщик tomcat1.

# Default to production pool 
SetEnvIf Request_URI "/" TARGET_POOL=production

SetEnvIf Cookie "ROUTEID=.t1" TARGET_POOL=tomcat1
SetEnvIf Cookie "ROUTEID=.t2" TARGET_POOL=tomcat2

Как только cookie-файл маршрута установлен, сеанс будет продолжать проходить через этот серверный балансировщик.

Я могу выбрать балансировщик, который хочу использовать, добавив идентификатор в конец URL-адреса, чтобы выбрать пул балансировщика, который я хочу использовать для этого сеанса.

Установите переменную среды TARGET_POOL в соответствующий бассейн

SetEnvIf Request_URI "/select_tomcat1$" TARGET_POOL=tomcat1
SetEnvIf Request_URI "/select_tomcat2$" TARGET_POOL=tomcat2
SetEnvIf Request_URI "/select_pool$" TARGET_POOL=production

Теперь я могу использовать TARGET_POOL передать запрос выбранному серверному балансировщику

ProxyPassInterpolateEnv On
ProxyPass /services balancer://${TARGET_POOL}/services interpolate
ProxyPassReverse /services balancer://${TARGET_POOL}/services interpolate

Обратите внимание, что для работы этих переменных ProxyPassInterpolateEnv On требуется и каждый ProxyPass а также ProxyPassReverse нужен interpolate

Наконец, мне нужно установить cookie, который используется выше для балансировки сеанса липкой сессии балансировщиком и мной, чтобы выбрать серверную часть:

Header add Set-Cookie "ROUTEID=.%{BALANCER_WORKER_ROUTE}e; path=/;" env=BALANCER_ROUTE_CHANGED
Другие вопросы по тегам