MariaDB
 sql >> Datenbank >  >> RDS >> MariaDB

MySQL- und MariaDB-Abfrage-Caching mit ProxySQL und ClusterControl

Abfragen müssen in jeder stark belasteten Datenbank zwischengespeichert werden, es gibt einfach keine Möglichkeit für eine Datenbank, den gesamten Datenverkehr mit angemessener Leistung zu bewältigen. Es gibt verschiedene Mechanismen, in denen ein Abfrage-Cache implementiert werden kann. Angefangen vom MySQL-Abfrage-Cache, der früher für überwiegend schreibgeschützte Arbeitslasten mit geringer Parallelität einwandfrei funktionierte und der bei hohen gleichzeitigen Arbeitslasten nichts zu suchen hat (soweit Oracle ihn in MySQL 8.0 entfernt hat), bis hin zu externen Schlüsselwertspeichern wie Redis, memcached oder CouchBase.

Das Hauptproblem bei der Verwendung eines externen dedizierten Datenspeichers (da wir niemandem empfehlen würden, den MySQL-Abfrage-Cache zu verwenden) besteht darin, dass dies ein weiterer zu verwaltender Datenspeicher ist. Es ist eine weitere Umgebung, die es zu warten gilt, Skalierungsprobleme zu handhaben, Fehler zu debuggen und so weiter.

Warum also nicht zwei Fliegen mit einer Klappe schlagen, indem Sie Ihren Proxy nutzen? Hier wird davon ausgegangen, dass Sie in Ihrer Produktionsumgebung einen Proxy verwenden, da er beim Lastenausgleich von Abfragen über Instanzen hinweg hilft und die zugrunde liegende Datenbanktopologie verschleiert, indem er einen einfachen Endpunkt für Anwendungen bereitstellt. ProxySQL ist ein großartiges Tool für diesen Job, da es zusätzlich als Caching-Layer fungieren kann. In diesem Blogbeitrag zeigen wir Ihnen, wie Sie Abfragen in ProxySQL mit ClusterControl zwischenspeichern.

Wie funktioniert der Abfrage-Cache in ProxySQL?

Zunächst einmal ein bisschen Hintergrund. ProxySQL verwaltet den Datenverkehr durch Abfrageregeln und kann mit demselben Mechanismus das Zwischenspeichern von Abfragen durchführen. ProxySQL speichert zwischengespeicherte Abfragen in einer Speicherstruktur. Zwischengespeicherte Daten werden mithilfe der Time-to-Live (TTL)-Einstellung entfernt. Die TTL kann für jede Abfrageregel einzeln definiert werden, sodass der Benutzer entscheiden kann, ob für jede einzelne Abfrage Abfrageregeln mit unterschiedlichen TTL definiert werden sollen oder ob er nur ein paar Regeln erstellen muss, die den meisten entsprechen der Verkehr.

Es gibt zwei Konfigurationseinstellungen, die definieren, wie ein Abfrage-Cache verwendet werden soll. Zuerst mysql-query_cache_size_MB die ein weiches Limit für die Größe des Abfrage-Caches definiert. Es handelt sich nicht um eine feste Grenze, sodass ProxySQL möglicherweise etwas mehr Speicher verwendet, aber es reicht aus, um die Speicherauslastung unter Kontrolle zu halten. Die zweite Einstellung, die Sie optimieren können, ist mysql-query_cache_stores_empty_result . Es definiert, ob eine leere Ergebnismenge zwischengespeichert wird oder nicht.

Der ProxySQL-Abfragecache ist als Schlüsselwertspeicher konzipiert. Der Wert ist die Ergebnismenge einer Abfrage und der Schlüssel besteht aus verketteten Werten wie:Benutzer, Schema und Abfragetext. Dann wird aus dieser Zeichenfolge ein Hash erstellt und dieser Hash wird als Schlüssel verwendet.

Einrichten von ProxySQL als Abfrage-Cache mit ClusterControl

Als Ersteinrichtung haben wir einen Replikationscluster aus einem Master und einem Slave. Wir haben auch einen einzelnen ProxySQL.

Dies ist keineswegs ein produktionstaugliches Setup, da wir eine Art Hochverfügbarkeit für die Proxy-Ebene implementieren müssten (z. B. durch Bereitstellen von mehr als einer ProxySQL-Instanz und dann Keepalive auf ihnen für Floating Virtual IP), aber es wird für unsere Tests mehr als ausreichen.

Zuerst überprüfen wir die ProxySQL-Konfiguration, um sicherzustellen, dass die Abfrage-Cache-Einstellungen unseren Wünschen entsprechen.

256 MB Abfrage-Cache sollten ungefähr richtig sein, und wir möchten auch die leeren Ergebnismengen zwischenspeichern - manchmal muss eine Abfrage, die keine Daten zurückgibt, noch viel Arbeit leisten, um zu überprüfen, ob nichts zurückzugeben ist.

Der nächste Schritt besteht darin, Abfrageregeln zu erstellen, die den Abfragen entsprechen, die Sie zwischenspeichern möchten. In ClusterControl gibt es zwei Möglichkeiten, dies zu tun.

