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?
fonte
Respostas:
Coloque o servidor no modo de drenagem usando a interface de gerenciamento da web. Isso fornece a funcionalidade exata que você está procurando.
fonte
stick-table
com expiração para fornecer persistência.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 :)
fonte
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 :)
fonte