haproxy: como preparar uma manutenção do servidor sem chutar as sessões do aplicativo?

13

O problema

Estou usando o haproxy para equilibrar os servidores da web. Uso persistência de sessão com cookies adicionais, pois alguns aplicativos usam arquivos de sessão e eles não são sincronizados entre servidores.

Quero desabilitar um servidor para manutenção, mas sem interromper as sessões. Então, eu gostaria de permitir que os clientes existentes continuem sua sessão de aplicativos, mas não aceitem novos clientes.

comportamento haproxi

  • Defino um servidor como "indo para manutenção"
  • se um cliente tiver o conjunto de cookies, use o servidor mesmo se marcado como "entrando em manutenção"
  • se um novo cliente (sem cookie) vier, ele será direcionado para outro servidor
  • depois que todos os clientes terminarem suas sessões de aplicativos, nenhum cliente teria o cookie definido para esse servidor específico e eu seria bom desligá-lo sem interrupção do usuário.

Você acha que isso é possível com alguma configuração haproxy? Ou existe uma maneira inteligente de fazer isso?

Outras maneiras

Lista não exaustiva de outras maneiras de alcançar essa necessidade:

  • sincronizar arquivos de sessão entre servidores (precisa de uma maneira de sincronizar arquivos entre vários servidores ou um único ponto de montagem comum)
  • usar banco de dados para armazenar informações da sessão (precisa alterar o comportamento do aplicativo)

Mais detalhes

Eu uso esse tipo de configuração:

frontend https-in
   bind xxx.xxx.xxx.xxx:443 ssl crt /etc/haproxy/ssl/_default.pem crt /etc/haproxy/ssl
   reqadd X-Forwarded-Proto:\ https

   acl APP1 hdr(host) -i APP1.atac.local
   use_backend APP1 if APP1

   default_backend _default

backend APP1
   redirect scheme https if !{ ssl_fc }
   mode http
   balance roundrobin
   cookie HAPROXY_SESSION insert indirect
   option httpchk HEAD /haproxy_test_page.php HTTP/1.0\nUser-Agent:\ HAProxy
   server SRV1 SRV1_IP:PORT cookie SRV1 check
   server SRV2 SRV2_IP:PORT cookie SRV2 check

Se eu desabilitar o SRV1 (com o comando haproxy cli), acho que todas as sessões de aplicativos abertas no SRV1 serão interrompidas após o final da "sessão" HTTP atual. Isso está certo?

Christophe Drevet-Droguet
fonte
Seu servidor está executando no modo HTTP ou TCP?
de Austin
1
@austinian; É provável que o modo http veja como ele está falando sobre balanceamento e persistência com base em cookies (o modo TCP não oferece esses recursos).
GregL
@Christophe, você realmente tentou a configuração descrita na seção 'comportamento haproxy', porque deve funcionar.
GregL
@ GregL, certo, é isso que também estou pensando. Se ele estiver usando o modo HTTP e apenas definir o servidor para o modo de manutenção, ele deixará de aceitar novas sessões, mas manterá as sessões válidas ativas até que elas expirem. Você ainda pode ter cookies, etc. no modo TCP, mas isso não significa nada para o HAProxy.
de Austin
@Christophe, você está tentando usar "uma maneira mais inteligente" para reduzir o tempo de manutenção ou apenas procurando uma maneira de terminar as sessões normalmente enquanto espera para fazer a manutenção?
de Austin

Respostas:

6

Coloque o servidor no modo de drenagem usando a interface de gerenciamento da web. Isso fornece a funcionalidade exata que você está procurando.

austiniano
fonte
3
Se você configurá-lo para Maint, ele vai parar de enviar qualquer tráfego para ele, conforme descrito aqui . Em vez disso, ele gostaria de colocá-lo no modo Drenar e usar um stick-tablecom expiração para fornecer persistência.
GregL
@GregL, oops, corrigindo agora
austinian
Obrigado pela sua resposta, austinian e @GredL. Eu vou tentar isso. A parte difícil será com a mesa, acho. Vou ter que encontrar uma maneira de armazenar todos os clientes com o cookie definido no servidor do modo de drenagem nesta tabela.
Christophe Drevet-Droguet
Bem, parece que o modo de drenagem é suficiente no meu caso, as sessões que já possuem o conjunto de cookies ainda usam o servidor esgotado, e novas sessões são direcionadas para outros servidores.
Christophe Drevet-Droguet
1
Como você altera os modos na interface da web? Parece ser apenas informativo.
kagronick
9

Se você usar o socat para se comunicar com suas configurações de haproxy, poderá colocar um servidor no estado de drenagem da seguinte maneira:

echo "set server backend/serv state drain" | sudo socat stdio /etc/haproxy/haproxysock

Mais comandos aqui ! Para instalar o socat no Ubuntu, vá para esta resposta

Eu testei isso com haproxy 1.6.3 versão :)

Jhonatan Alarcon
fonte
1

Outras maneiras

sincronizar arquivos de sessão entre servidores (precisa de uma maneira de sincronizar arquivos entre vários servidores ou um único ponto de montagem comum)

Se seus servidores back-end usam PHP para o (s) aplicativo (s), você pode usar o Memcache para sincronizar as sessões entre eles.

Além disso, o Couchbase-Server pode fazer a replicação do memcache imediatamente .
Claro que é um exagero usar o couchbase-server apenas para replicação de sessões :)

Cha0s
fonte
Embora seja uma maneira melhor, ele precisa de alterações de código, eu acho. Então, eu vou usar austinian e GregL, responder por nossos aplicativos atuais que não sincronizam sessões.
Christophe Drevet-Droguet
Se seu código não definir um manipulador de sessão personalizado, não será necessário alterar nenhum código para que o PHP use o memcache para sessões. Está tudo configurado no php.ini, não no código.
usar o seguinte
OK, Cha0s, vou olhar para isso.
Christophe Drevet-Droguet