Einführung
Durch Clustering wird Ihre Datenbank durch die Verteilung von Änderungen auf verschiedene Server mit hoher Verfügbarkeit versehen. Für den Fall, dass eine der Instanzen ausfällt, stehen andere Instanzen schnell zur Verfügung, um den Betrieb fortzusetzen.
Cluster gibt es in zwei allgemeinen Konfigurationen: Aktiv-Passiv und Aktiv-Aktiv. In Aktiv-Passiv-Clustern 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 eines aktiven Servers die Funktion übernehmen können. Einige Aktiv-Passiv-Cluster erlauben auch SELECT-Operationen an passiven Knoten. In einem Aktiv-Aktiv-Cluster ist jeder Knoten schreib- und lesbar, und eine an einem vorgenommene Änderung wird für alle repliziert.
In diesem Handbuch konfigurieren wir einen Aktiv-Aktiv-MariaDB-Galera-Cluster. Zu Demonstrationszwecken konfigurieren und testen wir drei Knoten, den kleinsten konfigurierbaren Cluster.
Voraussetzungen
Um mitzukommen, benötigen Sie:
-
Three Ubuntu 16.04 servers, jeweils mit einem Nicht-Root-Benutzer mit
sudo
-Berechtigungen und privatem Netzwerk, sofern verfügbar.-
Befolgen Sie unsere Anleitung zuInitial Server Setup with Ubuntu 16.04, um Unterstützung beim Einrichten eines Benutzers mit diesen Berechtigungen zu erhalten.
-
Hilfe zum Einrichten eines privaten Netzwerks finden Sie unterHow To Set Up And Use DigitalOcean Private Networking.
-
Sobald alle diese Voraussetzungen erfüllt sind, können Sie MariaDB installieren.
[[Schritt-1 - Hinzufügen der Mariadb-10-1-Repositorys zu allen Servern]] == Schritt 1 - Hinzufügen der MariaDB 10.1-Repositorys zu allen Servern
MariaDB 10.1 ist nicht in den Standard-Ubuntu-Repositorys enthalten. Daher fügen wir zunächst allen drei Servern das externe Ubuntu-Repository hinzu, das vom MariaDB-Projekt verwaltet wird.
[.note] #Note: MariaDB ist ein angesehener Anbieter, aber nicht alle externen Repositorys sind zuverlässig. Stellen Sie sicher, dass Sie nur von vertrauenswürdigen Quellen installieren.
#
Zuerst fügen wir den MariaDB-Repository-Schlüssel mit dem Befehlapt-key
hinzu, mit dem apt überprüft, ob das Paket authentisch ist.
sudo apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 0xF1656F24C74CD1D8
Sobald wir den vertrauenswürdigen Schlüssel in der Datenbank haben, können wir das Repository hinzufügen. Danach müssen wirapt-get update
ausführen, um Paketmanifeste aus dem neuen Repository aufzunehmen:
sudo add-apt-repository 'deb [arch=amd64,i386,ppc64el] http://nyc2.mirrors.digitalocean.com/mariadb/repo/10.1/ubuntu xenial main'
sudo apt-get update
[.note] #Note: Sie müssen "update" ausführen, nachdem Sie das Repository hinzugefügt haben. Andernfalls installieren Sie Version 10.0 von den Ubuntu-Paketen, die das Galera-Paket nicht enthalten.
#
Sobald die Repositorys auf allen drei Servern aktualisiert wurden, können Sie MariaDB installieren. Eine Sache, die Sie bei MariaDB beachten sollten, ist, dass es als Drop-In-Ersatz für MySQL entstanden ist. In vielen Konfigurationsdateien und Startskripten werden alsomysql
stattmariadb
angezeigt. Aus Gründen der Konsistenz verwenden wir in diesem Handbuchmysql
, wo beides funktionieren könnte.
[[Schritt 2 - Installation von Mariadb auf allen Servern] == Schritt 2 - Installation von MariaDB auf allen Servern
Ab Version 10.1 werden die Pakete MariaDB Server und MariaDB Galera Server kombiniert. Durch die Installation von "Mariadb-Server" werden Galera und mehrere Abhängigkeiten automatisch installiert:
sudo apt-get install mariadb-server
Während der Installation werden Sie aufgefordert, ein Kennwort für den MariaDB-Administrator festzulegen. Unabhängig von Ihrer Auswahl wird dieses Root-Kennwort mit dem Kennwort des ersten Knotens überschrieben, sobald die Replikation beginnt.
Wir sollten über alle erforderlichen Komponenten verfügen, um mit der Konfiguration des Clusters zu beginnen. Da wir uns jedoch in späteren Schritten aufrsync
verlassen, stellen wir sicher, dass er installiert ist.
sudo apt-get install rsync
Dies bestätigt, dass die neueste Version vonrsync
bereits verfügbar ist, oder fordert Sie auf, sie zu aktualisieren oder zu installieren.
Sobald wir MariaDB auf jedem der drei Server installiert haben, können wir mit der Konfiguration beginnen.
[[Schritt 3 - Konfigurieren des ersten Knotens]] == Schritt 3 - Konfigurieren des ersten Knotens
Jeder Knoten im Cluster muss nahezu identisch konfiguriert sein. Aus diesem Grund nehmen wir die gesamte Konfiguration auf unserem ersten Computer vor und kopieren sie dann auf die anderen Knoten.
Standardmäßig ist MariaDB so konfiguriert, dass das Verzeichnis/etc/mysql/conf.d
überprüft wird, um zusätzliche Konfigurationseinstellungen für das Ende in.cnf
zu erhalten. In diesem Verzeichnis erstellen wir eine Datei mit all unseren clusterspezifischen Anweisungen:
sudo nano /etc/mysql/conf.d/galera.cnf
Kopieren Sie die folgende Konfiguration und fügen Sie sie in die Datei ein. Sie müssen die rot hervorgehobenen Einstellungen ändern. Im Folgenden wird erläutert, was die einzelnen Abschnitte bedeuten.
/etc/mysql/conf.d/galera.cnf
[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_ip,second_ip,third_ip"
# Galera Synchronization Configuration
wsrep_sst_method=rsync
# Galera Node Configuration
wsrep_node_address="this_node_ip"
wsrep_node_name="this_node_name"
-
The first section ändert oder bestätigt die MariaDB / MySQL-Einstellungen erneut, damit der Cluster ordnungsgemäß funktioniert. Beispielsweise funktioniert Galera Cluster nicht mit MyISAM oder ähnlichen nicht-transaktionalen Speicher-Engines, und
mysqld
dürfen nicht an die IP-Adresse von localhost gebunden sein. Weitere Informationen zu den Einstellungen finden Sie in den Galera Clustersystem configuration page. -
The “Galera Provider Configuration” section konfiguriert die MariaDB-Komponenten, die eine WriteSet-Replikations-API bereitstellen. Dies bedeutet in unserem Fall Galera, da Galera ein wsrep-Anbieter (WriteSet Replication) ist. Wir geben die allgemeinen Parameter an, um die anfängliche Replikationsumgebung zu konfigurieren. Dies erfordert keine Anpassung, aber Sie können mehr überGalera configuration options erfahren.
-
The “Galera Cluster Configuration” section definiert den Cluster, identifiziert die Clustermitglieder anhand der IP-Adresse oder des auflösbaren Domänennamens und erstellt einen Namen für den Cluster, um sicherzustellen, dass die Mitglieder der richtigen Gruppe beitreten. Sie können
wsrep_cluster_name
in etwas aussagekräftigeres alstest_cluster
ändern oder unverändert lassen, aber Sie aktualisierenmustwsrep_cluster_address
mit den Adressen Ihrer drei Server. Wenn Ihre Server über private IP-Adressen verfügen, verwenden Sie diese hier. -
The “Galera Synchronization Configuration” section definiert, wie der Cluster Daten zwischen Mitgliedern kommuniziert und synchronisiert. Dies wird nur für die Statusübertragung verwendet, die erfolgt, wenn ein Knoten online geschaltet wird. Für unser erstes Setup verwenden wir
rsync
, da es allgemein verfügbar ist und das tut, was wir jetzt brauchen. -
The “Galera Node Configuration” section verdeutlicht die IP-Adresse und den Namen des aktuellen Servers. Dies ist hilfreich, wenn Sie versuchen, Probleme in Protokollen zu diagnostizieren und die einzelnen Server auf verschiedene Arten zu referenzieren. Die
wsrep_node_address
müssen mit der Adresse des Computers übereinstimmen, auf dem Sie sich befinden. Sie können jedoch einen beliebigen Namen auswählen, um den Knoten in Protokolldateien besser identifizieren zu können.
Wenn Sie mit Ihrer Cluster-Konfigurationsdatei zufrieden sind, kopieren Sie den Inhalt in Ihre Zwischenablage, speichern und schließen Sie die Datei.
[[Schritt 4 - Konfigurieren der verbleibenden Knoten]] == Schritt 4 - Konfigurieren der verbleibenden Knoten
Öffnen Sie auf jedem der verbleibenden Knoten 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-Knotenkonfiguration", um die IP-Adresse oder den auflösbaren Domänennamen für den bestimmten Knoten zu verwenden, den Sie einrichten. Aktualisieren Sie abschließend den Namen, den Sie festlegen können, um den Knoten in Ihren Protokolldateien zu identifizieren:
/etc/mysql/conf.d/galera.cnf
. . .
# Galera Node Configuration
wsrep_node_address="this_node_ip"
wsrep_node_name="this_node_name"
. . .
Speichern und beenden Sie die Datei auf jedem Server. Wir sind fast bereit, den Cluster aufzurufen, aber bevor wir dies tun, möchten wir sicherstellen, dass die entsprechenden Ports geöffnet sind.
[[Schritt 5 - Öffnen der Firewall auf jedem Server]] == Schritt 5 - Öffnen der Firewall auf jedem Server
Überprüfen Sie auf jedem Server den Status der Firewall:
sudo ufw status
In diesem Fall ist nur SSH erlaubt durch:
OutputStatus: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
Da in diesem Fall nur SSH-Datenverkehr zulässig ist, müssen Regeln für MySQL- und Galera-Datenverkehr hinzugefügt werden. Wenn wir versuchen, den Cluster zu starten, schlagen wir aufgrund von Firewall-Regeln fehl.
Galera kann vier Ports nutzen:
-
3306 Für MySQL-Client-Verbindungen und Status-Snapshot-Übertragung, die die mysqldump-Methode verwenden.
-
4567 Für den Galera Cluster-Replikationsverkehr verwendet die Multicast-Replikation sowohl UDP-Transport als auch TCP an diesem Port.
-
4568 Für inkrementelle Statusübertragung.
-
4444 Für alle anderen Status-Snapshot-Übertragungen.
In unserem Beispiel öffnen wir alle vier Ports, während wir unsere Einrichtung vornehmen. Sobald wir bestätigt haben, dass die Replikation funktioniert, möchten wir alle Ports schließen, die wir nicht tatsächlich verwenden, und den Datenverkehr auf nur Server im Cluster beschränken.
Öffnen Sie die Ports mit dem folgenden Befehl:
sudo ufw allow 3306,4567,4568,4444/tcp
sudo ufw allow 4567/udp
[.note] #Note: Abhängig davon, was sonst noch auf Ihren Servern ausgeführt wird, möchten Sie möglicherweise den Zugriff sofort einschränken. Die Anleitung zuUFW Essentials: Common Firewall Rules and Commandskann dabei helfen.
#
[[Schritt-6 - Starten des Clusters]] == Schritt 6 - Starten des Clusters
Zunächst müssen wir den laufenden MariaDB-Dienst stoppen, damit unser Cluster online geschaltet werden kann.
Beenden Sie MariaDB auf allen drei Servern:
Verwenden Sie den folgenden Befehl auf allen drei Servern, um mysql zu stoppen, damit wir sie in einem Cluster sichern können:
sudo systemctl stop mysql
systemctl
zeigt nicht das Ergebnis aller Serviceverwaltungsbefehle an. Um sicherzustellen, dass dies erfolgreich war, verwenden wir den folgenden Befehl:
sudo systemctl status mysql
Wenn die letzte Zeile wie folgt aussieht, war der Befehl erfolgreich.
Output . . .
Aug 19 02:55:15 galera-01 systemd[1]: Stopped MariaDB database server.
Sobald wirmysql
auf allen Servern heruntergefahren haben, können wir fortfahren.
Rufe den ersten Knoten auf:
Zum Aufrufen des ersten Knotens benötigen wir ein spezielles Startskript. So wie wir unseren Cluster konfiguriert haben, versucht jeder Knoten, der online geht, eine Verbindung zu mindestens einem anderen Knoten herzustellen, der in seinergalera.cnf
-Datei angegeben ist, um seinen Ausgangszustand zu erhalten. Ohne die Verwendung des Skriptsgalera_new_cluster
, mit dem systemd den Parameter--wsrep-new-cluster
übergeben kann, würde ein normalersystemctl start mysql
fehlschlagen, da keine Knoten ausgeführt werden, mit denen der erste Knoten eine Verbindung herstellen kann.
sudo galera_new_cluster
Wenn dieses Skript erfolgreich ausgeführt wurde, wird der Knoten als Teil des Clusters registriert und mit dem folgenden Befehl angezeigt:
mysql -u root -p -e "SHOW STATUS LIKE 'wsrep_cluster_size'"
Output+--------------------+-------+
| Variable_name | Value |
+--------------------+-------+
| wsrep_cluster_size | 1 |
+--------------------+-------+
Auf den verbleibenden Knoten können wirmysql
normal starten. Sie suchen nach allen Mitgliedern der Cluster-Liste, die online sind. Wenn sie eines finden, treten sie dem Cluster bei.
Rufe den zweiten Knoten auf:
Startmysql
:
sudo systemctl start mysql
Wir sollten feststellen, dass die Clustergröße zunimmt, wenn jeder Knoten online geht:
mysql -u root -p -e "SHOW STATUS LIKE 'wsrep_cluster_size'"
Output+--------------------+-------+
| Variable_name | Value |
+--------------------+-------+
| wsrep_cluster_size | 2 |
+--------------------+-------+
Rufe den dritten Knoten auf:
Startmysql
:
sudo systemctl start mysql
Wenn alles gut funktioniert, sollte die Clustergröße auf drei festgelegt werden:
mysql -u root -p -e "SHOW STATUS LIKE 'wsrep_cluster_size'"
Output+--------------------+-------+
| Variable_name | Value |
+--------------------+-------+
| wsrep_cluster_size | 3 |
+--------------------+-------+
Zu diesem Zeitpunkt sollte der gesamte Cluster online sein und kommunizieren. Bevor wir die Replikation testen, müssen wir uns jedoch noch um ein weiteres Konfigurationsdetail kümmern.
[[Schritt-7 - Konfigurieren des Debian-Wartungsbenutzers]] == Schritt 7 - Konfigurieren des Debian-Wartungsbenutzers
Gegenwärtig führen die MariaDB-Server von Ubuntu und Debian routinemäßige Wartungsarbeiten durch, z. B. die Protokollrotation als spezieller Wartungsbenutzer. Bei der Installation von MariaDB wurden die Anmeldeinformationen für diesen Benutzer zufällig generiert, in/etc/mysql/debian.cnf
gespeichert und in diemysql
-Datenbank der MariaDB eingefügt.
Sobald wir unseren Cluster aufgerufen haben, wurde das Kennwort vom ersten Knoten auf die anderen Knoten repliziert, sodass der Wert indebian.cnf
nicht mehr mit dem Kennwort in der Datenbank übereinstimmt. Dies bedeutet, dass alles, was das Wartungskonto verwendet, versucht, mit dem Kennwort in der Konfigurationsdatei eine Verbindung zur Datenbank herzustellen, und auf allen Knoten außer dem ersten Knoten fehlschlägt.
Um dies zu korrigieren, kopieren wir diedebian.cnf
unseres ersten Knotens auf die verbleibenden Knoten.
Kopieren vom ersten Knoten:
Öffnen Sie diedebian.cnf
-Datei mit Ihrem Texteditor:
sudo nano /etc/mysql/debian.cnf
Die Datei sollte ungefähr so aussehen:
[client]
host = localhost
user = debian-sys-maint
password = 03P8rdlknkXr1upf
socket = /var/run/mysqld/mysqld.sock
[mysql_upgrade]
host = localhost
user = debian-sys-maint
password = 03P8rdlknkXr1upf
socket = /var/run/mysqld/mysqld.sock
basedir = /usr
Kopieren Sie die Informationen in Ihre Zwischenablage.
Aktualisieren Sie den zweiten Knoten:
Öffnen Sie auf Ihrem zweiten Knoten dieselbe Datei:
sudo nano /etc/mysql/debian.cnf
Trotz der Warnung oben in der Datei mit der Aufschrift „NICHT BERÜHREN!“ Müssen wir die Änderung vornehmen, damit der Cluster funktioniert. Sie können die aktuellen Informationen sicher löschen und den Inhalt aus der Konfiguration des ersten Knotens einfügen. Sie sollten jetzt genau gleich sein. Speichern und schließen Sie die Datei.
Aktualisieren Sie den dritten Knoten:
Öffnen Sie auf Ihrem dritten Knoten dieselbe Datei:
sudo nano /etc/mysql/debian.cnf
Löschen Sie die aktuellen Informationen und fügen Sie den Inhalt aus der Konfiguration des ersten Knotens ein. Speichern und schließen Sie die Datei.
Die Nichtübereinstimmung hätte unsere Fähigkeit zum Testen der Replikation nicht beeinträchtigt. Es ist jedoch empfehlenswert, frühzeitig darauf zu achten, um spätere Fehler zu vermeiden.
[.Hinweis]##
Note: Nachdem Sie fertig sind, können Sie testen, ob das Wartungskonto eine Verbindung herstellen kann, indem Sie das Kennwort von den lokalendebian.conf
wie folgt eingeben:
sudo cat /etc/mysql/debian.cnf
Kopieren Sie das Passwort aus der Ausgabe. Stellen Sie dann eine Verbindung zumysql
her:
mysql -u debian-sys-maint -p
Geben Sie an der Eingabeaufforderung das von Ihnen kopierte Kennwort ein. Wenn Sie eine Verbindung herstellen können, ist alles in Ordnung.
Ist dies nicht der Fall, überprüfen Sie, ob das Kennwort in der Datei mit dem ersten Knoten identisch ist, und ersetzen Sie Folgendes:
update mysql.user set password=PASSWORD('password_from_debian.cnf') where User='debian-sys-maint';
Wiederholen Sie diesen Vorgang, um die verbleibenden Knoten zu testen.
[[Schritt 8 - Testen der Replikation]] == Schritt 8 - Testen der Replikation
Wir haben die Schritte bis zu diesem Punkt durchlaufen, damit unser Cluster die Replikation von einem beliebigen Knoten auf einen anderen Knoten ausführen kann, der als Aktiv-Aktiv- oder Master-Master-Replikation bezeichnet wird. Testen wir, ob die Replikation wie erwartet funktioniert.
Schreiben Sie an den ersten Knoten:
Wir beginnen mit Datenbankänderungen auf unserem ersten Knoten. Mit den folgenden Befehlen wird eine Datenbank mit dem Namenplayground
und eine Tabelle mit dem Namenequipment
erstellt.
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");'
Wir haben jetzt einen Wert in unserer Tabelle.
Lesen und Schreiben auf dem zweiten Knoten:
Als Nächstes überprüfen wir anhand des zweiten Knotens, ob die Replikation funktioniert:
mysql -u root -p -e 'SELECT * FROM playground.equipment;'
Wenn die Replikation funktioniert, werden die Daten, die wir auf dem ersten Knoten eingegeben haben, hier auf dem zweiten Knoten angezeigt:
Output+----+-------+-------+-------+
| id | type | quant | color |
+----+-------+-------+-------+
| 1 | slide | 2 | blue |
+----+-------+-------+-------+
Von demselben Knoten aus können wir Daten in den Cluster schreiben:
mysql -u root -p -e 'INSERT INTO playground.equipment (type, quant, color) VALUES ("swing", 10, "yellow");'
Lesen und Schreiben auf dem dritten Knoten:
Vom dritten Knoten können wir alle diese Daten lesen, indem wir erneut Folgendes abfragen:
mysql -u root -p -e 'SELECT * FROM playground.equipment;'
Output +----+-------+-------+--------+
| id | type | quant | color |
+----+-------+-------+--------+
| 1 | slide | 2 | blue |
| 2 | swing | 10 | yellow |
+----+-------+-------+--------+
Wieder können wir einen weiteren Wert von diesem Knoten hinzufügen:
mysql -u root -p -e 'INSERT INTO playground.equipment (type, quant, color) VALUES ("seesaw", 3, "green");'
Lesen Sie auf dem ersten Knoten:
Zurück auf dem ersten Knoten können wir überprüfen, ob unsere Daten überall verfügbar sind:
mysql -u root -p -e 'SELECT * FROM playground.equipment;'
Output +----+--------+-------+--------+
| id | type | quant | color |
+----+--------+-------+--------+
| 1 | slide | 2 | blue |
| 2 | swing | 10 | yellow |
| 3 | seesaw | 3 | green |
+----+--------+-------+--------+
Wir haben getestet, dass wir auf alle Knoten schreiben können und dass die Replikation ordnungsgemäß ausgeführt wird.
Fazit
Zu diesem Zeitpunkt sollte ein funktionierender Galera-Testcluster mit drei Knoten konfiguriert sein. Wenn Sie vorhaben, einen Galera-Cluster in einer Produktionssituation zu verwenden, wird empfohlen, mit mindestens fünf Knoten zu beginnen.
Vor der Verwendung in der Produktion sollten Sie sich einigeother state snapshot transfer (sst) agentswie "xtrabackup" ansehen, mit denen Sie sehr schnell und ohne große Unterbrechungen Ihrer aktiven Knoten neue Knoten einrichten können. Dies hat keine Auswirkungen auf die tatsächliche Replikation, ist jedoch ein Problem, wenn Knoten initialisiert werden.
Wenn sich Ihre Clustermitglieder nicht in einem privaten Netzwerk befinden, müssen Sie außerdemSSL einrichten, um Ihre Daten beim Wechsel zwischen Servern zu schützen.