Mariadb (Galera) Cluster Recovery
Ein Mariadb-Cluster kann ganz, oder teilweise ausfallen. Je nach Art des Ausfalls können unterschiedliche Reparatur-Schritte notwendig sein.
Existiert noch ein Cluster, können Nodes wieder eingegliedert werden. Hierfür ist in der Regel ein einfacher Restart der ausgefallenen Nodes ausreichend. Die zwischenzeitlich angefallenen Daten-Differenzen werden dann neu synchronisiert und der Mariadb-Server anschließend wieder eingebunden.
Galera Cluster prüfen
Auf einem noch funktionierenden Node kann die Cluster-Größe geprüft werden:
MariaDB [(none)]> SHOW STATUS LIKE 'wsrep_cluster_size';
+--------------------+-------+
| Variable_name | Value |
+--------------------+-------+
| wsrep_cluster_size | 3 |
+--------------------+-------+
Weicht die Menge von der gewünschten Größe ab, müssen die defekten Nodes neugestartet werden. In diesem Fall ist alles in Ordnung, 3 Nodes, alle sind im Cluster.
Cluster komplett neu starten
In manchen Fällen kann das gesamte Cluster gestoppt oder abgestürzt sein. In diesem Fall werden folgende Schritte notwendig:
- letzten aktiven Node mit konsistentem Datenbestand ermitteln
- Cluster von diesem Node aus starten (boostrap)
- weitere Clients in das Cluster joinen
letzten aktiven Node ermitteln
Auf allen Servern prüft man den Status mittels State-File:
# SERVER-A
$ cat /var/lib/mysql/grastate.dat
# GALERA saved state
version: 2.1
uuid: 00000000-0000-0000-0000-000000000000
seqno: -1
safe_to_bootstrap: 0
# SERVER-B
$ cat /var/lib/mysql/grastate.dat
# GALERA saved state
version: 2.1
uuid: 05debef1-9635-4a3d-aade-7b2f7625cace
seqno: 12345
safe_to_bootstrap: 1
# SERVER-C
$ cat /var/lib/mysql/grastate.dat
# GALERA saved state
version: 2.1
uuid: 00000000-0000-0000-0000-000000000000
seqno: -1
safe_to_bootstrap: 0
Hierbei ist der Punkt safe_to_bootstrap von Relevanz. Der letzte aktive Node (hier Server B) sollte eine 1 eingetragen haben, wodurch bewiesen ist, dass der Datenbestand auf diesem Server der aktuellste ist und ein Neustart sicher ist. Würde das Cluster von einem anderen Server gestartet werden, lüden sich die anderen einen veralteten Stand herunter und Datenverlust droht!
Ansonsten kann auch anhand der höchsten seqno der letzte Node ermittelt werden!
Ist auf keinem der Nodes das Flag gesetzt, ist es sinnvoll in den Log-Dateien (Journal) den letzten aktiven Server zu ermitteln. Der zuletzt abgestürzt ist, sollte der letzte Server sein. Alternativ startet man ein eigenes Cluster auf jedem Server und muss die Daten händisch vergleichen und abwägen.
Cluster boostrap
Für einen Boostrap müssen Konfigurationen angepasst werden. In der MariaDB Konfiguration:
# auskommentieren der Node-Adressen
#wsrep_cluster_address="gcomm://10.20.30.1,10.20.30.2,10.20.30.3"
# leere gcom:// setzen
wsrep_cluster_address="gcomm://"
Der Start-Parameter von MariaDB muss nun auch angepasst werden:
mysqld --wsrep-new-cluster
In einer Docker-Umgebung kann dies an den Command-Parameter angehängt werden...
Re-Join der anderen Nodes
Die anderne Nodes sollten aufgrund der "wsrep_cluster_address"-Einstellung automatisch dem Cluster beitreten. Manchmal können die unterschiedlichen Daten hier für Probleme sorgen. In diesem Fall kann es notwendig sein, die Daten im MySQL-Verzeichnis zu löschen. Nach einem Neustart synchronisiert MariaDB die Daten komplett neu und nach erfolgreichem Kopieren wird der Node integriert.
Wichtig:
Der Parameter "--wsrep-new-cluster" wird nur auf dem Server gesetzt, der als erster das Clsuter initialisiert! Mehrfaches setzen auf Hosts unterbindet das Verbinden und hat gegenteilige Effekte...