


Einrichtung und Optimierung des Caching-Mechanismus für das Website-System
Nachdem wir über die externe Netzwerkumgebung des Websystems gesprochen haben, konzentrieren wir uns nun auf die Leistungsprobleme unseres Websystems selbst.
Da die Anzahl der Besuche auf unserer Website zunimmt, werden wir auf viele Herausforderungen stoßen. Die Lösung dieser Probleme ist nicht nur so einfach wie die Erweiterung der Maschine, sondern die Einrichtung und Verwendung eines geeigneten Caching-Mechanismus ist von grundlegender Bedeutung.
Am Anfang sieht die Architektur unseres Websystems möglicherweise so aus. Jeder Link verfügt möglicherweise nur über eine Maschine.
1. Verwendung des internen Caches der MySQL-Datenbank
Der Caching-Mechanismus von MySQL beginnt in MySQL. Der folgende Inhalt wird sein basierend auf der gängigsten InnoDB-Speicher-Engine.
1. Erstellen Sie geeignete Indizes
Am einfachsten ist es, einen Index zu erstellen. Wenn die Tabellendaten relativ groß sind, kann der Index schnell Daten abrufen, die Kosten sind jedoch höher sind auch welche. Erstens nimmt der kombinierte Index eine gewisse Menge an Speicherplatz ein. Er muss mit Vorsicht verwendet werden. Der von ihm generierte Index kann sogar größer sein als die Quelldaten. Zweitens nehmen Vorgänge wie das Einfügen/Aktualisieren/Löschen von Daten nach der Indexerstellung mehr Zeit in Anspruch, da der ursprüngliche Index aktualisiert werden muss. Tatsächlich wird unser System als Ganzes natürlich von ausgewählten Abfragevorgängen dominiert. Daher kann die Verwendung von Indizes die Systemleistung erheblich verbessern.
2. Datenbankverbindungs-Thread-Pool-Cache
Wenn bei jeder Datenbankoperationsanforderung eine Verbindung erstellt und zerstört werden muss, ist dies zweifellos ein enormer Mehraufwand für die Datenbank. Um diesen Overhead zu reduzieren, kann thread_cache_size in MySQL konfiguriert werden, um anzugeben, wie viele Threads für die Wiederverwendung reserviert sind. Wenn nicht genügend Threads vorhanden sind, werden sie erneut erstellt. Wenn zu viele Threads im Leerlauf vorhanden sind, werden sie zerstört.
Tatsächlich gibt es einen radikaleren Ansatz, bei dem pconnect (Datenbank-Langverbindung) verwendet wird. Sobald der Thread erstellt ist, wird er für lange Zeit beibehalten. Wenn jedoch die Zugriffsmenge relativ groß ist und viele Maschinen vorhanden sind, führt diese Verwendung wahrscheinlich dazu, dass „die Anzahl der Datenbankverbindungen erschöpft ist“, da die Verbindungen hergestellt und nicht recycelt werden und schließlich die max_connections (maximale Anzahl) erreicht werden Verbindungen) der Datenbank. Daher erfordert die Verwendung langer Verbindungen normalerweise die Implementierung eines „Verbindungspool“-Dienstes zwischen CGI und MySQL, um die Anzahl der von der CGI-Maschine „blind“ erstellten Verbindungen zu steuern.
3. Innodb-Cache-Einstellungen (innodb_buffer_pool_size)
innodb_buffer_pool_size Dies ist ein Speicher-Cache-Bereich, der zum Speichern von Indizes und Daten verwendet wird. Wenn die Maschine exklusiv für MySQL ist, wird im Allgemeinen empfohlen, 80 davon zu verwenden der physische Speicher der Maschine. Im Szenario des Abrufens von Tabellendaten kann die Festplatten-E/A reduziert werden. Generell gilt: Je größer dieser Wert eingestellt ist, desto höher ist die Cache-Trefferquote.
4. Unterbibliothek/Tisch/Partition.
MySQL-Datenbanktabellen halten im Allgemeinen einem Datenvolumen in Millionenhöhe stand. Wenn es weiter zunimmt, wird die Leistung erheblich sinken. Daher wird empfohlen, Operationen wie Sub durchzuführen -Datenbank/Tabelle/Partition. Der beste Ansatz besteht darin, den Dienst von Anfang an in einem Subdatenbank- und Subtabellenspeichermodell zu gestalten, um Risiken in der mittleren und späteren Phase grundsätzlich zu eliminieren. Allerdings werden einige Annehmlichkeiten, wie beispielsweise listenbasierte Abfragen, geopfert, und gleichzeitig wird der Wartungsaufwand erhöht. Wenn das Datenvolumen jedoch mehrere zehn Millionen oder mehr erreicht, werden wir feststellen, dass sich alle lohnen.
2. Einrichten mehrerer MySQL-Datenbankdienste
Eine MySQL-Maschine ist tatsächlich ein einzelner Punkt mit hohem Risiko, denn wenn sie aufhängt, ist unser Webdienst Nr länger verfügbar. Als außerdem die Zahl der Zugriffe auf das Websystem weiter zunahm, stellten wir schließlich eines Tages fest, dass ein MySQL-Server es nicht unterstützen konnte, und wir begannen, mehr MySQL-Maschinen zu verwenden. Wenn mehrere MySQL-Maschinen eingeführt werden, werden viele neue Probleme auftreten.
1. MySQL-Master-Slave einrichten, mit der Slave-Datenbank als Backup
Dieser Ansatz dient lediglich dazu, das Problem des „Single Point of Failure“ zu lösen in die Slave-Datenbank übertragen. Allerdings stellt dieser Ansatz tatsächlich eine gewisse Ressourcenverschwendung dar, da die Slave-Bibliothek tatsächlich im Leerlauf ist.
2. MySQL trennt Lesen und Schreiben, Schreiben in die Hauptdatenbank und Lesen aus der Slave-Datenbank.
Die beiden Datenbanken trennen Lesen und Schreiben. Die Hauptbibliothek ist für das Schreiben von Klassen verantwortlich, und die Slave-Bibliothek ist für Lesevorgänge verantwortlich. Darüber hinaus wird der Lesevorgang nicht beeinträchtigt, wenn die Hauptdatenbank ausfällt. Gleichzeitig können alle Lese- und Schreibvorgänge vorübergehend auf die Slave-Datenbank umgestellt werden (Sie müssen auf den Datenverkehr achten, da der Datenverkehr möglicherweise zu groß ist). und die Slave-Datenbank wird heruntergefahren).
3 Der Meister und der Meister sorgen füreinander.
Die beiden MySQL-Server sind gleichzeitig die Slave-Datenbank des anderen und die Master-Datenbank. Diese Lösung leitet nicht nur den Verkehrsdruck um, sondern löst auch das „Single Point of Failure“-Problem. Wenn eine Einheit ausfällt, stehen andere Dienste zur Verfügung.
Diese Lösung kann jedoch nur in einem Szenario mit zwei Maschinen verwendet werden. Wenn das Unternehmen immer noch schnell wächst, können Sie das Unternehmen trennen und mehrere Master-Master- und gegenseitige Backup-Dienste einrichten.
3. Richten Sie einen Cache zwischen dem Webserver und der Datenbank ein
Tatsächlich können wir das Problem großer Besuche nicht einfach lösen Konzentrieren Sie sich auf die Datenbankebene. Gemäß der „80/20-Regel“ konzentrieren sich 80 % der Anfragen nur auf 20 % der heißen Daten. Daher sollten wir einen Caching-Mechanismus zwischen dem Webserver und der Datenbank einrichten. Dieser Mechanismus kann die Festplatte als Cache oder Speichercache verwenden. Durch sie werden die meisten wichtigen Datenabfragen vor der Datenbank blockiert.
1. Statische Seite
Wenn ein Benutzer eine bestimmte Seite der Website besucht, ändert sich der Inhalt der Seite möglicherweise längere Zeit nicht. Beispielsweise wird ein Nachrichtenbericht nach seiner Veröffentlichung fast nie mehr geändert. In diesem Fall wird die von CGI generierte statische HTML-Seite lokal auf der Festplatte des Webservers zwischengespeichert. Mit Ausnahme des ersten Mals, das über eine dynamische CGI-Abfragedatenbank abgerufen wird, wird danach die lokale Festplattendatei direkt an den Benutzer zurückgegeben.
Als der Umfang des Websystems noch relativ klein war, schien dieser Ansatz perfekt zu sein. Sobald jedoch der Umfang des Websystems größer wird, beispielsweise wenn ich 100 Webserver habe. Auf diese Weise werden 100 Kopien dieser Festplattendateien erstellt, was eine Verschwendung von Ressourcen darstellt und schwierig zu warten ist. Zu diesem Zeitpunkt denken einige Leute vielleicht, dass sie einen Server zum Speichern zentralisieren können. Haha, schauen Sie sich doch die folgende Caching-Methode an, wie sie funktioniert.
2. Einzelspeicher-Cache
Anhand des Beispiels der Seitenstatik können wir erkennen, dass es schwierig ist, den „Cache“ auf dem Web-Computer selbst zu verwalten, und dass dies mehr Probleme mit sich bringt ( Tatsächlich kann der native Speicher des Webservers über die APC-Erweiterung von PHP über Schlüssel/Wert manipuliert werden. Daher muss der Speicher-Cache-Dienst, den wir erstellen möchten, auch ein unabhängiger Dienst sein.
Die Hauptauswahlmöglichkeiten für den Speichercache sind Redis/Memcache. In Bezug auf die Leistung gibt es keinen großen Unterschied zwischen den beiden. In Bezug auf den Funktionsumfang ist Redis überlegen.
3. Speicher-Cache-Cluster
Wenn wir einen einzelnen Speicher-Cache erstellen, stehen wir vor dem Problem eines Single Point of Failure, also müssen wir ihn in einen Cluster umwandeln. Der einfache Weg besteht darin, einen Slave als Backup-Maschine hinzuzufügen. Was aber, wenn es wirklich viele Anfragen gibt und wir feststellen, dass die Cache-Trefferquote nicht hoch ist und mehr Maschinenspeicher benötigt wird? Daher empfehlen wir die Konfiguration als Cluster. Ähnlich wie beim Redis-Cluster.
Redis im Redis-Cluster-Cluster besteht aus mehreren Sätzen von Mastern und Slaves. Gleichzeitig kann jeder Knoten Anforderungen annehmen, was beim Erweitern des Clusters praktischer ist. Der Client kann eine Anfrage an jeden Knoten senden. Wenn es sich um den Inhalt handelt, für den er „verantwortlich“ ist, wird der Inhalt direkt zurückgegeben. Andernfalls suchen Sie den tatsächlich verantwortlichen Redis-Knoten, informieren Sie dann den Client über die Adresse und der Client fordert erneut an.
Dies alles ist für Kunden, die den Caching-Dienst nutzen, transparent.
Beim Wechsel des Speicher-Cache-Dienstes bestehen bestimmte Risiken. Beim Wechsel von Cluster A zu Cluster B muss sichergestellt werden, dass Cluster B im Voraus „aufgewärmt“ wird (die heißen Daten im Speicher von Cluster B sollten so weit wie möglich mit denen von Cluster A übereinstimmen). Andernfalls wird zum Zeitpunkt des Wechsels eine große Anzahl von Inhaltsanforderungen angefordert. Diese können nicht im Speichercache von Cluster B gefunden werden. Der Datenverkehr wirkt sich direkt auf den Back-End-Datenbankdienst aus, was wahrscheinlich zu Datenbankausfällen führt.
4. Datenbank-„Schreibvorgänge“ reduzieren
Die oben genannten Mechanismen reduzieren alle Datenbank-„Lesevorgänge“, aber auch der Schreibvorgang stellt einen großen Druck dar. Obwohl der Schreibvorgang nicht reduziert werden kann, kann der Druck durch das Zusammenführen von Anforderungen verringert werden. Zu diesem Zeitpunkt müssen wir einen Änderungssynchronisierungsmechanismus zwischen dem Speicher-Cache-Cluster und dem Datenbank-Cluster einrichten.
Setzen Sie die Änderungsanforderung zunächst im Cache in Kraft, damit externe Abfragen normal angezeigt werden können, und stellen Sie diese SQL-Änderungen dann in eine Warteschlange und speichern Sie sie, wenn die Warteschlange voll ist oder von Zeit zu Zeit. Sie werden in einer Anfrage zusammengeführt und an die Datenbank gesendet.
Zusätzlich zur Verbesserung der Schreibleistung durch die oben erwähnte Änderung der Systemarchitektur kann MySQL selbst auch die Schreibstrategie auf die Festplatte anpassen, indem es den Parameter innodb_flush_log_at_trx_commit konfiguriert. Wenn es die Maschinenkosten zulassen, können Sie zur Lösung des Problems auf Hardwareebene das ältere RAID (Redundant Arrays of Independent Disks, Disk-Array) oder das neuere SSD (Solid State Drives, Solid-State-Laufwerk) wählen.
5. NoSQL-Speicher
Unabhängig vom Lesen oder Schreiben der Datenbank wird schließlich das Szenario „wenn die Arbeitskräfte begrenzt sind“ erreicht, wenn der Datenverkehr weiter zunimmt. Die Kosten für das Hinzufügen weiterer Maschinen sind relativ hoch und lösen das Problem möglicherweise nicht wirklich. Zu diesem Zeitpunkt können Sie die Verwendung einer NoSQL-Datenbank für einige Kerndaten in Betracht ziehen. Die meisten NoSQL-Speicher verwenden die Schlüsselwertmethode. Es wird empfohlen, Redis selbst zu verwenden. Redis selbst ist ein Speichercache und kann auch als Speicher verwendet werden, sodass Daten direkt auf der Festplatte gespeichert werden können.
In diesem Fall trennen wir einige häufig gelesene und geschriebene Daten in der Datenbank und legen sie in unserem neu erstellten Redis-Speichercluster ab, wodurch der Druck auf die ursprüngliche MySQL-Datenbank weiter verringert wird Da es sich um einen Cache auf Speicherebene handelt, wird die Leistung beim Lesen und Schreiben erheblich verbessert.
Inländische First-Tier-Internetunternehmen verwenden hinsichtlich der Architektur viele Lösungen, die den oben genannten Lösungen ähneln. Der verwendete Cache-Dienst ist jedoch nicht unbedingt auf Redis ausgerichtet Entwickeln Sie einen eigenen NoSQL-Dienst basierend auf Ihren eigenen Geschäftsmerkmalen.
6. Problem mit der Abfrage leerer Knoten
Wenn wir alle oben genannten Dienste erstellt haben und denken, dass das Websystem bereits sehr stark ist. Wir sagen immer noch das Gleiche, es werden immer noch neue Probleme kommen. Leere Knotenabfragen beziehen sich auf Datenanforderungen, die überhaupt nicht in der Datenbank vorhanden sind. Wenn ich beispielsweise anfordere, die Informationen einer Person abzufragen, die nicht vorhanden sind, durchsucht das System Schritt für Schritt den Cache auf allen Ebenen, findet schließlich die Datenbank selbst und kommt dann zu dem Schluss, dass sie nicht gefunden werden kann, und kehrt zurück es an das vordere Ende. Da Caches auf allen Ebenen dafür ungültig sind, verbraucht diese Anfrage viele Systemressourcen, und wenn eine große Anzahl leerer Knotenabfragen durchgeführt wird, kann dies Auswirkungen auf die Systemdienste haben.
Das obige ist der detaillierte Inhalt vonEinrichtung und Optimierung des Caching-Mechanismus für das Website-System. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

AI Hentai Generator
Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

Heiße Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen

Mit der starken Entwicklung des E-Commerce-Geschäfts sind Empfehlungsalgorithmen zu einem Schlüssel für den Wettbewerb zwischen den großen E-Commerce-Plattformen geworden. Als effiziente und leistungsstarke Sprache bietet Golang große Vorteile bei der Implementierung von E-Commerce-Empfehlungsalgorithmen. Bei der Implementierung effizienter Empfehlungsalgorithmen ist jedoch auch der Caching-Mechanismus ein nicht zu vernachlässigendes Problem. In diesem Artikel wird erläutert, wie der Caching-Mechanismus eines effizienten E-Commerce-Empfehlungsalgorithmus in Golang implementiert wird. 1. Warum ist der Caching-Mechanismus erforderlich? Im E-Commerce-Empfehlungsalgorithmus erfordert die Generierung von Empfehlungsergebnissen eine große Menge an Rechenressourcen für E-Commerce mit hoher Parallelität

Analyse des MyBatis-Caching-Mechanismus: Der Unterschied und die Anwendung von First-Level-Cache und Second-Level-Cache Im MyBatis-Framework ist Caching eine sehr wichtige Funktion, die die Leistung von Datenbankoperationen effektiv verbessern kann. Unter diesen sind der First-Level-Cache und der Second-Level-Cache zwei häufig verwendete Caching-Mechanismen in MyBatis. In diesem Artikel werden die Unterschiede und Anwendungen von First-Level-Cache und Second-Level-Cache im Detail analysiert und spezifische Codebeispiele zur Veranschaulichung bereitgestellt. 1. Level-1-Cache Der Level-1-Cache wird auch als lokaler Cache bezeichnet. Er ist standardmäßig aktiviert und kann nicht deaktiviert werden. Der Cache der ersten Ebene ist SqlSes

In Webanwendungen ist Caching oft ein wichtiges Mittel zur Leistungsoptimierung. Als bekanntes Web-Framework bietet Django natürlich einen vollständigen Caching-Mechanismus, um Entwicklern dabei zu helfen, die Anwendungsleistung weiter zu verbessern. In diesem Artikel wird der Caching-Mechanismus im Django-Framework ausführlich erläutert, einschließlich Cache-Nutzungsszenarien, empfohlenen Caching-Strategien, Cache-Implementierung und -Nutzung usw. Ich hoffe, dass es für Django-Entwickler oder Leser hilfreich sein wird, die sich für den Caching-Mechanismus interessieren. 1. Cache-NutzungsszenarienCache-Nutzungsszenarien

Zu den Java-Cache-Mechanismen gehören Speichercache, Datenstruktur-Cache, Cache-Framework, verteilter Cache, Cache-Strategie, Cache-Synchronisation, Cache-Invalidierungsmechanismus, Komprimierung und Codierung usw. Detaillierte Einführung: 1. Speichercache, der Speicherverwaltungsmechanismus von Java speichert häufig verwendete Objekte automatisch zwischen, um die Kosten für die Speicherzuweisung und Speicherbereinigung zu reduzieren. 2. Datenstrukturcache, die in Java integrierten Datenstrukturen wie HashMap, LinkedList, HashSet. usw. Mit effizienten Caching-Mechanismen nutzen diese Datenstrukturen interne Hash-Tabellen zum Speichern von Elementen und mehr.

Zu den Caching-Mechanismen von Alibaba Cloud gehören Alibaba Cloud Redis, Alibaba Cloud Memcache, der verteilte Cache-Dienst DSC, Alibaba Cloud Table Store, CDN usw. Ausführliche Einführung: 1. Alibaba Cloud Redis: Eine von Alibaba Cloud bereitgestellte verteilte Speicherdatenbank, die schnelles Lesen und Schreiben sowie Datenpersistenz unterstützt. Durch die Speicherung von Daten im Speicher können Datenzugriff mit geringer Latenz und hohe Parallelitätsverarbeitungsfunktionen bereitgestellt werden. 2. Alibaba Cloud Memcache: das von Alibaba Cloud usw. bereitgestellte Cache-System.

Ausführliche Erklärung des MyBatis-Caching-Mechanismus: Lesen Sie das Prinzip der Cache-Speicherung in einem Artikel. Einführung Bei der Verwendung von MyBatis für den Datenbankzugriff ist Caching ein sehr wichtiger Mechanismus, der den Zugriff auf die Datenbank effektiv reduzieren und die Systemleistung verbessern kann. In diesem Artikel wird der Caching-Mechanismus von MyBatis ausführlich vorgestellt, einschließlich Cache-Klassifizierung, Speicherprinzipien und spezifischen Codebeispielen. 1. Cache-Klassifizierung Der MyBatis-Cache ist hauptsächlich in zwei Typen unterteilt: Cache der ersten Ebene und Cache der zweiten Ebene. Der Cache der ersten Ebene ist ein Cache der SqlSession-Ebene

Als effiziente Programmiersprache wurde Golang in den letzten Jahren von immer mehr Entwicklern begrüßt und wird in verschiedenen Szenarien häufig eingesetzt. Im Werbeplattform-Szenario ist es für eine genaue Werbeauslieferung erforderlich, die Auswahl, Sortierung, Filterung und andere Prozesse von Anzeigen schnell zu berechnen, um eine effiziente Werbeauslieferung zu erreichen. Um diesen Prozess zu optimieren, ist der Caching-Mechanismus zu einem unverzichtbaren Bestandteil geworden. Im Allgemeinen läuft der Prozess einer Werbeplattform wie folgt ab: Wenn ein Benutzer im Internet surft, sammelt die Werbeplattform die Informationen des Benutzers auf verschiedene Weise und

Zu den Browser-Caching-Mechanismen gehören Strong Cache, Negotiation Cache, Service Worker und IndexedDB usw. Detaillierte Einführung: 1. Wenn der Browser eine Ressource anfordert, prüft er zunächst, ob sich eine Kopie der Ressource im lokalen Cache befindet und ob die Kopie der Ressource nicht abgelaufen ist verwendet direkt den lokalen Cache und sendet keine Anfrage an den Server, wodurch das Laden von Webseiten beschleunigt wird. 2. Cache aushandeln Wenn die Kopie der Ressource abläuft oder der Cache des Browsers geleert wird, sendet der Browser eine Anfrage zum Server usw.
