Die Fallstricke der Lese- und Schreibtrennung in MySQL Das Hauptziel der Lese- und Schreibtrennung besteht darin, den Druck der Hauptdatenbank zu teilen und dem Client die Back-End-Datenbank für die Abfrage auszuwählen. Eine andere Architektur besteht darin, dass sich zwischen MySQL und dem Client eine Zwischenproxyschicht befindet. Der Client stellt eine Verbindung zum Proxy her und der Proxy bestimmt die Verteilungsroute der Anforderung basierend auf dem Anforderungstyp und dem Kontext.
Unabhängig von der verwendeten Architektur ist es aufgrund möglicher Verzögerungen zwischen Master und Slave möglich, den Status vor der Transaktionsaktualisierung zu lesen, wenn der Client unmittelbar nach der Ausführung einer Aktualisierungstransaktion eine Abfrage initiiert und die Abfrage den Slave auswählt. Dieses Phänomen des „Lesens eines abgelaufenen Zustands des Systems in der Slave-Bibliothek“ nennen wir vorerst „abgelaufenes Lesen“. Lösung 1: Erzwingen der Hauptdatenbanklösung Abfrageanforderungen werden in zwei Kategorien unterteilt:
Lösung 2: Schlaflösung Nachdem die Master-Datenbank aktualisiert wurde, wird ein Sleep-Vorgang ausgeführt, bevor die Slave-Datenbank gelesen wird, ähnlich wie bei der Ausführung des Befehls select sleep (1). Die Annahme dieser Lösung ist, dass die Master-Slave-Verzögerung in den meisten Fällen innerhalb einer Sekunde liegt und ein Sleep-Vorgang höchstwahrscheinlich die neuesten Daten abrufen kann. Am Beispiel eines Verkäufers, der ein Produkt veröffentlicht: Nach der Veröffentlichung des Produkts wird Ajax verwendet, um den vom Kunden eingegebenen Inhalt direkt als „neues Produkt“ auf der Seite anzuzeigen, ohne die Datenbank tatsächlich abzufragen. Somit kann der Verkäufer mit dieser Anzeige die erfolgreiche Freigabe des Produktes bestätigen. Bis der Verkäufer die Seite aktualisiert und das Produkt prüft, ist tatsächlich einige Zeit vergangen, wodurch der Zweck des Ruhezustands erreicht und das Problem des abgelaufenen Lesens gelöst wird. Lösung 3: Stellen Sie fest, ob Master und Backup keine Verzögerung aufweisen: Die erste Methode: Verwenden Sie zuerst den Wert des Parameters seconds_behind_master im Ergebnis „Slave-Status anzeigen“, um die Länge der Master-Slave-Verzögerung zu messen. Bestimmen Sie zunächst, ob der Parameterwert 0 ist. Wenn er nicht 0 ist, müssen Sie warten, bis der Parameter 0 wird, bevor Sie die Anforderung ausführen. Methode 2: Vergleichsportale stellen sicher, dass es bei Primär- und Backup-Vorgängen zu keiner Verzögerung kommt.
Wenn die Werte von Master_Log_File, Relay_Master_Log_File, Read_Master_Log_Pos und Exec_Master_Log_Pos genau gleich sind, bedeutet dies, dass die empfangenen Protokolle synchronisiert wurden. Die dritte Methode: Vergleichen Sie GTID (Global Transaction ID), um sicherzustellen, dass es zwischen Master und Slave keine Verzögerung gibt
Wenn die beiden Sätze identisch sind, bedeutet dies, dass die von der Standby-Datenbank empfangenen Protokolle synchronisiert wurden. Schema 4: Gleiches Master-Bibliotheks-Site-Schema Dieser Befehl wird auf der Slave-Datenbank ausgeführt. Die Parameter file und pos beziehen sich auf den Dateinamen und die Position auf der Master-Datenbank. Timeout bedeutet, dass diese Funktion maximal N Sekunden wartet.
Wie in der Abbildung gezeigt: Führen Sie zuerst trx1 aus und führen Sie dann die Logik einer Abfrageanforderung aus. Um sicherzustellen, dass die richtigen Daten gefunden werden, können wir verwenden Diese Logik 1. Führen Sie nach der Aktualisierung der TRX1-Transaktion sofort „Show Master Status“ aus, um die aktuell von der Masterdatenbank ausgeführte Datei und Position abzurufen. 2. Wählen Sie eine Slave-Datenbank aus, um die Abfrageanweisung auszuführen. 3. Führen Sie „select master_pos_wait(File, Position, 1)“ auf der Slave-Datenbank aus. 4. Wenn der Rückgabewert eine positive Ganzzahl >= 0 ist, führen Sie die Abfrageanweisung in dieser Slave-Datenbank aus. 5. Andernfalls gehen Sie zur Hauptdatenbank, um die Abfrageanweisung auszuführen. Hier gehen wir davon aus, dass diese Select-Abfrage maximal 1 Sekunde auf der Slave-Datenbank wartet. Wenn master_pos_wait dann innerhalb von 1 Sekunde eine Ganzzahl größer oder gleich 0 zurückgibt, ist sichergestellt, dass das auf der Slave-Datenbank ausgeführte Abfrageergebnis die Daten von trx1 enthalten muss. 5 Das Ausführen von Abfrageanweisungen in der Hauptdatenbank ist ein gängiger Verschlechterungsmechanismus für diesen Lösungstyp. Da die Verzögerungszeit der Slave-Datenbank unkontrollierbar ist und nicht unbegrenzt gewartet werden kann, sollten Sie aufgeben und die Master-Datenbank überprüfen, wenn die Wartezeit abgelaufen ist. Gemäß unserer Anforderung, abgelaufene Lesevorgänge nicht zuzulassen, gibt es nur zwei Möglichkeiten: Eine besteht darin, nach Ablauf der Zeit aufzugeben, oder die andere darin, für die Abfrage zur Hauptdatenbank zu wechseln. Gleichzeitige Verbindungen und gleichzeitige Abfragen Der Parameter innodb_thread_concurrency steuert die Obergrenze gleichzeitiger Threads von Innodb. Sobald dieser Wert überschritten wird, werden neue Anfragen zurückgestellt.
Das Obige ist der vollständige Inhalt dieses Artikels. Ich hoffe, er wird für jedermanns Studium hilfreich sein. Ich hoffe auch, dass jeder 123WORDPRESS.COM unterstützen wird. Das könnte Sie auch interessieren:
|
Vorwort Dieses Experiment bereitet zwei virtuelle...
Karussellanzeige der Vue-Karte beim Umschalten de...
Vorwort Komponenten sind etwas, das wir sehr häuf...
Wenn Sie 5 Datensätze in Tabelle1 einfügen möchte...
1. Erstellen Sie eine Datenbankautorisierungserkl...
Die Betriebsumgebung dieses Tutorials: Windows 7-...
1. Installieren Sie die Datenbank 1) yum -y insta...
Wissenspunkte zur Speicher-Storage-Engine Die Spe...
Vorwort Die Verwaltung des Routings ist eine wese...
Vorwort 1. Die in diesem Artikel verwendeten Tool...
Dieser Artikel beschreibt einen Vorschlag für ein...
Inhaltsverzeichnis Überblick erster Schritt Schri...
1. Einführung in TypeScript Im vorherigen Artikel...
Wenn Sie nur ein paar Tabellen oder eine einzelne...
Eine Transaktion ist eine logische Gruppe von Ope...