2010-10-07 11 views
12

Ich habe derzeit ein großes Problem. Vor zwei Tagen war meine Seite, die auf einem Server lief, zu viel, also kaufte ich zwei weitere und ließ sie gruppieren (rsync und laden ausgeglichen).Verwenden von Memcache als Sitzungsspeicher?

Ich bemerkte dann beginnen, dass ein Benutzer server1 treffen würde und dann auf die nächste Anforderung server3 schlagen aber, dass ihre Sitzung noch auf server1 statt server3 war, und sie waren nicht mehr angemeldet.

Ich wurde empfohlen Memcache für Sitzungsspeicher verwenden.

Mein Skript verwendet bereits $_SESSION.

  • Können wir memcache installiert werden und Session-Handler-Unterstützung aktivieren und session.save_handler = "memcache" php zu zwingen memcache zu benutzen?

  • Gibt es eine Anwendungsprogrammierung, die für die Verwendung von Memcache erforderlich ist?

  • Wird dies meine Sitzung zwischen Serverproblem lösen?

  • Sind die Sitzungsspeicher auf allen Servern gespeichert, wenn sie erstellt werden, oder handelt es sich um einen Master Memcache Server?

Ich bin mit dem codeiginiter Rahmen

Antwort

2

Sie müssten auf einem der Server einzurichten memcache zu laufen und haben alle Server die gleiche memcache Instanz für die Sitzungen verwenden. Andernfalls, wenn sie jeweils ihre eigene Memcache-Instanz ausführen, haben Sie das gleiche Problem wie zuvor.

Abgesehen von der entsprechenden Konfiguration von Memcache und der Anweisung, PHP als Session-Handler zu verwenden, sollten Sie keine Änderungen an Ihrem Code vornehmen müssen.

~

Zur Klärung der Rat, den ich hier gab, wenn Sie Gruppe alle drei Server in einem einzigen Pool, werden Sie keine Probleme haben, solange jede PHP-Instanz diese Server in der gleichen Reihenfolge verweist. memcache verwendet client side hashing, so dass Sie sicherstellen können, dass derselbe Schlüssel auf demselben Server gelesen/geschrieben wird. Wenn Sie diese Liste auf irgendeine Weise ändern, werden die Sitzungen natürlich ungültig.

Die Memcache-Entwickler empfehlen eigentlich nicht, dass Sie Memcache zum Speichern von Sitzungsdaten verwenden, da es nicht persistent ist. Wenn Sie also Memcache neu starten müssen (oder etwas passiert), werden alle Ihre Benutzer protokolliert aus.

+0

Glauben Sie, dass die Zuweisung von 4 GB Speicher von unserem Server gut genug ist?Wir haben 24 GB pro Server –

+1

Das scheint wie eine riesige Zahl, aber es hängt davon ab, wie viele gleichzeitige Sitzungen Sie haben und wie viele Daten Sie in ihnen speichern. Wenn Sie nur eine Verzeichnisliste von/tmp (oder wo auch immer die Dateien derzeit gespeichert sind) erstellen, sollten Sie eine gute Vorstellung davon haben, wie groß Ihre Sitzungsdaten sind. Ich habe gerade eine Website überprüft, die ich ausführe, und sie verwendet ~ 1 MB pro 200 Benutzer, wobei die mittlere Sitzungsgröße nur 85 Bytes beträgt. Aber offensichtlich sind diese Zahlen nur auf diese bestimmte Seite anwendbar. – Matthew

+1

Eek! So alt diese Antwort ist, ist völlig falsch und mißversteht völlig, wie Memcache funktioniert. – Synchro

5

Die beiden wichtigsten Memcache PHP PECL-Erweiterungen haben Session-Handler. In beiden Fällen müssen Sie vor der Verwendung ein PECL-Modul installieren.

Das ist Memcache PECL-Erweiterung Session-Handler mit der folgenden in der php.ini aktiviert:

session.save_handler = "memcache" 
session.save_path = "tcp://memcacheServerAddressHere:11211?persistent=1&weight=2&timeout=2&retry_interval=10" 

Das ist Memcached PECL-Erweiterung Session-Handler mit der folgenden in der php.ini aktiviert:

session.save_handler = "memcached" 
session.save_path = "memcacheServerAddressHere:11211" 

