Galera Cluster: MariaDB-Cluster auf Ubuntu 20.04 einrichten

Das Einrichten eines MariaDB-Clusters mit Galera Cluster verbessert die Ausfallsicherheit und vereinfacht die Skalierung Ihrer Datenbank. In unserem Tutorial zeigen wir Ihnen, wie Sie einen Galera-Cluster auf Ubuntu 20.04 installieren.

Galera-Cluster MariaDB: Das sind die Voraussetzungen

Um einen MariaDB-Galera-Cluster auf Ubuntu 20.04 zu installieren, müssen Sie die folgenden Voraussetzungen erfüllen:

  • Mehrere Server: Es sind mindestens drei Server oder virtuelle Maschinen erforderlich, um einen Cluster aufzubauen. Alle Server sollten auf demselben Netzwerk sein.
  • Root-Rechte: Sie benötigen Root-Zugriff oder zumindest administrative Rechte auf den Servern.

Schritt-für-Schritt-Anleitung: Galera-Cluster MariaDB auf Ubuntu 20.04

Ein MariaDB-Galera-Cluster ist eine praktische Datenbanklösung, die hohe Verfügbarkeit, Datenintegrität und Skalierbarkeit für anspruchsvolle Anwendungen bietet. In dieser Schritt-für-Schritt-Anleitung führen wir Sie durch den Prozess der Einrichtung eines MariaDB-Galera-Clusters auf Ubuntu 20.04. Bevor Sie beginnen, stellen Sie sicher, dass Sie mindestens drei Server oder virtuelle Maschinen zur Verfügung haben, um den Cluster aufzubauen.

Schritt 1: Pakete aktualisieren

Sie sollten zuerst Ihr Ubuntu-System auf den neuesten Stand bringen. Dies ist essenziell, damit Sie aktuelle Pakete und Sicherheitsupdates haben.

Öffnen Sie ein Terminal und führen Sie den folgenden Befehl aus, um die Paketquellen zu aktualisieren:

sudo apt update
shell

Installieren Sie alle verfügbaren Updates:

sudo apt upgrade -y
shell

Es ist empfehlenswert, dass Sie auch veraltete oder ungenutzte Pakete entfernen, um die Server zu bereinigen:

sudo apt autoremove -y
shell

Schritt 2: MariaDB auf den Servern installieren

Installieren Sie nun MariaDB auf jedem Ihrer Server. Seit Version 10.1 sind auch die Galera-Pakete neben MariaDB-Server enthalten.

sudo apt install mariadb-server
shell

Nach der Installation können Sie den MariaDB-Dienst starten:

sudo systemctl start mariadb
shell

Mit dem folgenden Kommando stellen Sie ein, dass MariaDB bei jedem Neustart des Systems automatisch aktiviert wird:

sudo systemctl enable mariadb
shell

Prüfen Sie, ob MariaDB läuft:

sudo systemctl status mariadb
shell

Sie sollten außerdem einige grundlegende Sicherheitseinstellungen vornehmen und die Datenbank konfigurieren. Starten Sie dazu den Einrichtungsassistenten:

sudo mysql_secure_installation
shell

Der Assistent führt Sie durch die Schritte, etwa das Setzen eines Root-Passworts, das Entfernen anonymer User oder das Entfernen der Testdatenbank.

Enter current password for root (enter for none): 
Switch to unix_socket authentication [Y/n] n
Change the root password? [Y/n] Y
New password:
Re-enter new password:
Remove anonymous users? [Y/n] Y
Disallow root login remotely? [Y/n] Y
Remove test database and access to it? [Y/n] Y
Reload privilege tables now? [Y/n] Y
shell

Das Skript fragt zunächst nach dem aktuellen Root-Passwort. Wenn Sie zum ersten Mal MariaDB unter Ubuntu 20.04 installieren, drücken Sie einfach die Eingabetaste und geben Sie dann ein neues Passwort ein.

Schritt 3: Galera-Cluster MariaDB Nodes konfigurieren

Erstellen Sie eine cnf-Datei im Verzeichnis /etc/mysql/conf.d auf jedem Knoten, um die Galera-spezifischen Einstellungen festzulegen.

nano /etc/mysql/conf.d/galera.cnf
shell

