Unser Newsletter rund um technische Themen,
das Unternehmen und eine Karriere bei uns.

4 Minuten Lesezeit (772 Worte)

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

Über den MySQL-Router haben wir hier bereits an mehreren Stellen berichtet ([1] & [2]). Er spielt bei MySQL-Hochverfügbarkeits-Lösungen (z. B. dem InnoDB-Cluster) eine zentrale Rolle. Seit der Version MySQL 8.0.17 wurde der Router um eine REST API erweitert. Über diese Schnittstelle lässt sich der Zustand und die ordnungsgemäße Funktionsweise überprüfen. In diesem Beitrag stellen wir ihnen den Funktionsumfang der jetzt aktuellen Version 8.0.29 vor.

Eine entspannte Umgebung schaffen: Die Testumgebung

Für diesen Beitrag nutzen wir ein minimales InnoDB-Cluster-Setup, welches wir in einer Docker-Umgebung aufgebaut haben. Anders als in produktiven Umgebungen besteht unser Setup nur aus drei Containern, auf denen sich neben den obligatorischen drei MySQL-Instanzen (Knoten) auch der Router und eine MySQL Shell (jeweils auf einem der drei Knoten) befinden.

In der Praxis könnte das Setup eines InnoDB-Clusters (inkl. einer Router-Instanz) wie folgt aussehen:

https://dev.mysql.com/doc/refman/8.0/en/images/innodb_cluster_overview.png

In unserem Fall besteht der InnoDB-Cluster aus den folgenden drei Knoten (Ausgabe der MySQL Shell an einigen Stellen gekürzt):

