Forçar o proxy_balancer do Apache para um trabalhador específico

2

Eu gostaria de ter dois servidores tomcat atrás de um proxy_balancer para que eu possa fazer implantações contínuas.

Eu tenho este trabalho para que eu possa derrubar um gato e o outro receba as solicitações do futuro

<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

O que eu gostaria de fazer agora é derrubar um servidor e desconectá-lo do pool, o que eu posso fazer com o gerenciador de balanceamento. Então, quando eu tiver atualizado e trouxe esse servidor instalado e funcionando - antes de retornar à piscina, eu gostaria de ser capaz de acessá-lo para que eu possa sanidade verificar antes de retornar à piscina. Por exemplo

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

mas isso não funciona porque o servidor redireciona-se para / services e passa pelo balanceador. Eu poderia fazer isso com um domínio separado, mas quero evitar isso.

Pensei em definir um cookie com base em um parâmetro de URL que poderia funcionar, mas era complicado de fazer. Existe algum recurso para permitir isso facilmente. Por exemplo, em HAProxy eu posso fazer isso

use-server tomcat_01 if { path_end TOMCAT_01 }
use-server tomcat_02 if { path_end TOMCAT_02 }
    
por DavidC 14.01.2015 / 19:19

1 resposta

1

Foi assim que eu fiz. Configure três pools de balanceadores - o principal e um para cada servidor individual:

<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>

Ter um pool para os servidores individuais mantém as coisas consistentes.

O route=p1 é usado para definir um cookie para que o balanceador possa usar afinidade de sessão de sessão de adesão - que é o mesmo servidor para uma sessão do navegador. Mesmo que as sessões sejam compartilhadas entre os servidores, isso é útil para uma implantação contínua, porque eu não quero que um usuário acesse a versão antiga e, em seguida, obtenha arquivos .js etc. do novo servidor.

Eu usarei esse cookie para decidir qual pool usar. Por exemplo. se o ROUTEID cookie for .t1 (observe o ponto inicial - isso é necessário, aparentemente) então use o balanceador 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

Quando o cookie de rota for definido, a sessão continuará passando pelo balanceador de back-end.

Eu posso escolher qual balanceador quero usar anexando um identificador ao final do URL para selecionar o pool de balanceadores que desejo usar para esta sessão.

Defina a variável de ambiente TARGET_POOL para o pool apropriado

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

Agora, posso usar TARGET_POOL para passar a solicitação ao balanceador de back-end selecionado

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

Observe que para essas variáveis funcionarem ProxyPassInterpolateEnv On é obrigatório e cada ProxyPass e ProxyPassReverse precisa de interpolate

Por fim, preciso definir o cookie que é usado acima para a afinidade de sessão do stickysession pelo balanceador e por mim para selecionar o back-end:

Header add Set-Cookie "ROUTEID=.%{BALANCER_WORKER_ROUTE}e; path=/;" env=BALANCER_ROUTE_CHANGED
    
por 15.01.2015 / 16:58