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 mit sudo 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 verfizieren, dass Replikation funktioniert. Somit ist unser MariaDB Cluster nun vollständig einsatzbereit.