Wie wird Sitzungsstabilität über mehrere Webserver hinweg erreicht?

22

Wie viele Webserver hat StackOverflow / ServerFault?

Wenn die Antwort "mehr als eins" lautet, wird dann beim DNS-Polling Sitzungsstabilität erreicht ?

p.Campbell
quelle
Nicht wirklich, aber wenn es anders formuliert wäre, könnte es eine interessante Frage stellen.
Sie sollten die Frage umformulieren. Ändern Sie den Titel in "Wie wird Sitzungsstabilität auf mehreren Webservern erreicht?" oder so ähnlich ...
William Brendel
Könntest du mir einen Gefallen tun, um mir den richtigen Satz zu zeigen?
1
Die Annahme, dass mehrere Server Sticky-Sessions bedeuten - ein Gräuel - schmerzt mich.
womble

Antworten:

42

Große Websites können auf mehreren Computern "lastausgeglichen" werden. In vielen Setups mit Lastenausgleich kann ein Benutzer während einer Sitzung auf einen beliebigen Back-End-Computer zugreifen. Aus diesem Grund gibt es eine Reihe von Methoden, mit denen viele Computer Benutzersitzungen gemeinsam nutzen können.

Die gewählte Methode hängt von der Art des Lastausgleichs sowie von der Verfügbarkeit / Kapazität des Back-End-Speichers ab:

Nur in Cookies gespeicherte Sitzungsinformationen: Sitzungsinformationen (nicht nur eine Sitzungskennung) werden in einem Cookie eines Benutzers gespeichert. Beispielsweise kann der Cookie des Benutzers den Inhalt seines Einkaufskorbs enthalten. Um zu verhindern, dass Benutzer die Sitzungsdaten manipulieren, kann ein HMAC zusammen mit dem Cookie bereitgestellt werden. Diese Methode ist wahrscheinlich für die meisten Anwendungen am wenigsten geeignet:

  • Es ist kein Backend-Speicher erforderlich
  • Der Benutzer muss nicht jedes Mal auf den gleichen Computer zugreifen, sodass der DNS-Lastenausgleich verwendet werden kann
  • Mit dem Abrufen der Sitzungsinformationen von einem Datenbankcomputer ist keine Latenz verbunden (da er mit der HTTP-Anforderung bereitgestellt wird). Nützlich, wenn Ihre Site durch Computer auf verschiedenen Kontinenten ausgelastet ist.
  • Die Datenmenge, die in der Sitzung gespeichert werden kann, ist begrenzt (durch die Begrenzung der Cookie-Größe auf 4 KB).
  • Die Verschlüsselung muss angewendet werden, wenn ein Benutzer den Inhalt seiner Sitzung nicht sehen kann
  • HMAC (oder ähnliches) muss verwendet werden, um eine Manipulation der Sitzungsdaten durch den Benutzer zu verhindern
  • Da die Sitzungsdaten nicht serverseitig gespeichert werden, ist das Debuggen für Entwickler schwieriger

Load Balancer leitet Benutzer immer auf denselben Computer weiter : Viele Load Balancer setzen möglicherweise ein eigenes Sitzungscookie, das angibt, von welchem ​​Back-End-Computer ein Benutzer Anforderungen stellt, und leiten sie in Zukunft auf diesen Computer weiter. Da der Benutzer immer auf denselben Computer verwiesen wird, ist keine Sitzungsfreigabe zwischen mehreren Computern erforderlich. Dies kann in einigen Situationen gut sein:

  • Möglicherweise muss die Sitzungsbehandlung einer vorhandenen Anwendung nicht geändert werden, um mehrere Computer zu berücksichtigen
  • Zum Speichern von Sitzungen ist kein gemeinsam genutztes Datenbanksystem (oder ähnliches) erforderlich, wodurch möglicherweise die Zuverlässigkeit erhöht wird, was jedoch die Komplexität beeinträchtigt
  • Ein ausgefallener Backend-Computer beendet alle darauf gestarteten Benutzersitzungen.
  • Die Außerbetriebnahme von Maschinen ist schwieriger. Benutzer mit Sitzungen auf einem Computer, die zu Wartungszwecken heruntergefahren werden sollen, sollten ihre Aufgaben ausführen können, bevor der Computer ausgeschaltet wird. Um dies zu unterstützen, können Weblastenausgleicher eine Funktion zum "Ableiten" von Anforderungen an einen bestimmten Back-End-Computer enthalten.

Freigegebene Backend-Datenbank oder Schlüssel- / Wertspeicher : Sitzungsinformationen werden in einer Backend-Datenbank gespeichert, auf die alle Webserver Zugriff haben, um Abfragen und Aktualisierungen durchzuführen. Der Browser des Benutzers speichert ein Cookie mit einer Kennung (z. B. der Sitzungs-ID), die auf die Sitzungsinformationen verweist. Dies ist wahrscheinlich die sauberste der drei Methoden:

  • Der Benutzer muss niemals den gespeicherten Sitzungsinformationen ausgesetzt sein.
  • Der Benutzer muss nicht jedes Mal auf den gleichen Computer zugreifen, sodass der DNS-Lastenausgleich verwendet werden kann
  • Ein Nachteil ist der Engpass, der bei jedem verwendeten Backend-Speichersystem auftreten kann.
  • Sitzungsinformationen können ablaufen und konsistent gesichert werden.

