Erstellen eines MariaDB-Galera-Clusters

Datum

Was ist ein Galera-Cluster?

MariaDB Galera Cluster ist ein synchroner multi-master cluster für MariaDB.
Galera ist nur für Linux verfügbar und unterstützt/verwndet NUR InnoDB.
Um Galera zu verwenden, benötigt man MariaDB mindestens in der Version 10.1.

Vor- und Nachteile

Vorteile:

  • synchron, alle Nodes haben permanent des gleichen, aktuellen Datenbestand
  • es kann ein Node ausfallen, ohne das dabei Daten verloren gehen
  • gute Skalierbarkeit, es können problemlos Nodes hinzugefügt oder entfernt werden
  • alle Nodes können zu jeder Zeit in der Datenbank lesen und schreiben

Nachteile:

  • der langsamste Node bestimmt die Geschwindigkeit des gesamten Clusters
  • da alle Nodes den gleichen Datenbestand haben und nicht nur einen Teil, benötigen Sie auch den entsprechenden Platz

Vorbereitungen

Um Galera verwenden zu können, benötigt man MariaDB mindestens in der Version 10.1 und diese ist leider in kaum einer Linux-Distro als Standard dabei.
Von daher müssen hier noch die MariaDB-Paketquellen in die entsprechenden Systeme eingebunden werden.
Um die passenden Paketquellen für die zu verwendende Linux-Distro zu finden, verwendet man am besten das eigens bereitgestellte Repository Configuration Tool.

Nachdem dies geschehen ist und sich MariaDB in der aktuellsten (stabilen) Version auf den entsprechenden Nodes installiert ist, sollte man, wie bei einen normalen MySQL-INstallation auch, den Befehl mysql_secure_installation ausführen.

Des weiteren sollte für die hier aufgeführte Konfiguration rsync installiert sein, da dies für den State Snapshot Transfer verwendet wird.

Konfiguration

Nun beginnen wir auf dem ersten Node damit, eine eigene Galera-Konfiguration unter /etc/mysql/conf.d/ anzulegen und folgenden Inhalt einzufügen:

[mysqld]
#mysql settings

binlog_format=ROW
default-storage-engine=innodb
innodb_autoinc_lock_mode=2
bind-address=0.0.0.0

#galera settings

wsrep_on=ON
wsrep_provider=/usr/lib/galera/libgalera_smm.so
wsrep_cluster_name="galera-test-cluster"
wsrep_node_address="192.168.0.3"
wsrep_cluster_address="gcomm://192.168.0.2,192.168.0.3,192.168.0.4"
wsrep_sst_method=rsync

Zur Erläuterung:
Der erste Teil der Konfiguration setzt noch einmal die entsprechenden Parameter für MariaDB/MySQL. Da Galera nicht mit MyISAM umgehen kann, wird InnoDB als Standard festgelegt. Man könnte hier auch noch Locations wie datadir oder socket festlegen.
Vorallem sollte man darauf achten, dass bind-address nicht auf 127.0.0.1 festgelegt ist, da sonst keine Kommunikation mit den anderen Nodes möglich ist.
Werte wie binlog_format=ROW und innodb_autoinc_lock_mode=2 sollten auf keinen Fall geändert werden. Den Grund dafür kann man in der Dokumentation zur System Configuration nachlesen.

Der zweite Teil ist die eigentliche Galera-Konfiguration.
wsrep_on Definiert, ob die Replikation während der aktuellen Session aktualisiert werden soll.
wsrep_provider gibt den Pfad vom Galera Replication Plugin an
wsrep_cluster_name setzt den Namen des Clusters

SHOW VARIABLES LIKE 'wsrep_cluster_name';
+--------------------+-----------------+
| Variable_name      | Value           |
+--------------------+-----------------+
| wsrep_cluster_name | Beispielcluster |
+--------------------+-----------------+

wsrep_node_address die Adresse des aktuellen Nodes auf dem man sich gerade befindet (IP:Port)
wsrep_cluster_address gibt alle am Cluster beteiligten Nodes (falls nötig mit Ports) an. Schema: IP,IP:Port,IP
wsrep_sst_method legt die Methode fest, welche für den State Snapshot Transfer verwendet werden soll

State Snapshot Transfer (SST)

Dabei handelt es sich um die Methode, wie die Daten auf die Nodes gebracht werden.
Möglich sind hierbei: rsync, mysqldump, xtrabackup, xtrabackup v2

Mehr Infos dazu findet man auch hierbei wieder in der offiziellen Dokumentation: galeracluster.com

Nun verteilt man diese Konfiguration auf die einzelnen Nodes und passt jeweils wsrep_node_address entsprechend an.

Anpassung der Firewall
Da der MySQL-Dienst hier auf 0.0.0.0 lauscht sollten Zugriffe von außerhalb des Clusterverbundes mit entsprechenden Firewall-Regeln unterbunden werden.
Sofern man keine Hardware-Firewall zur Verfügung hat, bietet sich ufw als einfach zu bedienende Software-Lösung an.
Folgende Ports sollten für einzelnen Nodes offen sein:

  • 3306 für MySQL-Clients und für State Snapshot Transfer falls mysqldump dafür verwendet wird
  • 4567 wird für den Galera replication Traffic benötigt, multicast replication benötigt hierbei sowohl UDP als auch TCP für diesen Port
  • 4568 ist für Incremental State Transfer
  • 4444 für alle anderen Arten des State Snapshot Transfer

Starten des Clusters

Zuerst stellt man sicher, dass der MySQL-Dienst auf allen Nodes gestoppt ist.
Dies kann man mit systemctl status mariadb.service überprüfen.

Der erste Node wird NICHT per systemd oder sonstigem init-script gestartet!
Für den Start des ersten Nodes verwendet man den Befehl galera_new_cluster.
Anschließend kann man überprüfen ob dies erfolgreich war:

# mysql -e "SHOW STATUS LIKE 'wsrep_cluster_size'"
+--------------------+-------+
| Variable_name      | Value |
+--------------------+-------+
| wsrep_cluster_size | 1     |
+--------------------+-------+

Starten der weiteren Nodes

Auf den verbleibenden Nodes kann der MariaDB/MySQL-Dienst regulär per systemctl start mariadb.service gestartet werden. Nachdem der Dienst gestartet wurde fangen die Nodes an die in der Konfiguration aufgeführten IP-Adressen zu kontaktieren und versuchen sich mit diesen zu verbinden.

node02: $  systemctl start mariadb.service
node02: $  mysql -e "SHOW STATUS LIKE 'wsrep_cluster_size'"
+--------------------+-------+
| Variable_name      | Value |
+--------------------+-------+
| wsrep_cluster_size | 2     |
+--------------------+-------+

node03: $  systemctl start mariadb.service
node03: $  mysql -e "SHOW STATUS LIKE 'wsrep_cluster_size'"
+--------------------+-------+
| Variable_name      | Value |
+--------------------+-------+
| wsrep_cluster_size | 3     |
+--------------------+-------+

damit ist die Einrichtung erfolgreich abgeschlossen…

Anmerkung für Debian-based Linux

Da bei der Installation von MariaDB auf Debian oder Ubuntu noch ein debian-sys-maint Benutzer angelegt wird, welcher z.B. für die Logrotation verwendet wird, muss darauf geachtet werden, dass dieser Benutzer auch auf jedem Node in der Datei /etc/mysql/debian.cnf das gleiche Passwort zu stehen hat.
Bzw. das Passwort, welches auf dem ersten Node verwendet wird, da dieses in der DB entsprechend hinterlegt ist.

Autor
Kategorien Linux, Datenbanken

PRTG Map