So konfigurieren Sie einen Galera-Cluster mit MySQL 5.6 unter Ubuntu 16.04

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 fehlschlägt, sind bereits andere verfügbar, um die Bereitstellung 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 auf 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-aktiven MySQL Galera-Cluster. Zu Demonstrationszwecken konfigurieren und testen wir drei Knoten, den kleinsten konfigurierbaren Cluster.

Voraussetzungen

Um mitzumachen, benötigen Sie drei Ubuntu 16.04-Server mit jeweils:

  • * Mindestens 1 GB RAM *. Es ist unbedingt erforderlich, genügend Speicher für Ihren Datensatz bereitzustellen, um Leistungseinbußen und Abstürze zu vermeiden. Die Speichernutzung für Cluster ist schwer vorherzusagen, lassen Sie also genügend Speicher zu.

  • * ein Nicht-Root-Benutzer mit "+ sudo +" - Berechtigungen *. Dies kann in unserem Initial Server Setup with Ubuntu 16.04 -Handbuch konfiguriert werden.

  • * Eine einfache Firewall aktiviert *. Befolgen Sie den letzten Schritt unseres Initial Server Setup with Ubuntu 16.04 -Handbuchs, um dies mit + ufw + zu konfigurieren .

  • * Private Networking *, sofern es Ihnen zur Verfügung steht. Konfigurieren Sie dies, indem Sie unserem Leitfaden unter Einrichten und Verwenden von DigitalOcean Private Networking folgen.

Sobald alle diese Voraussetzungen erfüllt sind, können Sie die Software installieren.

Schritt 1 - Hinzufügen des Galera-Repositorys zu allen Servern

MySQL, das so gepatcht wurde, dass es Galera-Clustering enthält, ist in den Ubuntu-Standardrepositorys nicht enthalten. Daher werden wir zunächst die externen Ubuntu-Repositorys, die vom Galera-Projekt verwaltet werden, allen drei Servern hinzufügen.

Fügen Sie auf jedem Server den Repository-Schlüssel mit dem Befehl "+ apt-key" hinzu, mit dem "+ app" überprüft, ob die Pakete authentisch sind.

sudo apt-key adv --keyserver keyserver.ubuntu.com --recv BC19DDBA

Sobald wir den vertrauenswürdigen Schlüssel in der Datenbank jedes Servers haben, können wir die Repositorys hinzufügen. Erstellen Sie dazu auf jedem Server eine neue Datei mit dem Namen "+ galera.list " in der Datei " /etc/appt/sources.list.d/ +":

sudo nano /etc/apt/sources.list.d/galera.list

Fügen Sie im Texteditor die folgenden Zeilen hinzu, um dem APT-Paketmanager die entsprechenden Repositorys zur Verfügung zu stellen:

/etc/apt/sources.list.d/galera.list

Speichern und schließen Sie die Datei (drücken Sie + CTRL + X +, + Y + und dann + ENTER +).

Die Codership-Repositorys stehen jetzt allen drei Servern zur Verfügung. Es ist jedoch wichtig, dass Sie "+ apt " anweisen, die Codership-Repositorys anderen vorzuziehen, um sicherzustellen, dass die gepatchten Versionen der Software installiert werden, die zum Erstellen eines Galera-Clusters erforderlich sind. Erstellen Sie dazu eine weitere neue Datei mit dem Namen " galera.pref " im Verzeichnis " / etc / apt / preferences.d / +":

sudo nano /etc/apt/preferences.d/galera.pref

Fügen Sie dem Texteditor die folgenden Zeilen hinzu:

/etc/apt/preferences.d/galera.pref

# Prefer Codership repository
Package: *
Pin: origin releases.galeracluster.com
Pin-Priority: 1001

Speichern und schließen Sie diese Datei und führen Sie dann "+ sudo apt-get update" aus, um Paketmanifeste aus den neuen Repositorys einzuschließen:

sudo apt-get update

Möglicherweise wird eine Warnung angezeigt, dass die Signatur "+ einen schwachen Digest-Algorithmus (SHA1) +" verwendet. Es gibt ein offenes Problem auf GitHub, um dieses Problem zu beheben. In der Zwischenzeit können Sie fortfahren.

