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

9

O problema

Estou usando o haproxy para balancear a carga de servidores da web. Eu 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.

Desejo desativar um servidor para manutenção, mas sem interromper as sessões. Por isso, gostaria de permitir que os clientes existentes continuem a sua sessão de aplicativo, mas não aceitem novos clientes.

comportamento haproxy

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

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

Outras formas

Lista não exaustiva de outras formas 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)
  • usa banco de dados para armazenar informações da sessão (precisa mudar 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 apenas desabilitar o SRV1 (com o comando haproxy cli), acho que todas as sessões do aplicativo abertas no SRV1 serão interrompidas após o término da "sessão" atual do HTTP. Está certo?

    
por Christophe Drevet-Droguet 15.07.2015 / 18:39

3 respostas

3

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

    
por 16.07.2015 / 16:14
8

Se você usa socat para se comunicar com suas configurações de haproxy, você pode 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, acesse answer

Eu testo isso com a versão haproxy 1.6.3:)

    
por 09.03.2016 / 19:32
1

Other ways

synchronize session files between servers (needs a way to synchronize files between several servers, or a common single mountpoint)

Se os servidores de 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 fora da caixa.
É claro que é um pouco exagerado usar o couchbase-server apenas para replicação de sessões:)

    
por 16.07.2015 / 17:11