Mit der Galera Erweiterung auf der MariaDB Datenbank lässt sich ganz einfach ein active/active Cluster aufbauen wo man auf alle Server schreiben und lesen kann.
Das einzige was man dazu beachten sollten ist, dass es mindestens drei Datenbank Server für ein stabiles Setup braucht.
Die Installation auf CentOS/RedHat 8 ist einfach und lässt sich im Grundsatz auch auf andere Distributionen wie Ubuntu abbilden.
Inhalt
Installation
Zuerst werden auf allen Servern die entsprechenden Pakete installiert, jedoch noch nicht gestartet!
dnf install mariadb-server-galera mariadb
Konfiguration auf dem ersten Node
Die Konfiguration auf dem ersten node unterscheidet sich darin, dass man den Cluster zuerst initialisieren („bootstrappen“) muss.
Zuerst wird die Konfiguration in der Datei /etc/my.cnf.d/galera.cnf
angepasst:
wsrep_cluster_address="gcomm://"
Beim ersten Node kann die Liste nach "gcomm://"
leer sein. Bei allen weiteren Nodes müssen da alle IP Adressen der Cluster Server eingetragen werden.
Nun wird der Cluster zum ersten Mal initialisiert und gestartet:
galera_new_cluster
systemctl --now enable mariadb
Konfiguration auf allen anderen Nodes
Nun werden die anderen Nodes konfiguriert.
In der Datei /etc/my.cnf.d/galera.cnf
wird wirderum die Variable wsrep_cluster_address
angepasst, dieses Mal werden da jedoch die IP Adressen der Cluster Server eingetragen:
wsrep_cluster_address="gcomm://192.168.1.10,192.168.1.20,192.168.1.30"
Das wars schon. Jetzt kann auch hier mariadb gestartet werden:
systemctl --now enable mariadb
Test des Clusters
Als erstes kann nun der Status des Clusters überprüft werden:
mysql -u root -e "SHOW STATUS LIKE 'wsrep_%'"
mysql -u root -e "SHOW STATUS LIKE 'wsrep_cluster_size'"
Dies zeigt die vitalen Werte des Clusters an.
Als nächstes kommt ein simpler Schriebtest, indem eine Datenbank- und Tabelle erzeugt und mit Werten gefüllt wird.
Auf einem beliebigen Server im Cluster:
mysql -u root -e 'CREATE DATABASE galeratest;'
mysql -u root -e 'CREATE TABLE galeratest.zeugs ( id INT NOT NULL AUTO_INCREMENT, name VARCHAR(50), anzahl INT, farbe VARCHAR(25), PRIMARY KEY(id));'
mysql -u root -e 'INSERT INTO galeratest.zeugs (name, anzahl, farbe) VALUES ("papier", 2, "blau");'
Auf eine, anderen Server wird nun ein zweiter Eintrag angelegt:
mysql -u root -e 'INSERT INTO galeratest.zeugs (name, anzahl, farbe) VALUES ("papier", 5, "weiss");'
Nun kann man mit einer SELECT Query auf allen Servern die Änderung sehen:
# mysql -u root -e 'SELECT * FROM galeratest.zeugs;'
+----+--------+--------+-------+
| id | name | anzahl | farbe |
+----+--------+--------+-------+
| 2 | papier | 2 | blau |
| 4 | papier | 5 | weiss |
+----+--------+--------+-------+
Troubleshooting
Alle Server gestoppt
Wenn alle Server gestoppt sind, muss man beim ersten den Cluster mit galera_new_cluster
den Cluster neu initialisieren, bevor man mariadb wieder startet (was ansonsten fehlschlägt).