Der Autor wählte den Free and Open Source Fund, um eine Spende im Rahmen des Programms Write for DOnations zu erhalten.
Clustering fügt Ihrer Datenbank eine hohe Verfügbarkeit hinzu, indem Änderungen auf verschiedene Server verteilt werden. Falls eine der Instanzen ausfällt, sind andere schnell verfügbar, um den Dienst fortzusetzen.
Cluster gibt es in zwei allgemeinen Konfigurationen: aktiv-passiv und aktiv-aktiv. In Aktiv-Passiv-Clustern werden alle Schreibvorgänge auf einem einzigen aktiven Server ausgeführt und dann auf einen oder mehrere passive Server kopiert, die nur im Falle eines Ausfalls des aktiven Servers übernehmen. Einige Aktiv-Passiv-Cluster ermöglichen auch SELECT
-Operationen auf passiven Knoten. In einem Aktiv-Aktiv-Cluster wird jeder Knoten gelesen und geschrieben, und eine Änderung an einem Knoten wird auf alle repliziert.
MySQL ist ein relationales Open-Source-Datenbankmanagementsystem, das eine gängige Wahl für SQL-Datenbanken ist. Galera ist eine Datenbank-Clustering-Lösung, die es Ihnen ermöglicht, Multi-Master-Cluster durch synchrone Replikation einzurichten. Galera kümmert sich automatisch darum, die Daten auf verschiedenen Knoten synchron zu halten, während Sie Lese- und Schreibabfragen an jeden beliebigen Knoten im Cluster senden kiönnen. Auf der offiziellen Dokumentationsseite können Sie mehr über Galera erfahren.
In dieser Anleitung werden Sie einen MySQL Galera-Aktiv-Aktiv-Cluster konfigurieren. Zu Demonstrationszwecken werden Sie drei Ubuntu 18.04 Droplets konfigurieren und testen, die als Knoten im Cluster fungieren werden. Diese Anzahl von Knoten ist der kleinste konfigurierbare Cluster.
Um mitzumachen, benötigen Sie zusätzlich zu dem Folgenden ein DigitalOcean-Konto:
sudo
-Berechtigungen.
sudo
-Berechtigungen erhalten Sie in unserem Tutorial Ersteinrichtung des Servers mit Ubuntu 18.04.Die Schritte in diesem Tutorial wurden zwar für DigitalOcean-Droplets geschrieben und mit ihnen getestet, aber viele von ihnen sind auch auf Nicht-DigitalOcean-Servern mit aktivierter privater Vernetzung anwendbar.
In diesem Schritt fügen Sie die relevanten MySQL- und Galera-Paket-Repositorys zu jedem Ihrer drei Server hinzu, damit Sie die richtige Version von MySQL und Galera, die in diesem Tutorial verwendet wird, installieren können.
Anmerkung: Codership, das Unternehmen hinter Galera Cluster, pflegt das Galera-Repository, aber seien Sie sich bewusst, dass nicht alle externen Repositorys zuverlässig sind. Stellen Sie sicher, dass Sie nur von vertrauenswürdigen Quellen installieren.
In diesem Tutorial werden Sie MySQL Version 5.7 verwenden. Als Erstes fügen Sie das externe Ubuntu-Repository, das vom Galera-Projekt verwaltet wird, zu allen drei Servern hinzu.
Sobald die Repositorys auf allen drei Servern aktualisiert sind, können Sie MySQL zusammen mit Galera installieren.
Zuerst fügen Sie auf allen drei Servern den Galera-Repository-Schlüssel mit dem Befehl apt-key
hinzu, den der APT-Paketmanager zur Überprüfung der Authentizität des Pakets verwendet:
- sudo apt-key adv --keyserver keyserver.ubuntu.com --recv BC19DDBA
Nach einigen Sekunden erhalten Sie die folgende Ausgabe:
OutputExecuting: /tmp/apt-key-gpghome.RG5cTZjQo0/gpg.1.sh --keyserver keyserver.ubuntu.com --recv BC19DDBA
gpg: key D669017EBC19DDBA: public key "Codership Oy <info@galeracluster.com>" imported
gpg: Total number processed: 1
gpg: imported: 1
Sobald Sie den vertrauenswürdigen Schlüssel in der Datenbank jedes Servers haben, können Sie die Repositorys hinzufügen. Dazu erstellen Sie auf jedem Server eine neue Datei namens galera.list
im Verzeichnis /etc/apt/sources.list.d/
:
- sudo nano /etc/apt/sources.list.d/galera.list
Fügen Sie im Texteditor die folgenden Zeilen hinzu, die dem APT-Paketmanager die entsprechenden Repositorys zur Verfügung stellen:
deb http://releases.galeracluster.com/mysql-wsrep-5.7/ubuntu bionic main
deb http://releases.galeracluster.com/galera-3/ubuntu bionic main
Speichern und schließen Sie die Dateien auf jedem Server (drücken Sie STRG + X
, Y
, dann die EINGABETASTE
).
Die Codership-Repositorys sind nun für alle drei Server verfügbar. Es ist jedoch wichtig, dass Sie apt
anweisen, die Codership-Repositorys anderen vorzuziehen, um sicherzustellen, dass die gepatchten Versionen der Software installiert werden, die zur Erstellung eines Galera-Clusters benötigt werden. Dazu erstellen Sie eine weitere neue Datei namens galera.pref
im Verzeichnis /etc/apt/preferences.d/
jedes Servers:
- sudo nano /etc/apt/preferences.d/galera.pref
Fügen Sie in dem Texteditor die folgende Zeilen hinzu:
# Prefer Codership repository
Package: *
Pin: origin releases.galeracluster.com
Pin-Priority: 1001
Speichern und schließen Sie diese Datei und führen Sie dann den folgenden Befehl auf jedem Server aus, um Paketmanifeste aus den neuen Repositorys aufzunehmen:
- sudo apt update
Nachdem Sie nun erfolgreich das Paket-Repository auf allen drei Servern hinzugefügt haben, können Sie MySQL im nächsten Abschnitt installieren.
In diesem Schritt werden Sie das MySQL-Paket auf Ihren drei Servern installieren.
Führen Sie den folgenden Befehl auf allen drei Servern aus, um eine für die Arbeit mit Galera gepatchte Version von MySQL sowie das Galera-Paket zu installieren.
- sudo apt install galera-3 mysql-wsrep-5.7
Sie werden zur Bestätigung aufgefordert, ob Sie mit der Installation fortfahren möchten. Geben Sie Y
ein, um mit der Installation fortzufahren. Während der Installation werden Sie auch aufgefordert, ein Passwort für den MySQL-Administrator festzulegen. Legen Sie ein sicheres Passwort fest und drücken Sie EINGABETASTE
, um fortzufahren.
Sobald MySQL installiert ist, werden Sie das Standard-AppArmor-Profil deaktivieren, um sicherzustellen, dass Galera gemäß der offiziellen Galera-Dokumentation einwandfrei funktioniert. AppArmor ist ein Kernel-Modul für Linux, das Zugriffskontrollfunktionen für Dienste über Sicherheitsprofile bietet.
Deaktivieren Sie AppArmor, indem Sie auf jedem Server Folgendes ausführen:
- sudo ln -s /etc/apparmor.d/usr.sbin.mysqld /etc/apparmor.d/disable/
Dieser Befehl fügt einen symbolischen Link des MySQL-Profils in das Verzeichnis disable
ein, wodurch das Profil beim Booten deaktiviert wird.
Führen Sie dann den folgenden Befehl aus, um die MySQL-Definition zu entfernen, die bereits in den Kernel geladen wurde.
- sudo apparmor_parser -R /etc/apparmor.d/usr.sbin.mysqld
Wenn Sie MySQL installiert und das AppArmor-Profil auf Ihrem ersten Server deaktiviert haben, wiederholen Sie diese Schritte für Ihre beiden anderen Server.
Nachdem Sie nun MySQL erfolgreich auf jedem der drei Server installiert haben, können Sie mit dem Konfigurationsschritt im nächsten Abschnitt fortfahren.
In diesem Schritt werden Sie Ihren ersten Knoten konfigurieren. Jeder Knoten im Cluster muss eine nahezu identische Konfiguration haben. Aus diesem Grund werden Sie die gesamte Konfiguration auf Ihrem ersten Rechner vornehmen und sie dann auf die anderen Knoten kopieren.
Standardmäßig ist MySQL so konfiguriert, dass das Verzeichnis /etc/mysql/conf.d
überprüft wird, um zusätzliche Konfigurationseinstellungen aus Dateien mit der Endung .cnf
zu erhalten. Erstellen Sie auf Ihrem ersten Server in diesem Verzeichnis eine Datei mit allen Ihren cluster-spezifischen Anweisungen:
- sudo nano /etc/mysql/conf.d/galera.cnf
Fügen Sie die folgende Konfiguration in die Datei ein. Die Konfiguration gibt verschiedene Cluster-Optionen, Details über den aktuellen Server und die anderen Server im Cluster sowie replikationsbezogene Einstellungen an. Beachten Sie, dass die IP-Adressen in der Konfiguration die privaten Adressen Ihrer jeweiligen Server sind; ersetzen Sie die markierten Zeilen durch die entsprechenden IP-Adressen.
[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="test_cluster"
wsrep_cluster_address="gcomm://First_Node_IP,Second_Node_IP,Third_Node_IP"
# Galera Synchronization Configuration
wsrep_sst_method=rsync
# Galera Node Configuration
wsrep_node_address="This_Node_IP"
wsrep_node_name="This_Node_Name"
mysqld
darf nicht an die IP-Adresse für localhost
gebunden sein. Sie können sich über die Einstellungen auf der Galera Cluster System-Konfigurationsseite näher informieren.wsrep_cluster_name
in etwas aussagekräftigeres als test_cluster
ändern oder ihn so belassen, wie er ist, aber Sie müssen wsrep_cluster_address
mit den privaten IP-Adressen Ihrer drei Server aktualisieren.Galera Synchronization Configuration
definiert, wie der Cluster zwischen den Mitgliedern kommunizieren und Daten synchronisieren wird. Dies wird nur für die Statusübertragung verwendet, die stattfindet, wenn ein Knoten online geht. Verwenden Sie für Ihre Ersteinrichtung rsync
, da es allgemein verfügbar ist und das tut, was Sie momentan benötigen.Galera Node Configuration
verdeutlicht die IP-Adresse und den Namen des aktuellen Servers. Dies ist hilfreich, wenn versucht wird, Probleme in den Protokollen zu diagnostizieren und jeden Server auf mehrere Arten zu referenzieren. Die wsrep_node_address
muss mit der Adresse des Rechners, auf dem Sie sich befinden, übereinstimmen, aber Sie können einen beliebigen Namen wählen, um den Knoten in den Protokolldateien zu identifizieren.Wenn Sie mit Ihrer Cluster-Konfigurationsdatei zufrieden sind, kopieren Sie den Inhalt in die Zwischenablage und speichern und schließen Sie die Datei.
Nachdem Sie Ihren ersten Knoten erfolgreich konfiguriert haben, können Sie im nächsten Abschnitt mit der Konfiguration der verbleibenden Knoten fortfahren.
In diesem Schritt konfigurieren Sie die verbleibenden zwei Knoten. Auf Ihrem zweiten Knoten öffnen Sie die Konfigurationsdatei:
- sudo nano /etc/mysql/conf.d/galera.cnf
Fügen Sie die Konfiguration ein, die Sie vom ersten Knoten kopiert haben, und aktualisieren Sie dann die Galera Node Configuration
, um die IP-Adresse oder den auflösbaren Domänennamen für den spezifischen Knoten, den Sie einrichten, zu verwenden. Aktualisieren Sie anschließend seinen Namen, den Sie beliebig festlegen können, um den Knoten in Ihren Protokolldateien zu identifizieren:
. . .
# Galera Node Configuration
wsrep_node_address="This_Node_IP"
wsrep_node_name="This_Node_Name"
. . .
Speichern und schließen Sie die Datei.
Wenn Sie diese Schritte abgeschlossen haben, wiederholen Sie sie auf dem dritten Knoten.
Sie sind fast bereit, den Cluster zu starten, aber vergewissern Sie sich vorher, dass die entsprechenden Ports in Ihrer Firewall geöffnet sind.
In diesem Schritt werden Sie Ihre Firewall so konfigurieren, dass die für die Kommunikation zwischen den Knoten erforderlichen Ports offen sind. Überprüfen Sie auf jedem Server den Status der Firewall, indem Sie Folgendes ausführen:
- sudo ufw status
In diesem Fall wird nur SSH durchgelassen:
OutputStatus: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
Da in diesem Fall nur SSH-Datenverkehr erlaubt ist, müssen Sie Regeln für MySQL- und Galera-Datenverkehr hinzufügen. Wenn Sie versuchen würden, den Cluster zu starten, würde er an diesen Firewall-Regeln scheitern.
Galera kann vier Ports verwenden:
3306
Für MySQL-Client-Verbindungen und State Snapshot Transfer, die die Methode mysqldump
verwenden.4567
Für Galera Cluster-Replikations-Datenverkehr. Die Multicast-Replikation verwendet auf diesem Port sowohl sowohl den UDP- als auch den TCP-Transport.4568
Für inkrementelle Statusübertragungen.4444
Für alle anderen Status-Snapshot-Übertragungen.In diesem Beispiel öffnen Sie während der Einrichtung alle vier Ports. Sobald Sie bestätigt haben, dass die Replikation funktioniert, sollten Sie alle Ports schließen, die Sie nicht tatsächlich verwenden, und den Datenverkehr auf die Server im Cluster beschränken.
Öffnen Sie die Ports mit den folgenden Befehlen:
- sudo ufw allow 3306,4567,4568,4444/tcp
- sudo ufw allow 4567/udp
Anmerkung: Abhängig davon, was sonst noch auf Ihren Servern ausgeführt wird, sollten Sie den Zugriff ggf. sofort einschränken. Der Leitfaden UFW-Grundlagen: Allgemeine Firewall-Regeln und -Befehle kann Ihnen dabei helfen.
Nachdem Sie Ihre Firewall auf dem ersten Knoten konfiguriert haben, erstellen Sie die gleichen Firewall-Einstellungen auf dem zweiten und dritten Knoten.
Nachdem Sie die Firewalls nun erfolgreich konfiguriert haben, können Sie den Cluster im nächsten Schritt starten.
In diesem Schritt starten Sie Ihren MySQL Galera-Cluster. Zuvor aktivieren Sie jedoch den MySQL-Dienst systemd
, sodass MySQL automatisch gestartet wird, wenn der Server neu gestartet wird.
Verwenden Sie den folgenden Befehl auf allen drei Servern, um den MySQL-Dienst systemd
zu aktivieren:
- sudo systemctl enable mysql
Sie sehen die folgende Ausgabe, die zeigt, dass der Dienst erfolgreich mit der Liste der Startdienste verknüpft wurde:
OutputCreated symlink /etc/systemd/system/multi-user.target.wants/mysql.service → /lib/systemd/system/mysql.service.
Nachdem Sie nun mysql
aktiviert haben, sodass er bei einem Systemstart auf allen Servern gestartet wird, sind Sie bereit, mit dem Hochfahren des Clusters fortzufahren.
Um den ersten Knoten hochzufahren, müssen Sie ein spezielles Startskript verwenden. Entsprechend der Konfiguration Ihres Clusters wird jeder Knoten, der online geht, versuchen, sich mit mindestens einem anderen Knoten zu verbinden, der in seiner Datei galera.cnf
angegeben ist, um seinen Anfangsstatus zu erhalten. Ohne die Verwendung des Skripts mysqld_bootstrap
, das es systemd
erlaubt, den Parameter --wsrep-new-cluster
zu übergeben, würde ein normales systemctl start mysql
fehlschlagen, weil keine Knoten ausgeführt werden, mit denen der erste Knoten eine Verbindung herstellen könnte.
Führen Sie Folgendes auf Ihrem ersten Server aus:
- sudo mysqld_bootstrap
Dieser Befehl zeigt bei erfolgreicher Ausführung keine Ausgabe an. Wenn dieses Skript erfolgreich ist, wird der Knoten als Teil des Clusters registriert, und Sie können ihn mit dem folgenden Befehl anzeigen:
- mysql -u root -p -e "SHOW STATUS LIKE 'wsrep_cluster_size'"
Nachdem Sie Ihr Passwort eingegeben haben, sehen Sie die folgende Ausgabe, die anzeigt, dass es einen Knoten im Cluster gibt:
Output+--------------------+-------+
| Variable_name | Value |
+--------------------+-------+
| wsrep_cluster_size | 1 |
+--------------------+-------+
Auf den verbleibenden Knoten können Sie mysql
normal starten. Sie werden nach einem beliebigen Mitglied der Cluster-Liste suchen, das online ist, und wenn sie ein Mitglied finden, werden sie dem Cluster beitreten.
Jetzt können Sie den zweiten Knoten hochfahren. Starten Sie mysql
:
- sudo systemctl start mysql
Bei erfolgreicher Ausführung wird keine Ausgabe angezeigt. Die Größe Ihres Clusters nimmt mit jedem Knoten zu, der online geht:
- mysql -u root -p -e "SHOW STATUS LIKE 'wsrep_cluster_size'"
Sie sehen die folgende Ausgabe, die anzeigt, dass der zweite Knoten dem Cluster beigetreten ist und dass es insgesamt zwei Knoten gibt.
Output+--------------------+-------+
| Variable_name | Value |
+--------------------+-------+
| wsrep_cluster_size | 2 |
+--------------------+-------+
Jetzt ist es an der Zeit, den dritten Knoten hochzufahren. Starten Sie mysql
:
- sudo systemctl start mysql
Führen Sie den folgenden Befehl aus, um die Clustergröße zu ermitteln:
- mysql -u root -p -e "SHOW STATUS LIKE 'wsrep_cluster_size'"
Sie sehen die folgende Ausgabe, die anzeigt, dass der dritte Knoten dem Cluster beigetreten ist und dass die Gesamtzahl der Knoten im Cluster drei beträgt.
Output+--------------------+-------+
| Variable_name | Value |
+--------------------+-------+
| wsrep_cluster_size | 3 |
+--------------------+-------+
Zu diesem Zeitpunkt ist der gesamte Cluster online und kommuniziert erfolgreich. Als Nächstes können Sie sicherstellen, dass die Einrichtung funktioniert, indem Sie im folgenden Abschnitt die Replikation testen.
Sie haben die Schritte bis zu diesem Punkt durchgeführt, so dass Ihr Cluster die Replikation von jedem beliebigen Knoten zu jedem anderen Knoten durchführen kann, die so genannte Aktiv-Aktiv-Replikation. In diesem Schritt werden Sie einen Test durchführen und feststellen, ob die Replikation wie erwartet funktioniert.
Sie beginnen mit Datenbankänderungen in Ihrem ersten Knoten. Die folgenden Befehle erzeugen eine Datenbank namens playground
und eine Tabelle innerhalb dieser Datenbank namens equipment
.
- mysql -u root -p -e 'CREATE DATABASE playground;
- CREATE TABLE playground.equipment ( id INT NOT NULL AUTO_INCREMENT, type VARCHAR(50), quant INT, color VARCHAR(25), PRIMARY KEY(id));
- INSERT INTO playground.equipment (type, quant, color) VALUES ("slide", 2, "blue");'
Im vorhergehenden Befehl wird mit der Anweisung CREATE DATABASE
eine Datenbank mit dem Namen playground
erstellt. Die Anweisung CREATE
erzeugt eine Tabelle mit dem Namen equipment
innerhalb der Datenbank playground
mit einer automatisch inkrementierenden Identifizierungsspalte namens id
und anderen Spalten. Die Spalte type
, die Spalte quant
und die Spalte color
werden definiert, um den Typ, die Anzahl bzw. die Farbe der Ausstattung zu speichern. Die Anweisung INSERT
fügt einen Eintrag von Typ slide
, Anzahl 2
und Farbe blue
ein.
Sie haben nun einen Wert in Ihrer Tabelle.
Schauen Sie sich als Nächstes den zweiten Knoten an, um zu überprüfen, ob die Replikation erfolgreich ist:
- mysql -u root -p -e 'SELECT * FROM playground.equipment;'
Die Daten, die Sie in den ersten Knoten eingegeben haben, werden hier auf dem zweiten Knoten sichtbar sein, wodurch nachgewiesen wird, dass die Replikation funktioniert hat:
Output+----+-------+-------+-------+
| id | type | quant | color |
+----+-------+-------+-------+
| 1 | slide | 2 | blue |
+----+-------+-------+-------+
Schreiben Sie von demselben Knoten aus Daten in den Cluster.
- mysql -u root -p -e 'INSERT INTO playground.equipment (type, quant, color) VALUES ("swing", 10, "yellow");'
Von dem dritten Knoten aus können Sie alle diese Daten durch erneute Abfrage der Tabelle lesen:
- mysql -u root -p -e 'SELECT * FROM playground.equipment;'
Sie sehen die folgende Ausgabe, die die beiden Zeilen zeigt:
Output +----+-------+-------+--------+
| id | type | quant | color |
+----+-------+-------+--------+
| 1 | slide | 2 | blue |
| 2 | swing | 10 | yellow |
+----+-------+-------+--------+
Sie können von diesem Knoten aus wieder einen weiteren Wert hinzufügen:
- mysql -u root -p -e 'INSERT INTO playground.equipment (type, quant, color) VALUES ("seesaw", 3, "green");'
Auf dem ersten Knoten können Sie überprüfen, ob Ihre Daten überall verfügbar sind:
- mysql -u root -p -e 'SELECT * FROM playground.equipment;'
Sie sehen die folgende Ausgabe, die anzeigt, dass die Zeilen auf dem ersten Knoten verfügbar sind.
Output +----+--------+-------+--------+
| id | type | quant | color |
+----+--------+-------+--------+
| 1 | slide | 2 | blue |
| 2 | swing | 10 | yellow |
| 3 | seesaw | 3 | green |
+----+--------+-------+--------+
Sie haben nun erfolgreich verifiziert, dass Sie in alle Knoten schreiben können und dass die Replikation ordnungsgemäß durchgeführt wird.
Jetzt haben Sie einen funktionierenden Galera-Testcluster mit drei Knoten konfiguriert. Wenn Sie planen, einen Galera-Cluster in einer Produktivsituation zu verwenden, wird empfohlen, mit nicht weniger als fünf Knoten zu beginnen.
Vor dem produktiven Einsatz sollten Sie sich einige der anderen Status-Snapshot-Übertragungs-(sst-)Agenten wie xtrabackup ansehen, die es Ihnen ermöglichen, neue Knoten schnell und ohne große Unterbrechungen Ihrer aktiven Knoten einzurichten. Dies wirkt sich nicht auf die eigentliche Replikation aus, ist aber ein Problem bei der Initialisierung von Knoten.
Vielleicht sind Sie auch an anderen Clustering-Lösungen für MySQL interessiert. In diesem Fall können Sie sich unser Tutorial So erstellen Sie ein MySQL Cluster mit mehreren Knoten unter Ubuntu 18.04 ansehen. Wenn Sie eine verwaltete Datenbanklösung ausprobieren möchten, lesen Sie unsere DigitalOcean Dokumentation für verwaltete Datenbanken.
Thanks for learning with the DigitalOcean Community. Check out our offerings for compute, storage, networking, and managed databases.
This textbox defaults to using Markdown to format your answer.
You can type !ref in this text area to quickly search our full set of tutorials, documentation & marketplace offerings and insert the link!