Insgesamt führen die meisten dynamischen Webanwendungen eine Reihe von Datenbankabfragen oder Schlüssel- / Wertspeicheranforderungen aus, sodass die Datenbank oder der Schlüssel- / Wertspeicher der logische Speicherort für Sitzungsdaten ist.

Tommeh
quelle
2
+1 Ziemlich umfassende Antwort und erspart mir das Schreiben. :) Eine relationale Datenbank ist für db storage wahrscheinlich die falsche. So etwas wie eine der persistenten Memcached-Gabeln ist besser. memcachedb könnte geeignet sein. Sie haben auch das Replizieren von Sitzungsinformationen zwischen Servern verpasst. Es ist nicht die beste Methode, aber Dinge wie Kater machen es, die es wert sind, dokumentiert zu werden.
David Pashley
Welcher Ansatz wird von Google, Twitter oder Facebook genutzt?
Dannyboy
1
Wir sind uns nicht sicher, ob es sich um Google, Twitter oder Facebook handelt, aber Redis passt hervorragend zu einem Sitzungsspeicher. Es ist im Grunde das "persistent memcached", das David Pashley im Jahr 2009 empfahl, als Redis embryonal war.
Ben R.,
4

Wenn Sie sich die Frage stellen, wie Sitzungen über mehrere Front-End-Webserver hinweg verwaltet werden sollen, müssen Sie in der Regel eine zentralisierte Datenbank verwenden. Anstatt sich auf die Webserver-Instanzen zu verlassen, um Sitzungsdateien auf den lokalen Dateisystemen zu verfolgen, würden Sie die Sitzungs-IDs und -Daten in eine zentrale Datenbank schreiben, und alle Webserver würden stattdessen die Daten von dort abrufen.

Zombat
quelle
+1 für die Erwähnung der zentralen Datenbank. Nur um diese Idee ein wenig zu erweitern / zu vereinfachen. Wenn Sie auf dem PC eines Benutzers ein Cookie mit einer eindeutigen ID (z. B. einer globalen Benutzer-ID) festlegen, können Sie diese GUID in einer Datenbank speichern. Es spielt keine Rolle, zu welchem ​​Server ein Client eine Verbindung herstellt, solange er über die GUID / das Cookie verfügt, können Sie diese in der Datenbank nachschlagen und die Sitzung entsprechend verfolgen.
KPWINC
2
Das Speichern von Sitzungen in einer relationalen Datenbank ist immer eine schlechte Idee. Sie sollten keine Datenbanken zum Speichern vorübergehender Daten verwenden.
David Pashley
2

Die Verwendung von nemcached scheint eine gute Lösung zu sein, die von @David Pashley nicht erwähnt wird

Dies bedeutet, dass eine remote zwischengespeicherte Instanz von allen Servern gemeinsam genutzt wird und die Memcache-PECL-Erweiterung verwendet wird, die einen eigenen Sitzungshandler bereitstellt.

Es müssen nur zwei Parameter in der PHP-Konfiguration geändert werden!

Hier ist ein gutes Tutorial: http://www.dotdeb.org/2008/08/25/storing-your-php-sessions-using-memcached/

Tristan
quelle
Aber was gibt es mehrere Rechenzentren?
Dannyboy
0

IIRC, in DotNetRocks # 440 hieß es eine Serverperiode. Ich weiß nicht, ob das noch der Fall ist.

Edit: Eigentlich war es Hanselminutes # 134 . Es tut uns leid.

pro Sekunde
quelle
0

Sie können ein Cookie setzen.

Sie können einen Hash der Remote-IP berechnen (die einfachsten Hosts mit ungerader Nummer gehen zu Server A, die Hosts mit gerader Nummer gehen zu Server B).

Sieht so aus, als könnten Sie dies auch über einige Werte tun, die im Quellsystem verbleiben, wenn Sie einen SSL-Tunnel verwenden.

Typischerweise erfordert jeder der oben genannten Mechanismen einen "Reverse-Proxy" -Server oder eine Art Load-Balancer. Dieser Load Balancer akzeptiert den Datenverkehr und leitet ihn dann basierend auf einem der oben genannten Kriterien an den Server weiter, auf dem die Sitzung ursprünglich stattgefunden hat.

Ich bin mir jedoch nicht sicher, was Sie unter "DNS-Polling" verstehen.

chris
quelle
0

a) Sie können Sitzungsinformationen in einem Benutzer-Cookie speichern. Siehe zustandslos gehärtete Cookies, die keine Daten auf der Serverseite speichern, aber den Sitzungsstatus http://www.cl.cam.ac.uk/~sjm217/papers/protocols08cookies.pdf beibehalten . b) Sie können den Sitzungs-Backend-Speicher auf Datenbank oder zwischengespeichert ändern. Um einen einzelnen Fehlerpunkt zu beseitigen, können Sie die Datenbankreplikation oder mehrere zwischengespeicherte Knoten festlegen. Beachten Sie, dass memcached in solchen Setups empfohlen wird, in denen der Verlust des Benutzerstatus in einer Sitzung kein großer Fehler ist und ihn nicht sehr unglücklich macht. Verwenden Sie für Fälle, in denen die Aufrechterhaltung des Status von entscheidender Bedeutung ist, Datenbanken. Sowohl mit PHP als auch mit Django und Rails kann der Entwickler ein benutzerdefiniertes Sitzungs-Backend erstellen.

Kristaps
quelle