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?
quelle
Antworten:
Versetzen Sie den Server über die Webverwaltungsschnittstelle in den Drain-Modus. Das bietet genau die Funktionalität, die Sie suchen.
quelle
stick-table
mit Ablauf verwenden wollen, um für Ausdauer zu sorgen.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 :)
quelle
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 :)
quelle