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?
la source
Réponses:
Mettez le serveur en mode drain à l'aide de l'interface de gestion Web. Cela fournit la fonctionnalité exacte que vous recherchez.
la source
stick-table
avec expiration pour fournir de la persistance.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 à cette réponse
Je teste cela avec la version haproxy 1.6.3 :)
la source
Si vos serveurs principaux utilisent PHP pour les applications, vous pouvez utiliser Memcache pour synchroniser les sessions entre eux.
Aussi Couchbase-serveur peut faire memcache la réplication 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 :)
la source