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.