Galera MariaDB Ubuntu
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.
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:
- Aktiv-Passiv und
- Aktiv-Aktiv
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.
Galera Clustering
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.
Vorbereitungen
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 sein- Jeder Server muss über einen nicht-
root
Benutzer mitsudo
Privilegien verfügen
Nachdem wir unsere Ubuntu Server konfiguriert haben, beginnen wir mit dem Erstellen des Clusters.
Schritt 1 – MariaDB Repositories zu allen Ubuntu Servern hinzufügen
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.
Schritt 2 – MariaDB auf allen Servern installieren
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.
Schritt 3 – Konfigurieren der ersten Node
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.
- Im ersten Abschnitt der Konfigurationsdatei werden die MariaDB – MySQL Einstellungen festgelegt, sodass das Cluster ordnungsgemäß funktionieren kann. Beispielsweise kann Galere nicht korrekt mit MyISAM oder ähnlichen nicht-tranksaktionalen Speicher-Engines.
- Galera Provider Konfiguration – In diesem Abschnitt werden die MariaDB Komponenten konfiguriert.
- Galera Cluster Konfiguration – Hier werden die Cluster Mitglieder anhand ihrer IP-Adresse oder auflösbaren Domänennamens spezifiziert und ein Name für das Cluster festgelegt.
- Galera Synchronisation Konfiguration – Hier spezifizieren wir, wie das Cluster Daten zwischen Mitgliedern kommuniziert und synchronisiert. Dies wird nur für die Statusübertragung verwendet, wenn eine Node online geschaltet wird.
- Galera Node Konfiguration – In dem letzten Abschnitt wird die IP-Adresse und der Name des aktuellen Servers erläutert. Dies ist besonders dann hilfreich, wenn Probleme anhand von Protokollen diagnostiziert werden müssen. Die wsrep_node_address muss mit der Adresse des Computers übereinstimmen, auf welchem wir das Cluster ausführen. Der wsrep_node_name kann jedoch einen beliebigen Namen enthalten, da es hierbei lediglich darum geht die Node innerhalb einer Protokolldatei besser identifizieren zu können.
Nachdem wir nun unsere erste Node erfolgreich konfiguriert haben, können wir mit der Konfiguration der weiteren Nodes fortfahren.
Schritt 4 – Konfigurieren der übrigen Nodes
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.
Schritt 5 – Öffnen der Firewall auf allen Servern
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
- 3306 – Für MySQL Client Verbindungen und Status-Snapshot Transfer
- 4567 – Für den Galera Cluster Replikationsverkehr. Multicast Replication nutzt sowohl einen UPD, als auch einen TCP Port, weshalb wir diesen zwei Mal konfigurieren
- 4568 – Für den Incremental State Transfer
- 4444 – Für den gesamten Status Snapshot Transfer
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.
Schritt 6 – Das Cluster 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.
Schritt 7 – Replikation
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.
Unsere Expert:innen stehen Ihnen bei allen Fragen rund um Ihre IT Infrastruktur zur Seite.
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!
55118 Mainz
info@madafa.de
+49 6131 3331612
Freitags: