Wir wechseln von einem 1-Webserver-Setup zu einem 2-Webserver-Setup, und ich muss anfangen, PHP-Sitzungen zwischen den beiden Rechnern mit Lastenausgleich zu teilen. Wir haben memcached bereits installiert ( und gestartet ) und daher war ich angenehm überrascht, dass ich Sitzungen zwischen den neuen Servern gemeinsam nutzen konnte, indem ich nur drei Zeilen in der php.ini
Datei änderte ( session.save_handler und session.save_path ):
Ich ersetzte:
session.save_handler = files
mit:
session.save_handler = memcache
Dann habe ich auf dem Master-Webserver den To- session.save_path
Point auf localhost gesetzt:
session.save_path="tcp://localhost:11211"
und auf dem Slave-Webserver habe ich den To- session.save_path
Point auf den Master gesetzt:
session.save_path="tcp://192.168.0.1:11211"
Arbeit erledigt, ich habe es getestet und es funktioniert. Aber...
Offensichtlich bedeutet die Verwendung von Memcache, dass sich die Sitzungen im RAM befinden und verloren gehen, wenn ein Computer neu gestartet wird oder der Memcache - Dämon abstürzt wir skalieren auf), weil immer, wenn jemand auf den Slave-Webserver geladen wird, seine Sitzungen über das Netzwerk vom Master-Webserver abgerufen werden. Ich habe mich gefragt, ob ich zwei definieren kann, save_paths
damit die Computer in ihrem eigenen Sitzungsspeicher suchen, bevor sie das Netzwerk verwenden. Beispielsweise:
Meister:
session.save_path="tcp://localhost:11211, tcp://192.168.0.2:11211"
Sklave:
session.save_path="tcp://localhost:11211, tcp://192.168.0.1:11211"
Würde dies erfolgreich Sitzungen auf den Servern freigeben UND die Leistung verbessern? Das heißt, Sie sparen 50% des Netzwerkverkehrs. Oder ist diese Technik nur für Failover geeignet (z. B. wenn ein Memcache-Daemon nicht erreichbar ist)?
Hinweis : Ich frage nicht speziell nach der Memcache-Replikation - mehr darüber, ob der PHP-Memcache-Client innerhalb jedes Memcache-Daemons in einem Pool Spitzenwerte erreichen kann, eine Sitzung zurückgeben kann, wenn er eine findet, und eine neue Sitzung erstellen, wenn er keine findet in allen Geschäften. Während ich das schreibe, denke ich, dass ich ein bisschen viel von PHP verlange, lol ...
Angenommen : keine Sticky-Sessions, Round-Robin-Load-Balancing, LAMP-Server.
Antworten:
Haftungsausschluss: Sie wären verrückt, wenn Sie mir zuhören würden, ohne eine Tonne Tests zu machen UND eine zweite Meinung von einer qualifizierten Person einzuholen - ich bin neu in diesem Spiel .
Die in dieser Frage vorgeschlagene Idee zur Effizienzsteigerung funktioniert nicht. Der Hauptfehler, den ich gemacht habe, war zu denken, dass die Reihenfolge, in der die zwischengespeicherten Speicher im Pool definiert sind, eine Art Priorität vorschreibt. Dies ist nicht der Fall . Wenn Sie einen Pool von Memached Daemons definieren (z. B. using
session.save_path="tcp://192.168.0.1:11211, tcp://192.168.0.2:11211"
), können Sie nicht wissen, welcher Speicher verwendet wird. Daten werden gleichmäßig verteilt, was bedeutet, dass ein Element möglicherweise im ersten oder im letzten gespeichert wird (oder beides, wenn der Memcache-Client für die Replikation konfiguriert ist). Beachten Sie, dass der Memcache-Server für die Replikation zuständig ist nicht selber machen). In beiden Fällen führt die Verwendung von localhost als erstem im Pool nicht zu einer Leistungsverbesserung. Es besteht eine 50% ige Chance, dass einer der beiden Stores erreicht wird.Nachdem ich ein bisschen getestet und recherchiert habe, bin ich zu dem Schluss gekommen, dass Sie Sitzungen mithilfe von Memcache KÖNNEN, was Sie aber wahrscheinlich nicht möchten - es scheint nicht beliebt zu sein, da es nicht so gut skaliert wie eine gemeinsam genutzte Sitzung Datenbank daran ist nicht so robust. Ich würde mich über Feedback freuen, damit ich mehr erfahren kann ...
Tipp 1: Wenn Sie Sitzungen mit memcache auf zwei Servern teilen möchten:
Stellen Sie sicher, dass Sie bei der Installation des PHP-Memcache-Clients mit Ja geantwortet haben, um die Unterstützung für den Memcache-Sitzungs-Handler zu aktivieren. Fügen Sie Folgendes in Ihre
/etc/php.d/memcache.ini
Datei ein:Auf Webserver 1 (IP: 192.168.0.1):
Auf Webserver 2 (IP: 192.168.0.2):
Tipp 2: Wenn Sie Sitzungen mithilfe von Memcache auf zwei Servern teilen möchten UND Failover-Unterstützung haben möchten:
Fügen Sie Ihrer
/etc/php.d/memcache.ini
Datei Folgendes hinzu :Auf Webserver 1 (IP: 192.168.0.1):
Auf Webserver 2 (IP: 192.168.0.2):
Anmerkungen:
session.save_path
auf allen Servern einen identischen verwendet .Tipp 3: Wenn Sie Sitzungen mit Memcache freigeben UND transparentes Failover unterstützen möchten:
Entspricht Tipp 2, mit der Ausnahme, dass Sie Ihrer
/etc/php.d/memcache.ini
Datei Folgendes hinzufügen müssen :Anmerkungen:
get's
Schreibvorgänge auf den Spiegeln wiederholt werden. Dies bedeutet, dass Benutzer ihre Sitzung nicht verlieren, wenn ein Memcache-Dämon ausfällt.memcache.session_redundancy
dient der Sitzungsredundanz, es gibt jedoch auch einememcache.redundancy
ini-Option, die von Ihrem PHP-Anwendungscode verwendet werden kann, wenn Sie eine andere Redundanzstufe wünschen.quelle
ext/memcache
Version 3.x verwenden . Wir spielen auch mit dieser Option und ich habe beschlossen, die Serverliste zu durchlaufen und selbst zu schreiben.Betreff: Tipp 3 oben (für alle anderen, die zufällig über Google darauf stoßen): Damit dies funktioniert, müssen Sie derzeit mindestens
memcache.session_redundancy = N+1
N Server in Ihrem Pool verwenden , zumindest scheint dies der Mindestschwellenwert zu sein Wert, der funktioniert. (Getestet mit PHP 5.3.3 auf Debian Stable, pecl memcache 3.0.6, zwei Memcached - Server.session_redundancy=2
Würde so schnell nicht , wie ich den ersten Server in dem ausgeschaltetsave_path
,session_redundancy=3
funktioniert einwandfrei .)Dies scheint in diesen Fehlerberichten festgehalten zu sein:
quelle
Stellen Sie zusammen mit den oben gezeigten php.ini-Einstellungen sicher, dass auch Folgendes festgelegt ist:
Dann erhalten Sie ein vollständiges Failover und clientseitige Redundanz. Die Einschränkung bei diesem Ansatz besteht darin, dass bei einem Ausfall von memcached auf localhost immer ein Lesefehler auftritt, bevor der PHP-Memcache-Client den nächsten Server in dem in session.save_path angegebenen Pool versucht
Denken Sie daran, dass dies Auswirkungen auf die globalen Einstellungen für den PHP-Memcache-Client hat, der auf Ihrem Webserver ausgeführt wird.
quelle
consistent
Hashing-Strategie sinnvoll, wenn man bedenkt, dass diesession.save_path
auf jedem Webserver anders ist?memcached funktioniert nicht so (bitte korrigiere mich wenn ich falsch liege!)
Wenn Ihre Anwendung redundanten Sitzungsspeicher haben soll, müssen Sie etwas erstellen, das Einträge in beiden zwischengespeicherten Instanzen ändert, hinzufügt oder löscht. memcached behandelt dies nicht, das einzige, was es bietet, ist der Schlüssel-Hash-Speicher. Also keine Replikation, Synchronisation, nichts, nada.
Ich hoffe, ich liege in dieser Sache nicht falsch, aber das ist, was ich von memcached kenne, ein paar Jahre, seit ich es berührt habe.
quelle
memcached wird nicht sofort repliziert, aber repcached (ein gepatchtes memcached). Wenn Sie jedoch bereits mysql verwenden, können Sie die Replikationsfunktionalität einfach mit der Master-Master-Replikation nutzen und die Vorteile der vollständigen Datenreplikation nutzen.
C.
quelle