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.
Pensez-vous que cela soit réalisable avec une configuration haproxy? Ou existe-t-il un moyen intelligent de le faire?
Liste non exhaustive d'autres moyens de répondre à ce besoin:
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?
Mettez le serveur en mode drain à l'aide de l'interface de gestion Web. Cela fournit la fonctionnalité exacte que vous recherchez.
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 :)
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 :)