haproxy: Wie bereite ich eine Serverwartung vor, ohne App-Sitzungen zu starten?

13

Die Angelegenheit

Ich verwende Haproxy, um Webserver auszugleichen. Ich verwende Sitzungspersistenz mit zusätzlichen Cookies, da einige Anwendungen Sitzungsdateien verwenden und diese nicht zwischen Servern synchronisiert werden.

Ich möchte einen Server für die Wartung deaktivieren, ohne die Sitzungen zu unterbrechen. Daher möchte ich vorhandenen Clients erlauben, ihre Anwendungssitzung fortzusetzen, aber keine neuen Clients zu akzeptieren.

Haproxy-Verhalten

  • Ich habe einen Server so eingestellt, dass er zur Wartung geht.
  • Wenn auf einem Client das Cookie gesetzt ist, wird der Server auch dann verwendet, wenn "In Wartung" markiert ist.
  • Wenn ein neuer Client (ohne Cookie) kommt, wird er an einen anderen Server weitergeleitet
  • Nachdem alle Clients ihre Anwendungssitzungen beendet haben, hat kein Client mehr das Cookie auf diesen bestimmten Server gesetzt, und ich wäre gut, wenn ich es ohne Benutzerunterbrechung herunterfahren würde.

Glauben Sie, dass dies mit einer Haproxy-Konfiguration möglich ist? Oder gibt es eine clevere Möglichkeit?

Andere Möglichkeiten

Nicht erschöpfende Liste anderer Möglichkeiten zur Erreichung dieses Bedarfs:

  • Synchronisieren Sie Sitzungsdateien zwischen Servern
  • Datenbank zum Speichern von Sitzungsinformationen verwenden (muss das Anwendungsverhalten ändern)

Mehr Details

Ich benutze diese Art der Konfiguration:

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

Wenn ich nur SRV1 deaktiviere (mit dem Befehl haproxy cli), werden alle auf SRV1 geöffneten Anwendungssitzungen nach dem Ende der aktuellen HTTP- "Sitzung" unterbrochen. Ist das richtig?

Christophe Drevet-Droguet
quelle
Läuft Ihr Server im HTTP- oder TCP-Modus?
Austin
1
@austinian; Wahrscheinlich im HTTP-Modus, da er über das Ausgleichen und die Beständigkeit auf der Grundlage von Cookies spricht (der TCP-Modus bietet solche Funktionen nicht an).
GregL
@Christophe, hast du tatsächlich die Konfiguration ausprobiert, die in deinem Abschnitt 'Haproxy-Verhalten' beschrieben ist, weil es funktionieren sollte.
GregL
@ GregL, richtig, das denke ich auch. Wenn er den HTTP-Modus verwendet und den Server nur in den Wartungsmodus versetzt, akzeptiert er keine neuen Sitzungen mehr, behält jedoch die gültigen Sitzungen bei, bis sie ablaufen. Sie können im TCP-Modus immer noch Cookies usw. haben, aber dann hat dies für HAProxy keine Bedeutung.
Austin
@Christophe, versuchen Sie, die Wartungszeit auf "clevere Weise" zu verkürzen, oder suchen Sie nur nach einer Möglichkeit, die Sitzungen ordnungsgemäß zu beenden, während Sie auf die Wartung warten?
Austin

Antworten:

6

Versetzen Sie den Server über die Webverwaltungsschnittstelle in den Drain-Modus. Das bietet genau die Funktionalität, die Sie suchen.

austinian
quelle
3
Wenn Sie Maint einstellen, wird kein Datenverkehr mehr an das Gerät gesendet , wie hier beschrieben . Vielmehr würde er es in den Entleerungsmodus versetzen und ein stick-tablemit Ablauf verwenden wollen, um für Ausdauer zu sorgen.
GregL
@ GregL, oops, jetzt reparieren
austinian
Danke für deine Antwort, austinian und @GredL. Ich werde das versuchen. Der schwierige Teil wird mit dem Stick-Tisch sein, denke ich. Ich muss einen Weg finden, um jeden Client mit dem Cookie, das auf den Server für den Abflussmodus gesetzt ist, in dieser Stick-Tabelle zu speichern.
Christophe Drevet-Droguet
Nun, es scheint, dass der Drain-Modus in meinem Fall ausreichend ist, die Sitzungen, in denen das Cookie bereits gesetzt ist, den gelöschten Server weiterhin verwenden und neue Sitzungen an andere Server weitergeleitet werden.
Christophe Drevet-Droguet
1
Wie ändere ich den Modus in der Weboberfläche? Es scheint nur informativ zu sein.
Kagronick
9

Wenn Sie socat für die Kommunikation mit Ihren Haproxy-Konfigurationen verwenden, können Sie einen Server auf folgende Weise in den Auslastungszustand versetzen:

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

Mehr Befehle hier ! Um socat in Ubuntu zu installieren, gehen Sie zu dieser Antwort

Ich teste das mit haproxy 1.6.3 version :)

Jhonatan Alarcon
quelle
1

Andere Möglichkeiten

Synchronisieren Sie Sitzungsdateien zwischen Servern

Wenn Ihre Back-End-Server PHP für die Anwendung (en) verwenden, können Sie die Sitzungen zwischen ihnen mit Memcache synchronisieren.

Auch Couchbase-Server kann memcache Replikation aus der Box tun.
Natürlich ist es etwas übertrieben, den couchbase-server nur für die Replikation von Sitzungen zu verwenden :)

Cha0s
quelle
Es wäre zwar ein besserer Weg, aber ich denke, es braucht Codeänderungen. Ich werde also austinian und GregL als Antwort für unsere aktuellen Anwendungen verwenden, die keine Sitzungen synchronisieren.
Christophe Drevet-Droguet
Wenn Ihr Code keinen benutzerdefinierten Sitzungshandler festlegt, müssen Sie keinen Code für PHP ändern, um Memcache für Sitzungen zu verwenden. Es ist alles in der php.ini konfiguriert, nicht im Code.
Cha0s
OK, Cha0s, das schaue ich mir an.
Christophe Drevet-Droguet