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

13

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?

Christophe Drevet-Droguet
la source
Votre serveur fonctionne-t-il en mode HTTP ou en mode TCP?
austinian
1
@austinian; Mode http probable vu comment il parle d'équilibrage et de persistance basés sur les cookies (le mode TCP n'offre pas de telles fonctionnalités).
GregL
@Christophe, avez-vous réellement essayé la configuration décrite dans votre section 'comportement haproxy', car cela devrait fonctionner.
GregL
@GregL, c'est ce que je pense aussi. S'il utilise le mode HTTP et met simplement le serveur en mode maintenance, il cessera d'accepter de nouvelles sessions mais conservera les sessions valides jusqu'à leur expiration. Vous pouvez toujours avoir des cookies, etc. en mode TCP, mais cela ne signifiera rien pour HAProxy.
austinian
@Christophe, essayez-vous d'utiliser "une manière plus intelligente" pour raccourcir votre temps de maintenance, ou cherchez-vous simplement un moyen de terminer les sessions en douceur pendant que vous attendez pour effectuer la maintenance?
austinian

Réponses:

6

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

austinien
la source
3
Si vous définissez à Maint, il va cesser d' envoyer tout le trafic vers elle, comme indiqué ici . Au lieu de cela, il voudrait le mettre en mode Drain et utiliser un stick-tableavec expiration pour fournir de la persistance.
GregL
@GregL, oops, fixing now
austinian
Merci pour votre réponse, austinian et @GredL. Je vais essayer ça. Le plus dur sera avec le stick-table, je pense. Je vais devoir trouver un moyen de stocker chaque client avec le cookie défini sur le serveur en mode drain dans ce stick-table.
Christophe Drevet-Droguet
Eh bien, il semble que le mode de vidange soit suffisant dans mon cas, les sessions qui ont déjà le cookie utilisé utilisent toujours le serveur drainé et les nouvelles sessions sont dirigées vers d'autres serveurs.
Christophe Drevet-Droguet
1
Comment changez-vous les modes dans l'interface Web? Cela semble être simplement informatif.
kagronick
9

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 :)

Jhonatan Alarcon
la source
1

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.

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 :)

Cha0s
la source
Bien que ce serait une meilleure façon, il faut des changements de code, je pense. Je vais donc utiliser austinian, et GregL, répondre à nos applications actuelles qui ne synchronisent pas les sessions.
Christophe Drevet-Droguet
Si votre code ne définit pas de gestionnaire de session personnalisé, vous n'avez pas besoin de changer de code pour que PHP utilise memcache pour les sessions. Tout est configuré dans php.ini, pas dans le code.
Cha0s
OK, Cha0s, je vais regarder ça.
Christophe Drevet-Droguet