Wir wollen uns in diesem Beitrag näher mit der Erstellung eines Galera-Clusters beschäftigen und dessen Funktionsweise näher beleuchten. Hierfür werden wir ein Aktiv-Aktiv-Galera-Cluster mittels des open Source Datenbankensystems MariaDB erstellen und dieses auf drei Ubuntu 18.4 Server bereitstellen. Die Ubuntu Server dienen hier als Knoten, wobei drei Knoten das kleinste konfigurierbare Cluster darstellen. Bevor wir beginnen, verlieren wir kurz ein paar Worte über Clustering im Allgemeinen und im Speziellen über Galera Clustering.
Mit der Hilfe von Clustering können wir, durch das Verteilen von Änderungen auf verschiedene Server, die Verfügbarkeit unserer Datenbanken deutlich erhöhen. So sind, im Falle einer fehlgeschlagenen Instanz, sofort andere Replikate dieser Verfügbar, wodurch der Arbeitsfluss nicht unterbrochen wird.
Solche Cluster sind im Allgemeinen in zwei Konfigurationen aufgeteilt:
Innerhalb eines Aktiv-Passiv-Clusters werden alle Schreibvorgänge auf einem einzelnen aktiven Server ausgeführt und dann auf einen oder mehrere passive Server kopiert, die nur bei einem Ausfall des aktiven Servers die Kontrolle übernehmen können. Bei einigen Aktiv-Passiv-Clustern sind auch SELECT
Operationen auf passiven Knoten möglich.
Bei einem Aktiv-Aktiv-Cluster wird jeder Knoten schreibgeschützt und eine vorgenommene Änderung auf alle anderen Knoten repliziert.
Bei Galera Clustering handelt es sich um eine Datenbank-Clustering-Lösung, mit der ein Multi-Master-Cluster mittels der synchronen Replikation eingerichtet werden kann. Galera übernimmt hier automatisch die Synchronisierung der Daten auf verschiedenen Knoten, während weiterhin Lese- sowie Schreibabfragen an alle Knoten innerhalb des Clusters gesendet werden können.
Weitere Informationen zu Galera Clustering können in der offiziellen Dokumentation eingesehen werden.
Nachdem wir uns etwas mit den Grundbegriffen dieses Artikels vertraut gemacht haben, kümmern wir uns nun um die nötigen Vorbereitungen, damit wir mit der Erstellung unseres Clusters beginnen können. Wir benötigen für unser Cluster drei Ubuntu 18.4 Server, die folgendermaßen konfiguriert werden müssen:
Private Networking
muss aktiviert seinroot
Benutzer mit sudo
Privilegien verfügenNachdem wir unsere Ubuntu Server konfiguriert haben, beginnen wir mit dem Erstellen des Clusters.
In diesem ersten Schritt wollen wir unsere Ubuntu Server für die MariaDB Installation vorbereiten. Wir wollen für unser Beispiel MariaDB Version 10.4
verwenden, welche nicht in den Standart Ubuntu Repositories enthalten ist. Aus diesem Grund müssen wir vor der Installation alle relevanten MariaDB Page Repositories manuell hinzufügen.
Als ersten Schritt müssen wir einen MariaDB Repository Schlüssel hinzufügen, was wir mit folgendem Kommando erledigen können:
sudo apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 0xF1656F24C74CD1D8
hinzufügen.
Haben wir den Schlüssel erfolgreich in unsere Datenbank hinzugefügt, können wir das Repository mit
sudo add-apt-repository 'deb [arch=amd64] http://nyc2.mirrors.digitalocean.com/mariadb/repo/10.4/Ubuntu buster main'
hinzufügen.
Anschließend führen wir das Kommando
sudo apt update
aus, um so die Paket Manifeste des neuen Repositories einzufügen.
Haben wir diesen Schritt auf unserem ersten Server ausgeführt, wiederholen wir den gesamten Vorgang für die weiteren Server unseres Clusters.
Hierbei ist zu beachten, dass MariaDB ursprünglich als Drop-In-Ersatz für MySQL entstanden ist. Aus diesem Grund wird in vielen Konfigurationsdateien und Startskripten anstatt von MariaDB, MySQL angezeigt.
Nachdem wir nun das Paket Repository auf unseren Servern erfolgreich hinzugefügt haben, können wir mit der Installation von MariaDB beginnen.
In diesem Schritt werden wir nun die tatsächlichen MariaDB Pakete auf allen Servern installieren. Ab der Version 10.1
sind die Pakete von MariaDB und Galera Server kombiniert, weshalb wir mit dem Kommando
sudo apt install mariadb-server
automatisch MariaDB und Galera mit allen zugehörigen Abhängigkeiten installieren können.
Ab der Version 10.4
hat der root
MariaDB Benutzer standardmäßig kein Passwort. Dieses können wir setzen, wenn wir uns zunächst bei MariaDB einloggen:
sudo mysql -uroot
Sind wir nun in der MariaDB Shell, können wir das Passwort mit folgendem Kommando ändern:
set password = password("Passwort");
Wurde das Passwort erfolgreich gesetzt, erhalten wir folgenden Output:
Mit dem Kommando
quit;
können wir die MariaDB Shell wieder verlassen.
Wir stellten jedoch sicher, dass die neueste Version von rsync
auf unserem Server installiert ist. Wir werden auf die Benutzung von rsync
im folgenden noch zu sprechen kommen.
Hierfür führen wir das Kommando
sudo apt install rsync
aus.
Nachdem wir all diese Schritte erfolgreich ausgeführt haben, wiederholen wir diese noch einmal für unser weiteren Server.
In diesem Schritt werden wir nun unsere erste Node konfigurieren. Da jede Node in unserem Cluster eine nahezu identische Konfiguration erfordert, können wir die Konfiguration für unsere erste Node für die späteren Nodes übernehmen.
Standardmäßig überprüft MariaDB das Verzeichnis /etc/mqsql/conf.d
für zusätzliche Konfigurationseinstellungen. Diese haben die Dateiendung .cnf
. Mit dem Kommando
sudo nano /etc/mysql/conf.d/galera.cnf
erstellen wir nun eine Datei in diesem Verzeichnis, um hier unsere clusterspezifischen Anweisungen zu speichern.
Dieser Datei fügen wir folgende Konfiguration hinzu:
[mysqld]
binlog_format=ROW
default-storage-engine=innodb
innodb_autoinc_lock_mode=2
bind-address=0.0.0.0
# Galera Provider Konfiguration
wsrep_on=ON
wsrep_provider=/usr/lib/galera/libgalera_smm.so
# Galera Cluster Konfiguration
wsrep_cluster_name="test_cluster"
wsrep_cluster_address="gcomm://First_Node_IP,Second_Node_IP,Third_Node_IP"
# Galera Synchronisation Konfiguration
wsrep_sst_method=rsync
# Galera Node Konfiguration
wsrep_node_address="This_Node_IP"
wsrep_node_name="This_Node_Name"
In dieser Konfiguration spezifizieren wir verschiedene Cluster Optionen sowie Details über die Server des Clusters. In Zeile 13 müssen die privaten Adressen der Server angeben werden.
Nachdem wir nun unsere erste Node erfolgreich konfiguriert haben, können wir mit der Konfiguration der weiteren Nodes fortfahren.
In diesem Abschnitt werden wir nun die übrigen zwei Nodes konfigurieren. Hierfür öffnen wir auf unserer zweiten Node die Konfigurationsdatei:
sudo nano /etc/mysql/conf.d/galera.cnf
Hier fügen wir einfach die Konfiguration ein, die wir bereits für unsere erste Node vorgenommen haben. Um nun die IP-Adresse oder einen von uns konfigurierten Domänennamen für diese Node zu verwenden, aktualisieren wir die Galera-Knotenkonfiguration. Abschließend aktualisieren wir den Namen, um unsere Node im Nachhinein in unseren Protokolldateien zu identifizieren:
# Galera Node Configuration
wsrep_node_address="This_Node_IP"
wsrep_node_name="This_Node_Name"
Nachdem wir diesen Schritt abgeschlossen haben, wiederholen wir diesen für unsere letzte Node.
Als nächstes ist es wichtig, dass wir die Firewalls unserer Server so konfigurieren, dass alle Ports, die für die Kommunikation der einzelnen Server untereinander, geöffnet sind. Den Status der Firewall können wir auf jedem Server mit dem Kommando
sudo ufw status
prüfen.
Da für ein Galera Cluster SSH Verkehr verboten ist, müssen wir hier nun manuell die nötigen Ports öffnen. Die erledigen wir mit folgendem Kommando:
sudo ufw allow 3306,4567,4568,4444/tcp
sudo ufw allow 4567/udp
Haben wir auch diese Konfiguration erfolgreich abgeschlossen, wiederholen wir diesen Schritt wie gewohnt für die zwei übrigen Ubuntu Server.
Nachdem wir nun die Firewall korrekt konfiguriert haben, sind wir nun endlich bereit, unser Cluster zu starten.
In diesem Schritt werden wir nun endlich unser MariaDB Cluster starten. Hierfür müssen wir zunächst den laufenden MariaDB Dienst stoppen. Diesen Schritt müssen wir selbstverständlich wieder auf allen drei Server durchführen.
Um den MariaDB Dienst zu stoppen, führen wir folgenden Befehl auf jedem Ubuntu Server aus:
sudo systemctl stop mysql
Um zu prüfen ob unser Stoppen erfolgreich war, führen wir folgendes Kommando aus:
sudo systemctl status mysql
Bei erfolgreichem Stoppen, sollten die letzten zwei Zeilen der Ausgabe so aussehen:
So wie wir unser Cluster konfiguriert haben, wird jede Node, nachdem sie online geschaltet wurde, versuchen eine Verbindung zu einer anderen Node, spezifiziert in unserer galera.cnf
Datei, herzustellen. Da es sich hierbei aber um unsere erste Node handelt, und demnach keine weiteren Nodes online sind, benötigen wir das Startup Skript galera_new_cluster
, um die erste Node zu starten. Wir führen das Skript mit dem Kommando:
sudo galera_new_cluster
aus.
War das Ausführen des Skripts erfolgreich, wird die Node als Teil unseres Clusters registriert. Wir können dies mit dem Kommando
mysql -u root -p -e "SHOW STATUS LIKE 'wsrep_cluster_size'"
prüfen. Wir erhalten folgende Ausgabe, und können sehen dass unsere Node erfolgreich in das Cluster aufgenommen wurde:
Da sich nun eine Node in unserem Cluster befindet, können wir die zwei weiteren Server ohne das Startup Skript aufnehmen.
Hierfür starten wir auf unserem zweiten Server MySQL:
sudo systemctl start mysql
Und erneut prüfen wir mit
mysql -u root -p -e "SHOW STATUS LIKE 'wsrep_cluster_size'"
Selbige Schritte führen wir nun für unsere letzte Node durch und können sehen, dass unser Cluster nun alle drei Nodes aufgenommen hat:
Unser Cluster wurde also erfolgreich erstellt.
Nachdem wir unser Cluster erfolgreich erstellt haben, wollen einmal Replikation testen. Hierfür erstellen wir auf unserer ersten Node eine Datenbank. Wir nennen diese TestDB
und erstellen in dieser eine Table namens Test_Table
.
mysql -u root -p -e 'CREATE DATABASE TestDB;
CREATE TABLE TestDB.Test_Table ( id INT NOT NULL AUTO_INCREMENT, name VARCHAR(50), team VARCHAR(50), score INT, PRIMARY KEY(id));
INSERT INTO TestDB.Test_Table (name, team, score) VALUES ("Achim", "Blau, 5);'
Um nun zu verifizieren ob Replikation funktioniert, prüfen wir unsere Zweite Node und schauen, ob sich der Table und die Datenbank auch hier befinden. Hierfür führen das Kommando
mysql -u root -p -e 'SELECT * FROM TestDB.Test_Table;'
Und tatsächlich befindet sich auch hier unsere Datenbank:
Nun können wir auf dieser Node weitere Änderungen an unserer Datenbank vornehmen:
mysql -u root -p -e 'INSERT INTO TestDB.Test_Table (name, team, score) VALUES ("Thomas", "Rot", 10);'
Prüfen wir die Datenbank nun auf unserer dritten Node, können wir auch hier unsere Änderungen sehen:
Wir konnten also erfolgreich verifizieren, dass Replikation funktioniert. Somit ist unser MariaDB Cluster nun vollständig einsatzbereit.
Kontaktieren Sie uns gerne über das
Kontaktformular und vereinbaren ein unverbindliches
Beratungsgespräch mit unseren Berater:innen zur
Bedarfsevaluierung. Gemeinsam optimieren wir Ihre
Umgebung und steigern Ihre Performance!
Wir freuen uns auf Ihre Kontaktaufnahme!