Grafana: von SQLite zu MariaDB
Ausfallsicherheit, Lastverteilung, Performance, eine ganz grundsätzliche Abneigung gegen SQLite – es sind viele Gründe denkbar, Grafana seine Daten aus einer (üblicherweise ohnehin schon vorhandenen) MariaDB beziehen zu lassen. Ich habe mir während der Umstellung ein paar Notizen gemacht und teile sie mal hier – auf dass sie auch anderen nützlich sein mögen 😘
- Grafana stoppen
- Dump der SQLite-Daten erstellen
- Datenbank vorbereiten
- Anpassung der Grafana-Einstellungen
- Grafana wieder starten
- Den Dump einspielen
- Fazit
- Mögliche Fehler
Grafana stoppen
Sollte Grafana bereits laufen, so muss es zunächst einmal gestoppt werden.
Klassisch installiert
$ service grafana-server stop
Docker
$ docker stop grafana
Dump der SQLite-Daten erstellen
Es geht ja darum, die Bestandsdaten aus SQLite in die MariaDB zu übernehmen; also wird zunächst ein Dump dieser Daten benötigt. In den Grafana-Repositories gibt es hierzu den database-migrator
:
$ cd /usr/src && git clone https://github.com/grafana/database-migrator.git
Cloning into 'database-migrator'...
remote: Enumerating objects: 25, done.
remote: Counting objects: 100% (25/25), done.
remote: Compressing objects: 100% (25/25), done.
remote: Total 25 (delta 7), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (25/25), done.
$ file /var/lib/grafana/grafana.db
/var/lib/grafana/grafana.db: SQLite 3.x database, last written using SQLite version 3029000
$ cd database-migrator/
$ bash -x sqlitedump.sh /var/lib/grafana/grafana.db > /tmp/grafana.sql
Datenbank vorbereiten
Nun geht es darum, eine MariaDB-Datenbank zu erstellen nebst eines Benutzers, der Vollzugriff darauf hat.
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 416342
Server version: 10.4.21-MariaDB-1:10.4.21+maria~buster-log mariadb.org binary distribution
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MariaDB [(none)]> create database grafana CHARACTER SET 'utf8mb4';
Query OK, 1 row affected (0.001 sec)
MariaDB [(none)]> create user 'grafana'@'localhost' identified by 'KU0hbCaJcknIzeu8shOixJGD';
Query OK, 0 rows affected (0.283 sec)
MariaDB [(none)]> grant all privileges on grafana.* to 'grafana'@'localhost';
Query OK, 0 rows affected (0.014 sec)
MariaDB [(none)]> flush privileges;
Query OK, 0 rows affected (0.184 sec)
MariaDB [(none)]> quit
Bye
Anpassung der Grafana-Einstellungen
Im nächsten Schritt muss die Umstellung auf Seite von Grafana erfolgen; zur Verwendung von MariaDB ist als type
mysql
einzusetzen.
Klassisch installiert
Im Falle eines klassisch installierten Grafana musst du /etc/grafana/grafana.ini
entsprechend anpassen.
[database]
# You can configure the database connection by specifying type, host, name, user and password
# as separate properties or as on string using the url properties.
# Either "mysql", "postgres" or "sqlite3", it's your choice
type = mysql
host = 127.0.0.1:3306
name = grafana
user = grafana
password = KU0hbCaJcknIzeu8shOixJGD
Docker
In meinem Fall läuft Grafana als Docker-Container, ich musste daher in docker-compose.yml
die entsprechenden Umgebungsvariablen setzen:
...
- GF_DATABASE_TYPE=mysql
- GF_DATABASE_HOST=127.0.0.1:3306
- GF_DATABASE_NAME=grafana
- GF_DATABASE_USER=grafana
- GF_DATABASE_PASSWORD=KU0hbCaJcknIzeu8shOixJGD
Grafana wieder starten
Die vorhin erstellte Datenbank grafana
ist ja nach wie vor leer: wenn du jetzt Grafana startest, so wird die für den Betrieb benötigte Tabellenstruktur automatisch angelegt. Erst wenn diese Struktur vorhanden ist, lässt sich der Dump einspielen!
Klassisch installiert
$ service grafana-server start
Docker
Wie du Grafana in deiner Umgebung startest, hängt stark von deinem Setup ab; ich feuere meinen Container unter Nutzung von docker-compose
(die Auswertung der docker-compose.yml
erfolgt hier implizit) hoch.
$ docker-compose up -d
Den Dump einspielen
Ganz gleich ob nun Container oder nicht – Grafana meldet im Logfile diverse Dinge und signalisiert mit dem folgenden Eintrag, dass es gestartet und betriebsbereit ist.
t=2021-11-07T16:40:28+0000 lvl=info msg="HTTP Server Listen" logger=http.server address=[::]:8443 protocol=http subUrl=/stats socket=
Das ist der richtige Zeitpunkt, um Grafana auf die jeweils erforderliche Art (s.o.) wieder zu stoppen und im Anschluss daran dann den Dump einzuspielen.
$ mysql grafana < grafana.sql
Fazit
Und das war’s dann auch schon: nach einem neuerlichen Start des Dienstes bezieht Grafana seine Daten aus der MariaDB-Datenbank; das SQLite-File wird nicht mehr beschrieben. Das ist der richtige Zeitpunkt, um alle Dashboards und Graphen eingehend zu kontrollieren und im Filesystem aufzuräumen.
Mögliche Fehler
Beim Einspielen des Dumps kam es zu einer für mich zuerst überraschenden Fehlermeldung:
ERROR 1136 (21S01) at line 304: Column count doesn't match value count at row 1
Wie sich zeigte unterschieden sich die Grafana-Version, in welcher ich den Dump erzeugt hatte und jene, in welche ich ihn dann einzuspielen versuchte. Es ist unbedingt darauf zu achten, dass sich die Grafana-Version im Laufe der Umstellung nicht ändert Und das gilt auch und gerade bei Verwendung von Docker!
Hintergrundbild: Eine erschreckende Sammlung erschreckender Puppenkoepfe, 2021, 1000x 750px, Bild genauer anschauen – © Marianne Spiller – Alle Rechte vorbehalten