mysqlshell mysql1:3306 ssl  JS > clu.status();
{
    "clusterName": "mj",
    "defaultReplicaSet": {
        "name": "default",
        "primary": "fcf4457d6eaa:3306",
        "ssl": "REQUIRED",
        "status": "OK",
        "statusText": "Cluster is ONLINE and can tolerate up to ONE failure.",
        "topology": {
            "39602c324d5f:3306": {
                "address": "39602c324d5f:3306",
                "memberRole": "SECONDARY",
                "mode": "R/O",
                ...
                "status": "ONLINE",
                "version": "8.0.29"
            },
            "989fbb2537f4:3306": {
                "address": "989fbb2537f4:3306",
                "memberRole": "SECONDARY",
                "mode": "R/O",
                 ...
            },
            "fcf4457d6eaa:3306": {
                "address": "fcf4457d6eaa:3306",
                "memberRole": "PRIMARY",
                "mode": "R/W",
                ...            }
        },
        "topologyMode": "Single-Primary"
    },
    "groupInformationSourceMember": "fcf4457d6eaa:3306"
 

Relaxt ans Ziel kommen: Der Aufbau des Routers

Der Router wurde ohne jegliche weitere Änderungen auf unseren Knoten „mysql3“ installiert bzw. „gebootstrapt“ („Bootstrapping“ entspricht einem Prozess, der ein komplexes System initialisiert). In der aktuellen Version wird hierbei bereits per Default ein Webserver mit der entsprechenden REST API gestartet.

# Bootstrapping des Routers:

bash mysql3> mysqlrouter --bootstrap admin:admin@mysql1 --user=mysql -d /opt/mysql/router

Ab diesem Moment kann die REST API grundlegend abgefragt werden. Detailinformationen können jedoch NICHT ohne eine Authentifizierung erlangt werden. Hierfür müssen dem Cluster noch User-Accounts hinzugefügt werden.

# Abfrage der zur Verfügung stehenden „Pfade“:

root@39602c324d5f:/opt/mysql/router# curl -s -k https://mysql3:8443/api/20190715/swagger.json | jq '.paths | keys'
[
  "/metadata",
  "/metadata/{metadataName}/config",
  "/metadata/{metadataName}/status",
  "/router/status",
  "/routes",
  "/routes/{routeName}/blockedHosts",
  "/routes/{routeName}/config",
  "/routes/{routeName}/connections",
  "/routes/{routeName}/destinations",
  "/routes/{routeName}/health",
  "/routes/{routeName}/status",
  "/routing/status"
]
 

Immer schön locker bleiben: Authentifizieren Sie sich

Ohne einen zuvor definierten User würde ein Zugriff auf einen der oben aufgeführten Pfade zu einem Berechtigungsfehler im Browser führen. Der einfachste Weg einen User-Account für die REST API zu generieren, ist die Nutzung eines MySQL-Shell-Plugins, welches von Frédéric Descamps zur Verfügung gestellt wird (https://github.com/lefred/mysqlshell-plugins/). Die genaue Installation des Plugins wird auf seiner GitHub-Seite erklärt. Durch die Nutzung des Plugins können wir dedizierte User ohne sonstigen Datenbankzugriff erstellen und verwalten.

mysqlshell mysql1:3306 ssl  JS > router.createRestUser()
Enter the username: ordix
Enter the password: *****
Enter the password again: *****
You can now use 'ordix' to authenticate to MySQL Router's REST API.
Use myrouter=router.create("ordix@<router IP>:8443") to create an object to monitor.
 

Natürlich gibt es auch die Möglichkeit, den User „klassisch“ über den MySQL-Client zu erzeugen. Hierzu wird ein Datenbank-User-Account erzeugt, der dann über SQL-Kommandos in die Meta-Tabellen des InnoDB-Cluster (Schema: mysql_innodb_cluster_metadata) kopiert wird. Ein Beispiel kann dem Blog-Beitrag von Ivan Ma entnommen werden. [3]

Einfach mal genießen: Der Zugriff auf die API. 

Nachdem der User eingerichtet wurde, kann auf die REST API zugegriffen werden. Im ersten Schritt schauen wir uns die Metadaten unseres Routing-Services an: https://localhost:8443/api/20190715/metadata/.

Natürlich kann man anhand der obenstehenden Pfadliste unterschiedlichste Details zu den verfügbaren Routen anschauen. Wir schauen uns exemplarisch die Zielsysteme (DB-Knoten) unseres Routers für die lediglich lesenden Zugriffe (bootstrap_ro) an: https://localhost:8443/api/20190715/routes/bootstrap_ro/destinations 

Wie wir erkennen können, sind dort die beiden Knoten hinterlegt, die wir auch über das Cluster-Status-Kommando gesehen haben.

Alternativ haben wir auch Zugriff über Informationen zu den gerade bestehenden Verbindungen über eine „Route“:
https://localhost:8443/api/20190715/routes/bootstrap_ro/connections

Die Liste beinhaltet eine Reihe von aktiven Verbindungen, die wir zu Testzwecken aufgebaut haben. Dabei ist anhand des Feldes „destinationAddress“ (172.19.0.2 und 172.19.0.4) zu erkennen, dass beide RO-Zielsysteme (RO = read only) abwechselnd verwendet werden (Round Robin-Verfahren). 

Alles entspannt? Das Fazit: 

Die REST API bietet eine schöne Möglichkeit, um sich über den Zustand des Router-Setups zu informieren bzw. die Nutzung dieses Dienstes zu monitoren. Dieser Service bietet damit eine hervorragende Möglichkeit, um auch in Fehlersituationen weitere Informationen zu bekommen. Der Aufwand für die Einrichtung ist überschaubar und schnell erledigt.

Sie haben Fragen zum Betrieb von hochkritischen MySQL-Umgebungen? Sprechen Sie uns an. 

Seminarempfehlungen

Principal Consultant bei ORDIX

 

Kommentare

Derzeit gibt es keine Kommentare. Schreibe den ersten Kommentar!
Sonntag, 22. Dezember 2024

Sicherheitscode (Captcha)

×
Informiert bleiben!

Bei Updates im Blog, informieren wir per E-Mail.

Weitere Artikel in der Kategorie