Mit der allmählichen Entwicklung des Website-Geschäftsumfangs und der Besuche kann die ursprüngliche Mini-Website-Struktur mit einem einzelnen Server und einem einzelnen Domänennamen den Entwicklungsanforderungen nicht mehr gerecht werden.
Zu diesem Zeitpunkt können wir weitere Server erwerben und mehrere Subdomains der zweiten Ebene kanalisiert aktivieren, um die Website entsprechend den Geschäftsfunktionen auf unabhängigen Servern zu verteilen und bereitzustellen oder Lastausgleichstechnologien (z. B. DNS-Round-Robin) zu verwenden , Radware, F5, LVS usw.) ermöglicht mehreren Kanälen die gemeinsame Nutzung einer Servergruppe.
Okay, wir haben eine solche Lösung bereits im Kopf erdacht, aber nach der eingehenden Entwicklung tauchen neue technische Probleme auf:
Wir verteilen und stellen das Website-Programm auf mehreren Servern bereit und teilen diese unabhängig voneinander in mehrere Domänennamen der zweiten Ebene auf, da die Sitzung durch das Implementierungsprinzip begrenzt ist (die Sitzung wird in PHP in Form einer Datei gespeichert). (standardmäßig auf der Festplatte des lokalen Servers) müssen wir Website-Benutzer häufig Benutzernamen und Passwörter zwischen mehreren Kanälen eingeben, um uns anzumelden, was die Benutzererfahrung erheblich beeinträchtigt. Darüber hinaus kann das ursprüngliche Programm Daten direkt von der Festplatte lesen Sitzungsvariablen des Benutzers (z. B. Spitzname, Punkte, Anmeldezeit usw.), da Sitzungsvariablen nicht serverübergreifend synchron aktualisiert werden können, was Entwickler dazu zwingt, in Echtzeit in die Datenbank zu lesen und zu schreiben, wodurch die Belastung der Datenbank erhöht wird.
Infolgedessen wurde die Notwendigkeit, das Problem der Sitzungsfreigabe zwischen Websites über mehrere Server hinweg zu lösen, dringlich, und schließlich wurden verschiedene Lösungen entwickelt. Nachfolgend finden Sie vier weitere praktikable Lösungen zum Vergleich und zur Diskussion:
1. Sitzungsfreigabe basierend auf NFS
NFS ist die Abkürzung für Net FileSystem, das zuerst von Sun entwickelt wurde, um das Problem der Verzeichnisfreigabe zwischen Unix-Netzwerkhosts zu lösen.
Diese Lösung ist am einfachsten zu implementieren. Sie erfordert nicht viel sekundäre Entwicklung. Sie müssen nur den gemeinsam genutzten Verzeichnisserver im lokalen Sitzungsverzeichnis jedes Kanalservers bereitstellen Dateisysteme, also Die Parallelitätseffizienz ist nicht hoch, insbesondere bei kleinen Dateien mit hoher gleichzeitiger Lese- und Schreibgeschwindigkeit, wie z. B. Sitzungen. Die IO-Wartezeit des gemeinsam genutzten Verzeichnisservers ist zu hoch, was letztendlich die Ausführungseffizienz der Front beeinträchtigt -end WEB-Anwendung.
2. Datenbankbasierte Sitzungsfreigabe
Die erste Wahl ist natürlich die berühmte MySQL-Datenbank. Es wird empfohlen, die Speichertabelle Heap zu verwenden, um die Lese- und Schreibeffizienz von Sitzungsvorgängen zu verbessern. Diese Lösung ist recht praktisch und wird meiner Meinung nach allgemein verwendet. Ihr Nachteil besteht darin, dass die gleichzeitigen Lese- und Schreibfunktionen der Sitzung von der Leistung der MySQL-Datenbank abhängen. Gleichzeitig müssen Sie die Sitzungseliminierungslogik implementieren Um Sitzungsdatensätze regelmäßig zu aktualisieren und aus der Datentabelle zu löschen, können Tabellensperren auftreten, wenn die Parallelität zu hoch ist. Obwohl wir eine Tabellen-Engine mit Sperren auf Zeilenebene wählen können, müssen wir dies mit einer Datenbank verhindern Store Sessions ist immer noch etwas übertrieben.
3. Cookie-basierte Sitzungsfreigabe
Diese Lösung ist uns vielleicht unbekannt, sie wird jedoch immer noch häufig auf großen Websites verwendet. Das Prinzip besteht darin, die Sitzungsinformationen aller Benutzer der Site zu verschlüsseln und zu serialisieren und sie dann als Cookie zu verwenden, um sie einheitlich unter dem Stammdomänennamen zu platzieren (z. B.: .host.com, wenn Sie den Browser verwenden, um auf alle Sekunden zuzugreifen). -Level-Domänennamen-Sites unter dem Stammdomänennamen. Die Eigenschaften aller Cookie-Inhalte, die dem Domänennamen entsprechen, werden übergeben, wodurch ein gemeinsamer Zugriff auf die Cookie-basierte Sitzung des Benutzers zwischen mehreren Diensten realisiert wird.
Der Vorteil dieser Lösung besteht darin, dass keine zusätzlichen Serverressourcen erforderlich sind. Der Nachteil besteht darin, dass aufgrund der begrenzten Konfidenzlänge des HTTP-Protokoll-Headers nur ein kleiner Teil der Benutzerinformationen und des Cookie-Sitzungsinhalts gespeichert werden kann muss sicher verschlüsselt und entschlüsselt werden (z. B. mithilfe von DES, RSA usw. zur Klartextverschlüsselung und -entschlüsselung; und dann werden MD5, SHA-1 und andere Algorithmen zur Fälschungsschutzauthentifizierung verwendet). bestimmte Bandbreitenressource, da der Browser das lokale Cookie an http anhängt, wenn er eine Ressource unter dem aktuellen Domänennamen anfordert, der an den Server übergeben wird.
4. Sitzungsfreigabe basierend auf Memcache
Da Memcache ein Speicherfreigabesystem ist, das auf der mehrkanaligen asynchronen E/A-Technologie von Libevent basiert, macht der einfache Schlüsselwert-Datenspeichermodus die Codelogik kompakt und effizient, sodass es einen absoluten Vorteil bei der gleichzeitigen Verarbeitungsfähigkeit bietet Ich habe bisher erlebt, dass das Projekt eine durchschnittliche Abfrage von 2000/Sekunde erreicht und der CPU-Verbrauch des Servers immer noch weniger als 10 % beträgt.
Es ist auch erwähnenswert, dass der für die Speicher-Hash-Tabelle von Memcache einzigartige Ablauf- und Eliminierungsmechanismus mit dem Ablaufmechanismus der Sitzung zusammenfällt, was die Codekomplexität beim Löschen abgelaufener Sitzungsdaten im Vergleich zum „datenbankbasierten Speicherschema“ verringert. Allein diese Logik erzeugt einen enormen Abfragedruck auf die Datentabelle.
Unter diesen Lösungen wird Memcache-basierter Speicher empfohlen!
Andere Lösungen haben immer noch ihren Nutzen. Die konkrete Auswahl muss vom Entwickler anhand der aktuellen Serverressourcen, des Parallelitätsdrucks auf der Website usw. umfassend bewertet werden.