web-dev-qa-db-fra.com

haproxy: comment préparer une maintenance de serveur sans botter les sessions d'application?

Le problème

J'utilise haproxy pour équilibrer la charge des serveurs Web. J'utilise la persistance de session avec des cookies supplémentaires car certaines applications utilisent des fichiers de session et ceux-ci ne sont pas synchronisés entre les serveurs.

Je souhaite désactiver un serveur pour la maintenance, mais sans interrompre les sessions. Je voudrais donc autoriser les clients existants à poursuivre leur session d'application, mais ne pas accepter de nouveaux clients.

comportement haproxy

  • J'ai configuré un serveur pour "passer en maintenance"
  • si un client a défini le cookie, utilisez le serveur même s'il est marqué comme "en cours de maintenance"
  • si un nouveau client (sans cookie) arrive, il est dirigé vers un autre serveur
  • une fois que tous les clients ont terminé leurs sessions d'application, plus aucun client n'aurait le cookie défini sur ce serveur particulier, et je serais bien de le fermer sans interruption de l'utilisateur.

Pensez-vous que cela soit réalisable avec une configuration haproxy? Ou existe-t-il un moyen intelligent de le faire?

D'autres moyens

Liste non exhaustive d'autres moyens de répondre à ce besoin:

  • synchroniser les fichiers de session entre les serveurs (nécessite un moyen de synchroniser les fichiers entre plusieurs serveurs ou un point de montage unique commun)
  • utiliser la base de données pour stocker les informations de session (doit changer le comportement de l'application)

Plus de détails

J'utilise ce type de configuration:

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

Si je désactive juste SRV1 (avec la commande haproxy cli), je pense que toutes les sessions d'application ouvertes sur SRV1 se briseront après la fin de la "session" HTTP actuelle. Est-ce correct?

13

Mettez le serveur en mode drain à l'aide de l'interface de gestion Web. Cela fournit la fonctionnalité exacte que vous recherchez.

6
austinian

Si vous utilisez socat pour communiquer avec vos configurations haproxy, vous pouvez mettre un serveur en état drain de la manière suivante:

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

Plus de commandes ici ! Pour installer socat dans Ubuntu, allez à ceci réponse

Je teste cela avec la version haproxy 1.6.3 :)

10
Jhonatan Alarcon

D'autres moyens

synchroniser les fichiers de session entre les serveurs (nécessite un moyen de synchroniser les fichiers entre plusieurs serveurs ou un point de montage unique commun)

Si vos serveurs principaux utilisent PHP pour les applications), vous pouvez utiliser Memcache pour synchroniser les sessions entre eux.

--- Couchbase-Server peut faire la réplication memcache hors de la boîte.
Bien sûr, c'est un peu exagéré d'utiliser couchbase-server juste pour la réplication des sessions :)

1
Cha0s