Sobald die Repositorys auf allen drei Servern aktualisiert wurden, können Sie MySQL und Galera installieren.

Schritt 2 - Installieren von MySQL und Galera auf allen Servern

Führen Sie den folgenden Befehl auf allen drei Servern aus, um eine für Galera gepatchte Version von MySQL sowie Galera und verschiedene Abhängigkeiten zu installieren:

sudo apt-get install galera-3 galera-arbitrator-3 mysql-wsrep-5.6

Während der Installation werden Sie aufgefordert, ein Kennwort für den MySQL-Administrator festzulegen.

Wir sollten alle notwendigen Teile haben, um mit der Konfiguration des Clusters zu beginnen. Da wir uns jedoch in späteren Schritten auf "+ rsync +" verlassen, sollten wir sicherstellen, dass es auch auf allen drei installiert ist:

sudo apt-get install rsync

Dadurch wird bestätigt, dass die neueste Version von "+ rsync +" bereits verfügbar ist. Sie werden aufgefordert, die vorhandene Version zu aktualisieren oder sie zu installieren.

Sobald wir MySQL auf jedem der drei Server installiert haben, können wir mit der Konfiguration beginnen.

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 MySQL so konfiguriert, dass es das Verzeichnis "+ / etc / mysql / conf.d " überprüft, um zusätzliche Konfigurationseinstellungen von Dateien zu erhalten, die auf " .cnf +" enden. In diesem Verzeichnis erstellen wir eine Datei mit all unseren clusterspezifischen Anweisungen:

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

Fügen Sie der Datei die folgende Konfiguration hinzu. Sie müssen die rot hervorgehobenen Einstellungen ändern. Im Folgenden wird erläutert, was die einzelnen Abschnitte bedeuten.

/etc/mysql/conf.d/galera.cnf auf dem ersten 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="test_cluster"
wsrep_cluster_address="gcomm://,,"

# Galera Synchronization Configuration
wsrep_sst_method=rsync

# Galera Node Configuration
wsrep_node_address=""
wsrep_node_name=""
  • * Im ersten Abschnitt * werden die MySQL-Einstellungen geändert oder neu festgelegt, damit der Cluster ordnungsgemäß funktioniert. Galera Cluster funktioniert beispielsweise nicht mit MyISAM oder ähnlichen nicht-transaktionsbezogenen Speicher-Engines, und "+ mysqld +" darf nicht an die IP-Adresse für localhost gebunden sein. Weitere Informationen zu den Einstellungen finden Sie auf der Galera Cluster-Seite system configuration page.

  • * Der Abschnitt "Galera Provider-Konfiguration" * konfiguriert die MySQL-Komponenten, die eine Replikations-API mit Schreibzugriff bereitstellen. Dies bedeutet in unserem Fall Galera, da Galera ein wsrep-Anbieter (Write-Set Replication) ist. Wir geben die allgemeinen Parameter an, um die anfängliche Replikationsumgebung zu konfigurieren. Hierfür ist keine Anpassung erforderlich. Weitere Informationen finden Sie unter Galera configuration options.

  • * Der Abschnitt "Galera-Cluster-Konfiguration" * definiert den Cluster, identifiziert die Cluster-Mitglieder 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 als + test_cluster + ändern oder es so lassen, aber Sie müssen + wsrep_cluster_address + mit den Adressen Ihrer drei Server aktualisieren. Wenn Ihre Server über private IP-Adressen verfügen, verwenden Sie diese hier.

  • * Der Abschnitt "Konfiguration der Galera-Synchronisierung" * definiert, wie der Cluster Daten zwischen Mitgliedern austauscht 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.

  • * Der Abschnitt "Galera-Knotenkonfiguration" * erläutert 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. Das "+ wsrep_node_address +" muss mit der Adresse des Computers übereinstimmen, auf dem Sie sich befinden. Sie können jedoch einen beliebigen Namen auswählen, um den Knoten in den Protokolldateien leichter identifizieren zu können.

Wenn Sie mit Ihrer Cluster-Konfigurationsdatei zufrieden sind, kopieren Sie den Inhalt in Ihre Zwischenablage und speichern und schließen Sie die Datei.

Nachdem der erste Server konfiguriert wurde, fahren wir mit den nächsten beiden Knoten fort.

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=""
wsrep_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

