Von Matthias Jung auf Freitag, 10. November 2023
Kategorie: News

Trennung leicht gemacht: MySQL Router 8.2.0 und der „Read / Write Split“

Mit der neuen Version 8.2.0 vom MySQL Router gibt es eine neue Funktion, die den Betrieb von MySQL InnoDB Clustern und / oder ReplicaSets weiter verbessert. In den meisten Setups unserer Kunden wird auch der MySQL Router eingesetzt. Dieser bietet bislang die Möglichkeit Lese- und Schreibaktivitäten über verschiedene zur Verfügung gestellte Ports (per Default 6446 für lesende und (!) schreibende Zugriffe und 6447 für nur (!) lesende Zugriffe) zu trennen. Damit kann ein Read-Scale-Out über die sekundären Systeme erreicht und das primäre System z. B. entlastet werden. Bislang musste die Applikation diesen gezielten (richtigen) Portzugriff umsetzen. Mit der Version 8.2.0 und dem „transparent read / write splitting“ wird dies nun einfacher.  

Die Versuchsanordnung

Für unser Beispiel-Setup nutze ich meine Umgebung, die ich für die kommende DOAG-Konferenz & Austeilung `23 zusammengestellt habe.

Werbeblock: https://meine.doag.org/events/anwenderkonferenz/2023/agenda/#eventDay.all#textSearch.Matthias%20Jung%20MySQL

Diese besteht aus einem MySQL Cluster mit den Knoten:

Auf einem weiteren Knoten „doag40“ habe ich die aktuelle Version (Innovation Release; „Nichts ist so beständig wie der Wandel“ (Heraklit): Oracle MySQL ändert sein Versionsmodell) des MySQL Routers heruntergeladen und entpackt.

Beim „Bootstrapping“ des Routers bleibt alles beim Alten. Wir geben einen beliebigen Cluster-Knoten und einen gültigen Account an und installieren unseren Router:

Der „Kenner“ sieht bereits in den Ausgaben der Installation, dass nun drei und nicht mehr zwei Ports konfiguriert werden (Bereich „MySQL Classic protocol“). Die „alten“ Ports für „Read/Write“ und „Read/Only“ bleiben erhalten. Neu ist der Port für den „Read/Write Split“. Per Default ist dies 6450. 

Die Teststellung

Unser InnoDB Cluster ist betriebsbereit.  

Die primäre Instanz läuft auf dem Knoten „doag10“. Auf den Systemen „doag20“ und „doag30“ laufen die Replicas.

Wir bauen über den MySQL Router eine Verbindung zu unserem Cluster auf. Dazu nutzen wir den neuen Port 6450: 

Wir wurden auf eines der beiden Replica-Systeme durchgestellt („doag20“). Dieses ist im Modus „R/O“ (read only). Trotzdem werden wir im Folgenden auch einige schreibende Aktivitäten durchführen, u. a.:

Das Anlegen einer Datenbank („Split“) und Tabelle „"split_test“)

Das Schreiben in diese Tabelle 

Wie wir unschwer erkennen können, haben unsere Aktionen zu keinen Problemen geführt. Sowohl die Objekte als auch der zu erzeugende Datensatz konnten erzeugt werden. Beim INSERT haben wir über die SQL-Variable „@@hostname“ des Namens des MySQL-Knotens in die Tabelle geschrieben. Die Initiale Verbindung hatten wir zu diesem Zeitpunkt ja zu einem rein lesenden System („doag20“). Was ist hier also passiert?

Wenn wir uns den erzeugten Datensatz anschauen, sehen wir, dass der Router dieser Anfrage (INSERT) an das „Source“-System („doag10“) geroutet hat. Dies ist natürlich auch bereits vorher für das „CREATE DATABASE“ und „CREATE TABLE“-Kommando erfolgt.

Die nachfolgenden lesenden Zugriffe werden dann aber wieder gehen das Replikat („doag20“) „gefahren". 

​Das Testprotokoll / Fazit

Wieder ein nützliches „Feature" im Umfeld der MySQL InnoDB-Clusters. Nun muss nicht mehr die Applikation entscheiden, welche Kommandos über welchen Port laufen sollen. In vielen Standard-Produkten ist eine multiple Port-Konfiguration ohnehin gar nicht möglich.Über denen neuen „Read/Write Split"-Port kann nun auch ein „Read-Scale-Out" ohne großen Aufwand realisiert werden. Aus unserer Sicht ist die ein echter Mehrwert.

Weitere interessante Beiträge um den MySQL InnoDB-Cluster und den Router finden Sie hier: 

Lesen lernen: Der MySQL InnoDB Cluster & Read Replicas

Mach Dich unsichtbar: MySQL Generated Invisible Primary Keys

Kurz und gut – Episode #10 Sag mir, woher Du kommst!

Ein Geheimnis behalten: MySQL Router „Bootstrapping" ohne „root"-Account

Immer schön friedlich. Monitoring des MySQL-Router mit der RESTful API

Doppelt gemoppelt: Wie man Cluster "clustered". MySQL-InnoDB-ClusterSets

Kommentare hinterlassen