Die Datei beinhaltet allgemeine Datenbankeinstellungen, wie das binäre Protokollformat und die Standard-Speicher-Engine. Zudem enthält sie Konfigurationen für den Galera-Cluster, einschließlich des Cluster-Namens und der Cluster-Adresse.

Fügen Sie folgende Zeilen für den ersten Knoten ein:

[mysqld]
binlog_format=ROW
default-storage-engine=innodb
innodb_autoinc_lock_mode=2
bind-address=0.0.0.0
wsrep_on=ON
wsrep_provider=/usr/lib/galera/libgalera_smm.so
# Galera Cluster Configuration
wsrep_cluster_name="galera_cluster"
wsrep_cluster_address="gcomm://node_1-ip-address,node_2-ip-address,node_3-ip-address"
# Galera Synchronization Configuration
wsrep_sst_method=rsync
# Galera Node Configuration
wsrep_node_address="node_1-ip-address"
wsrep_node_name="node_1"
shell
  • Allgemeine Datenbankeinstellungen: Dazu gehören Einstellungen wie binlog_format=ROW für das Format der binären Protokolle und default-storage-engine=innodb für die Standard-Speicher-Engine.
  • Galera-Provider-Konfiguration: Einstellungen wie wsrep_on=ON dienen dazu, die Galera-Replikation zu aktivieren und wsrep_provider=/usr/lib/galera/libgalera_smm.so, um den Pfad zur Galera-Bibliothek anzugeben.
  • Galera-Cluster-Konfiguration: Diese umfasst den Cluster-Namen (wsrep_cluster_name) und die Cluster-Adresse (wsrep_cluster_address), die die IP-Adressen oder Hostnamen der Knoten im Cluster enthält.
  • Galera-Synchronisation: Konfiguriert die Methode für den State Snapshot Transfer (SST), z. B. wsrep_sst_method=rsync.
  • Galera-Knoten-Konfiguration: Definiert die IP-Adresse oder den Hostnamen des aktuellen Knotens (wsrep_node_address) sowie den Namen des Knotens (wsrep_node_name).

Nachdem Sie die Datei gespeichert haben, erstellen Sie eine für den zweiten Knoten:

[mysqld]
binlog_format=ROW
default-storage-engine=innodb
innodb_autoinc_lock_mode=2
bind-address=0.0.0.0
# Galera Provider Configuration
wsrep_on=ON
wsrep_provider=/usr/lib/galera/libgalera_smm.so
# Galera Cluster Configuration
wsrep_cluster_name="galera_cluster"
wsrep_cluster_address="gcomm://node_1-ip-address,node_2-ip-address,node_3-ip-address"
# Galera Synchronization Configuration
wsrep_sst_method=rsync
# Galera Node Configuration
wsrep_node_address="node_2-ip-address"
wsrep_node_name="node_2"
shell

Fahren Sie nun mit dem letzten Knoten fort:

[mysqld]
binlog_format=ROW
default-storage-engine=innodb
innodb_autoinc_lock_mode=2
bind-address=0.0.0.0
# Galera Provider Configuration
wsrep_on=ON
wsrep_provider=/usr/lib/galera/libgalera_smm.so
# Galera Cluster Configuration
wsrep_cluster_name="galera_cluster"
wsrep_cluster_address="gcomm://node_1-ip-address,node_2-ip-address,node_3-ip-address"
# Galera Synchronization Configuration
wsrep_sst_method=rsync
# Galera Node Configuration
wsrep_node_address="node_3-ip-address"
wsrep_node_name="node_3"
shell

Schritt 4: Firewall auf Servern ändern

Da die Knoten miteinander über bestimmte Ports kommunizieren, müssen Sie die Firewall-Einstellungen anpassen.

Öffnen Sie die nachfolgenden Ports in Ihrer Firewall:

  • Port 3306: Dies ist der Standardport für MariaDB. Er wird für die Datenbankkommunikation und -anfragen verwendet.
  • Galera-Ports: Zusätzlich zum Standardport 3306 benutzt Galera auch andere Ports für die interne Kommunikation zwischen den Knoten. Der Standardbereich für Galera-Ports liegt in der Regel bei 4567, 4568 und 4444 für den State Snapshot Transfer (SST).

Sie können die Firewall-Einstellungen auf Ihrem Ubuntu-Server mit dem folgenden Befehl festlegen:

sudo ufw allow 3306,4567,4568,4444/tcp
sudo ufw allow 4567/udp
shell

Schritt 5: Galera-Cluster MariaDB starten

Beenden Sie den MariaDB-Dienst, falls er bereits läuft:

sudo systemctl stop mariadb
shell

Dieser Befehl startet den MariaDB-Server und initialisiert einen neuen Galera-Cluster auf dem ersten Knoten:

sudo galera_new_cluster
shell

Prüfen Sie die Anzahl der Knoten im Cluster:

mysql -u root -p -e "SHOW STATUS LIKE 'wsrep_cluster_size'"
shell

Sie sollten folgende Ausgabe erhalten:

+---------------------------+-------------+
| Variable_name        | Value       |
+--------------------------+--------------+
| wsrep_cluster_size | 1              |
+--------------------------+------------ -+
shell

Der erste Knoten wurde erfolgreich gestartet.

Aktivieren Sie den zweiten Knoten:

systemctl start mariadb
shell

Kontrollieren Sie, ob sich die Anzahl der Knoten erhöht hat:

mysql -u root -p -e "SHOW STATUS LIKE 'wsrep_cluster_size'"
shell

In der Konsole sehen wir:

+---------------------------+-------------+
| Variable_name        | Value       |
+--------------------------+--------------+
| wsrep_cluster_size | 2               |
+--------------------------+--------------+
shell

Nun starten wir den dritten Knoten:

systemctl start mariadb
shell

Schauen Sie, ob der Knoten ordnungsgemäß läuft:

mysql -u root -p -e "SHOW STATUS LIKE 'wsrep_cluster_size'"
shell

Es sollten sich jetzt drei Nodes im Cluster befinden:

+---------------------------+-------------+
| Variable_name        | Value       |
+--------------------------+--------------+
| wsrep_cluster_size | 3              |
+--------------------------+------------ -+
shell

Schritt 6: Replikation testen

Stellen Sie sicher, dass Sie eine Verbindung zu jedem Knoten im Cluster herstellen können. Verwenden Sie den MariaDB-Client, um sich als Root-User oder als eine andere Benutzerin bzw. ein anderer Benutzer mit ausreichenden Rechten anzumelden.

mysql -u root -p
shell

Erstellen Sie eine neue Testdatenbank auf einem der Knoten im Cluster:

CREATE DATABASE test_db;
sql

Melden Sie sich bei den anderen Knoten an und überprüfen Sie, ob die Testdatenbank vorhanden ist:

SHOW DATABASES;
sql

Die Testdatenbank sollte in der Liste der Datenbanken erscheinen:

+-------------------------------+
| Database                        |
+-------------------------------+
| information_schema   |
| mysql                              |
| performance_schema |
| test_db                          | 
| sys                                  |
+------------------------------+
sql

Fügen Sie eine neue Testtabelle in der Testdatenbank hinzu:

USE test_db;
CREATE TABLE test_table (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(50)
);
sql

Geben Sie einige Testdaten in die Spalte name der Testtabelle ein:

INSERT INTO test_table (name) VALUES ('Alice'), ('Bob'), ('Charlie');
sql

Kontrollieren Sie auf den anderen Knoten, ob die Testtabelle und die eingefügten Daten übernommen wurden:

USE test_db;
SELECT * FROM test_table;
sql

Die Ausgabe zeigt uns die Liste der Personen mit ihren Namen und der ID an:

+----+-----------+
| id | name    |
+----+-----------+
| 1  | Alice     |
| 2  | Bob       |
| 3  | Charlie |
+----+----------+
sql

So aktualisieren Sie einen Datensatz in der Testtabelle:

UPDATE test_table SET name = 'David' WHERE name = 'Alice';
sql

Probieren Sie, einen Datensatz zu löschen:

DELETE FROM test_table WHERE name = 'Bob';
sql

Überprüfen Sie auf den anderen Knoten, ob die Aktualisierungen und Löschungen repliziert wurden:

SELECT * FROM test_table;
sql

Die Änderungen erscheinen erfolgreich auf jedem Knoten:

+----+------------+
| id | name     |
+----+-----------+
| 1  | David    |
| 3  | Charlie  |
+----+-----------+
sql