Abfrageregeln manuell hinzufügen

Der erste Weg erfordert etwas mehr manuelle Aktionen. Mit ClusterControl können Sie ganz einfach jede gewünschte Abfrageregel erstellen, einschließlich Abfrageregeln, die das Caching durchführen. Schauen wir uns zunächst die Liste der Regeln an:

An diesem Punkt haben wir eine Reihe von Abfrageregeln, um die Lese-/Schreibaufteilung durchzuführen. Die erste Regel hat die ID 100. Unsere neue Abfrageregel muss vor dieser verarbeitet werden, daher verwenden wir die niedrigere Regel-ID. Lassen Sie uns eine Abfrageregel erstellen, die Abfragen ähnlich wie diese zwischenspeichert:

SELECT DISTINCT c FROM sbtest8 WHERE id BETWEEN 5041 AND 5140 ORDER BY c

Es gibt drei Möglichkeiten, die Abfrage abzugleichen:Digest, Match Digest und Match Pattern. Lassen Sie uns hier ein wenig über sie sprechen. Zuerst Match Digest. Wir können hier einen regulären Ausdruck festlegen, der mit einer verallgemeinerten Abfragezeichenfolge übereinstimmt, die einen Abfragetyp darstellt. Zum Beispiel für unsere Abfrage:

SELECT DISTINCT c FROM sbtest8 WHERE id BETWEEN 5041 AND 5140 ORDER BY c

Die generische Darstellung lautet:

SELECT DISTINCT c FROM sbtest8 WHERE id BETWEEN ? AND ? ORDER BY c

Wie Sie sehen können, wurden die Argumente der WHERE-Klausel entfernt, daher werden alle Abfragen dieses Typs als eine einzige Zeichenfolge dargestellt. Diese Option ist sehr angenehm zu verwenden, da sie mit dem gesamten Abfragetyp übereinstimmt und, was noch wichtiger ist, alle Leerzeichen entfernt werden. Dies macht es so viel einfacher, einen regulären Ausdruck zu schreiben, da Sie keine seltsamen Zeilenumbrüche, Leerzeichen am Anfang oder Ende der Zeichenfolge und so weiter berücksichtigen müssen.

Digest ist im Grunde ein Hash, den ProxySQL über das Match-Digest-Formular berechnet.

Schließlich stimmt Match Pattern mit dem vollständigen Abfragetext überein, wie er vom Client gesendet wurde. In unserem Fall hat die Abfrage folgende Form:

SELECT DISTINCT c FROM sbtest8 WHERE id BETWEEN 5041 AND 5140 ORDER BY c

Wir werden Match Digest verwenden, da wir möchten, dass alle diese Abfragen von der Abfrageregel abgedeckt werden. Wenn wir nur diese bestimmte Abfrage zwischenspeichern möchten, wäre die Verwendung von Match Pattern eine gute Option.

Der reguläre Ausdruck, den wir verwenden, ist:

SELECT DISTINCT c FROM sbtest[0-9]+ WHERE id BETWEEN \? AND \? ORDER BY c

Wir stimmen buchstäblich mit der genauen verallgemeinerten Abfragezeichenfolge überein – mit einer Ausnahme – wir wissen, dass diese Abfrage mehrere Tabellen getroffen hat, deshalb haben wir einen regulären Ausdruck hinzugefügt, um sie alle abzugleichen.

Sobald dies erledigt ist, können wir sehen, ob die Abfrageregel in Kraft ist oder nicht.

Wir können sehen, dass die „Hits“ zunehmen, was bedeutet, dass unsere Abfrageregel verwendet wird. Als Nächstes sehen wir uns eine andere Möglichkeit zum Erstellen einer Abfrageregel an.

ClusterControl zum Erstellen von Abfrageregeln verwenden

ProxySQL verfügt über eine nützliche Funktion zum Sammeln von Statistiken der weitergeleiteten Abfragen. Sie können Daten wie die Ausführungszeit verfolgen, wie oft eine bestimmte Abfrage ausgeführt wurde und so weiter. Diese Daten sind auch in ClusterControl vorhanden:

Was noch besser ist, wenn Sie auf einen bestimmten Abfragetyp zeigen, können Sie eine damit verbundene Abfrageregel erstellen. Sie können diesen speziellen Abfragetyp auch einfach zwischenspeichern.

Wie Sie sehen können, sind einige der Daten wie Regel-IP, Cache-TTL oder Schemaname bereits ausgefüllt. ClusterControl füllt auch Daten basierend auf dem Abgleichmechanismus, für den Sie sich entschieden haben. Wir können einfach entweder Hash für einen bestimmten Abfragetyp verwenden oder Match Digest oder Match Pattern verwenden, wenn wir den regulären Ausdruck feinabstimmen möchten (zum Beispiel dasselbe tun wie zuvor und den regulären Ausdruck erweitern, um alle abzugleichen Tabellen im sbtest-Schema).

Dies ist alles, was Sie zum einfachen Erstellen von Abfrage-Cache-Regeln in ProxySQL benötigen. Laden Sie ClusterControl herunter, um es noch heute auszuprobieren.