Beachten Sie, dass die Memcache-Erweiterung angezeigt wird, um mehr Konfiguration der Memcache-Umgebung zu ermöglichen.

1

Sie möchten dabei vorsichtig sein. Eine Sache, über die man vorsichtig sein sollte, ist, keine Sitzungsinformationen mit anderen Nicht-Sitzungsdaten zu hosten. Es ist nicht die größte Aufgabe, Ihren Cache zu löschen, wenn er nur die Daten Ihrer eigenen Website enthält, aber Sie möchten nicht gleichzeitig die Sitzungen der Benutzer löschen.

Solange Sie den gleichen Schlüssel mit Memcache verwenden, sollten Sie jedes Mal den gleichen Server treffen. Also sollte dieses Problem weggehen.

+0

Genau der Server hat nur 1 Seite, also denken Sie, dass das ein Problem sein wird? Wir machen Mem-Cache mit einem DB-Server –

+2

Sie sollten in Ordnung sein. Sie müssen nur vorsichtig sein, wenn Sie den Server aktualisieren möchten. Wir haben eine unserer Anwendungssitzungen auf Memcache gestellt und sind sehr vorsichtig damit. – Wix

+0

Danke für den Tipp –

14

Es gibt zwei Teile auf die Frage:

Wie mit Anfragen gehen an verschiedene Server umgehen?

Dies liegt an Ihrem Load Balancer/Reverse-Proxy. Es ist üblich, dass Clients auf einem Server bleiben, normalerweise nach IP-Adresse oder einem transparenten Cookie, der vom Proxy festgelegt wird. Es ist jedoch nicht notwendig, Client-Klebrigkeit für Sitzungen zu haben, wenn Sie einen verteilten Sitzungsspeicher haben, der uns zu Memcache bringt.

Wie Memcache für Sitzungsspeicher auf mehreren Servern verwenden?

memcache hat eine echte shared-nothing-verteilte Architektur, so dass der Großteil der Intelligenz beim Client liegt. Also, was Sie tun sollten, gehen Sie voran und verwenden Sie den Memcache-Session-Speicher, aber anstatt auf einen Server zeigen, zeigen Sie auf ALL von ihnen. Dies ist abgedeckt in the docs. In Ihrer php.ini sollten Sie session.save_path auf die Liste der memcached Server setzen, zum Beispiel server1:11211, server2:11211.

Beachten Sie, dass es in PHP zwei verschiedene Memcache-Clientbibliotheken mit den Namen memcache und memcached gibt, deren Syntax für diese Eigenschaft unterschiedlich ist.

Aufgrund der Funktionsweise von Memcache ist es Ihnen egal, wo Ihre Sitzungsdaten gespeichert sind - es ist für Sie erledigt.

Wie NathanD darauf hinweist, ist Memcache flüchtig und verliert Daten beim Neustart. Wenn Sie mehrere Server haben, würde dies bedeuten, dass einige (aber nicht alle) Ihrer Benutzer ausgeloggt wären, wenn einer neu gestartet würde. Wenn ein Server vollständig stirbt, wird Ihr Sitzungsspeicher weiterhin funktionieren. Benutzer, deren Sitzungsdaten sich auf dem toten Server befanden, werden abgemeldet. Sie können sich jedoch erneut anmelden und ohne diesen Server weitermachen.

0

es ist besser memcachedb als persistenten Speicher für memcache selbst zu verwenden oder auch die mehr smarter redis zu verwenden, die ich hoch in Ihrem Fall empfehlen

0

Sie können Ihre Sitzungen zu einer SQL-DB schreiben. Dadurch erhalten Sie auch persistente Sitzungen auf Servern. Siehe das Tutorial unter: http://culttt.com/2013/02/04/how-to-save-php-sessions-to-a-database/

Wenn Sie auf den Betrieb der Sitzungen in Memcached bestehen (um eine bessere Leistung zu haben, aber niedriger Konsistenz) Sie einfach den Code in ein paar Orte

0

Sie Datei synchronisieren können neu schreiben können Sitzungen auch. Ich mache es auf meinen zwei Servern mit Lastenausgleich. Unter Ubuntu und einer Reihe anderer Linuxes werden Sitzungen in /var/lib/php5 gespeichert.

Ich folgte den Schritten over here on Superuser, den PHP-Sitzungsordner von einem Server auf dem anderen.