Ü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)

Möglicherweise gibt es andere Regeln oder gar keine Firewall-Regeln. Da in diesem Fall nur SSH-Datenverkehr zulässig ist, müssen Sie Regeln für MySQL- und Galera-Datenverkehr hinzufügen.

Galera kann vier Ports nutzen:

  • + 3306 + wird für MySQL-Client-Verbindungen und State Snapshot Transfer verwendet, die die mysqldump-Methode verwenden.

  • + 4567 + wird von Galera Cluster für den Replikationsverkehr verwendet. Die Multicast-Replikation verwendet sowohl UDP-Transport als auch TCP an diesem Port.

  • + 4568 + wird für die inkrementelle Statusübertragung verwendet.

  • + 4444 + wird für alle anderen Status-Snapshot-Übertragungen verwendet.

In unserem Beispiel öffnen wir alle vier Ports, während wir unsere Einrichtung vornehmen. Sobald wir bestätigt haben, dass die Replikation funktioniert, schließen wir alle Ports, die wir tatsächlich nicht verwenden, und beschränken den Datenverkehr auf Server im Cluster.

Öffnen Sie die Ports mit dem folgenden Befehl:

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

Schritt 6 - Starten des Clusters

Zunächst müssen wir den laufenden MySQL-Dienst stoppen, damit unser Cluster online geschaltet werden kann.

Stoppen Sie MySQL 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 Dienstverwaltungsbefehle an. Um sicherzugehen, dass dies erfolgreich war, führen Sie den folgenden Befehl aus:

sudo systemctl status mysql

Wenn die letzte Zeile wie folgt aussieht, war der Befehl erfolgreich.

Output. . .
Sep 02 22:17:56 galera-02 systemd[1]: Stopped LSB: start and stop MySQL.

Sobald wir "+ mysql" auf allen Servern heruntergefahren haben, können wir fortfahren.

Rufe den ersten Knoten auf:

Wie wir unseren Cluster konfiguriert haben, versucht jeder Knoten, der online geht, eine Verbindung zu mindestens einem anderen Knoten herzustellen, der in der Datei "+ galera.cnf " angegeben ist, um seinen Anfangszustand zu erhalten. Ein normales " systemctl start mysql" würde fehlschlagen, da für den ersten Knoten, mit dem eine Verbindung hergestellt werden soll, keine Knoten ausgeführt werden. Daher müssen wir den Parameter "+ wsrep-new-cluster" an den ersten Knoten übergeben, den wir starten. Weder + systemd + noch + service + akzeptieren derzeit das Argument https://github.com/codership/mysql-wsrep/issues/266 [+ - wsrep-new-cluster +]. Daher müssen wir den ersten Knoten mit dem Startskript in + / etc / init.d + starten. Sobald Sie dies getan haben, können Sie die verbleibenden Knoten mit "+ systemctl. +" Starten

sudo /etc/init.d/mysql start --wsrep-new-cluster

Wenn dieses Skript abgeschlossen ist, 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 restlichen Knoten können wir + mysql 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:

Starte + mysql:

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:

Starte + mysql:

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. Damit können wir die Replikation zwischen den einzelnen Knoten des Clusters testen.

Schritt 7 - Testen der Replikation

Wir haben die Schritte bis zu diesem Punkt durchlaufen, damit unser Cluster die Replikation von jedem Knoten zu jedem anderen Knoten durchführen kann, der als Aktiv-Aktiv-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. Die folgenden Befehle erstellen eine Datenbank mit dem Namen "+ playground " und eine Tabelle mit dem Namen " 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");'

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 die Datenbank erneut 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.

Bevor Sie mit der Produktion beginnen, sollten Sie einen Blick auf einige der andere Status-Snapshot-Transfer-Agenten (sst) werfen, die Ihnen das Einrichten ermöglichen neue Knoten sehr schnell und ohne große Unterbrechungen zu Ihren aktiven Knoten. Dies hat keine Auswirkungen auf die tatsächliche Replikation, ist jedoch ein Problem, wenn Knoten initialisiert werden. Zum Schutz Ihrer Daten während des Transports zwischen Servern sollten Sie außerdem die Verschlüsselung SSL einrichten.