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?