MySQL-Master-Slave-Replikation auf derselben Maschine

Veröffentlicht: 2022-03-11

Die MySQL-Replikation ist ein Prozess, der es ermöglicht, Daten von einem MySQL-Datenbankserver (dem Master) automatisch auf einen oder mehrere MySQL-Datenbankserver (die Slaves) zu kopieren. Es wird normalerweise verwendet, um den Lesezugriff für die Skalierbarkeit auf mehrere Server zu verteilen, obwohl es auch für andere Zwecke verwendet werden kann, z. B. für Failover oder die Analyse von Daten auf dem Slave, um den Master nicht zu überlasten.

Da die Master-Slave-Replikation eine einseitige Replikation ist (vom Master zum Slave), wird nur die Master-Datenbank für die Schreiboperationen verwendet, während die Leseoperationen auf mehrere Slave-Datenbanken verteilt werden können. Das bedeutet, dass bei Verwendung der Master-Slave-Replikation als Scale-out-Lösung mindestens zwei Datenquellen definiert sein müssen, eine für Schreibvorgänge und die zweite für Lesevorgänge.

MySQL-Master-Slave-Replikation

MySQL-Entwickler arbeiten normalerweise nur auf einem Rechner und neigen dazu, ihre gesamte Entwicklungsumgebung auf diesem einen Rechner zu haben, mit der Logik, dass sie nicht von einem Netzwerk oder einer Internetverbindung abhängig sind. Wenn eine Master-Slave-Replikation erforderlich ist, weil sie beispielsweise die Replikation in einer Entwicklungsumgebung testen müssen, bevor sie Änderungen an anderer Stelle bereitstellen, müssen sie sie auf demselben Computer erstellen. Während die Einrichtung einer einzelnen MySQL-Instanz ziemlich einfach ist, müssen wir uns etwas mehr Mühe geben, um eine zweite und dann eine Master-Slave-Replikation einzurichten.

Für dieses Schritt-für-Schritt-Tutorial habe ich Ubuntu Linux als Host-Betriebssystem ausgewählt, und die bereitgestellten Befehle gelten für dieses Betriebssystem. Wenn Sie Ihre MySQL-Master-Slave-Replikation auf einem anderen Betriebssystem einrichten möchten, müssen Sie Änderungen an den spezifischen Befehlen vornehmen. Die allgemeinen Prinzipien zum Einrichten der MySQL-Master-Slave-Replikation auf demselben Computer sind jedoch für alle Betriebssysteme gleich.

MySQL-Master-Slave-Replikation

Installation der ersten MySQL-Instanz

Wenn Sie bereits eine Instanz der MySQL-Datenbank auf Ihrem Computer installiert haben, können Sie diesen Schritt überspringen.

Der einfachste Weg, MySQL auf Ubuntu zu installieren, besteht darin, den folgenden Befehl von einer Terminal-Eingabeaufforderung aus auszuführen:

 sudo apt-get install mysql-server

Während des Installationsvorgangs werden Sie aufgefordert, ein Passwort für den MySQL root Benutzer festzulegen.

mysqld_multi

Um zwei MySQL-Instanzen auf derselben Maschine effizient zu verwalten, müssen wir mysqld_multi verwenden.

Der erste Schritt beim Einrichten von mysqld_multi ist die Erstellung von zwei separaten [mysqld] -Gruppen in der bestehenden my.cnf -Datei. Der Standardspeicherort der my.cnf -Datei auf Ubuntu ist /etc/mysql/ . Öffnen Sie also die Datei my.cnf mit Ihrem bevorzugten Texteditor und benennen Sie die vorhandene Gruppe [mysqld [mysqld] in [mysqld1] . Diese umbenannte Gruppe wird für die Konfiguration der ersten MySQL-Instanz verwendet und auch als Master-Instanz konfiguriert. Da bei der MySQL-Master-Slave-Replikation jede Instanz ihre eigene eindeutige server-id haben muss, fügen Sie die folgende Zeile in der Gruppe [mysqld1] :

 server-id = 1

Da wir für die zweite MySQL-Instanz eine separate [mysqld] -Gruppe benötigen, kopieren Sie die [mysqld1] -Gruppe mit allen aktuellen Konfigurationen und fügen Sie sie unten in dieselbe my.cnf -Datei ein. Benennen Sie nun die kopierte Gruppe in [mysqld2] um und nehmen Sie die folgenden Änderungen in der Konfiguration für den Slave vor:

 server-id = 2 port = 3307 socket = /var/run/mysqld/mysqld_slave.sock pid-file = /var/run/mysqld/mysqld_slave.pid datadir = /var/lib/mysql_slave log_error = /var/log/mysql_slave/error_slave.log relay-log = /var/log/mysql_slave/relay-bin relay-log-index = /var/log/mysql_slave/relay-bin.index master-info-file = /var/log/mysql_slave/master.info relay-log-info-file = /var/log/mysql_slave/relay-log.info read_only = 1

Um die zweite MySQL-Instanz als Slave einzurichten, setzen Sie die server-id auf 2, da sie sich von der Server-ID des Masters unterscheiden muss.

Da beide Instanzen auf demselben Computer ausgeführt werden, setzen Sie den port für die zweite Instanz auf 3307 , da er sich von dem für die erste Instanz verwendeten Port unterscheiden muss, der standardmäßig 3306 ist.

Damit diese zweite Instanz dieselben MySQL-Binärdateien verwenden kann, müssen wir unterschiedliche Werte für socket , pid-file , datadir und log_error .

Wir müssen außerdem relay-log aktivieren, um die zweite Instanz als Slave zu verwenden (Parameter relay-log , relay-log-index und relay-log-info-file ) sowie master-info-file setzen.

Um die Slave-Instanz schließlich schreibgeschützt zu machen, wird der Parameter read_only auf 1 gesetzt. Sie sollten mit dieser Option vorsichtig sein, da sie Änderungen auf dem Slave nicht vollständig verhindert. Selbst wenn read_only auf 1 gesetzt ist, werden Aktualisierungen nur von Benutzern zugelassen, die über die Berechtigung SUPER verfügen. MySQL hat kürzlich den neuen Parameter super_read_only eingeführt, um zu verhindern, dass SUPER -Benutzer Änderungen vornehmen. Diese Option ist ab Version 5.7.8 verfügbar.

Abgesehen von den Gruppen [mysqld1] und [mysqld2] müssen wir der Datei my.cnf auch eine neue Gruppe [mysqld_multi] hinzufügen:

 [mysqld_multi] mysqld = /usr/bin/mysqld_safe mysqladmin = /usr/bin/mysqladmin user = multi_admin password = multipass

Sobald wir die zweite MySQL-Instanz installiert und beide gestartet haben, werden wir dem multi_admin Benutzer die entsprechenden Berechtigungen erteilen, um MySQL-Instanzen herunterfahren zu können.

Erstellen Sie neue Ordner für die zweite MySQL-Instanz

Im vorherigen Schritt haben wir die Konfigurationsdatei für die zweite MySQL-Instanz vorbereitet. In dieser Konfigurationsdatei werden zwei neue Ordner verwendet. Die folgenden Linux-Befehle sollten verwendet werden, um diese Ordner mit den entsprechenden Berechtigungen zu erstellen:

 mkdir -p /var/lib/mysql_slave chmod --reference /var/lib/mysql /var/lib/mysql_slave chown --reference /var/lib/mysql /var/lib/mysql_slave mkdir -p /var/log/mysql_slave chmod --reference /var/log/mysql /var/log/mysql_slave chown --reference /var/log/mysql /var/log/mysql_slave

Zusätzliche Sicherheitseinstellungen in AppArmor

In einigen Linux-Umgebungen sind AppArmor-Sicherheitseinstellungen erforderlich, um die zweite MySQL-Instanz auszuführen. Zumindest sind sie unter Ubuntu erforderlich.

Um AppArmor richtig einzurichten, bearbeiten Sie die Datei /etc/apparmor.d/usr.sbin.mysqld mit Ihrem bevorzugten Texteditor und fügen Sie die folgenden Zeilen hinzu:

 /var/lib/mysql_slave/ r, /var/lib/mysql_slave/** rwk, /var/log/mysql_slave/ r, /var/log/mysql_slave/* rw, /var/run/mysqld/mysqld_slave.pid rw, /var/run/mysqld/mysqld_slave.sock w, /run/mysqld/mysqld_slave.pid rw, /run/mysqld/mysqld_slave.sock w,

Nachdem Sie die Datei gespeichert haben, starten Sie den Computer neu, damit diese Änderungen wirksam werden.

Installation der zweiten MySQL-Instanz

Für die Installation der zweiten MySQL-Instanz können verschiedene Ansätze verfolgt werden. Der in diesem Tutorial vorgestellte Ansatz verwendet dieselben MySQL-Binärdateien wie der erste, wobei für die zweite Installation separate Datendateien erforderlich sind.

Da wir in den vorherigen Schritten bereits die Konfigurationsdatei und die notwendigen Ordner und Sicherheitsänderungen vorbereitet haben, ist der abschließende Installationsschritt der zweiten MySQL-Instanz die Initialisierung des MySQL-Datenverzeichnisses.

Führen Sie den folgenden Befehl aus, um das neue MySQL-Datenverzeichnis zu initialisieren:

 mysql_install_db --user=mysql --datadir=/var/lib/mysql_slave

Sobald das MySQL-Datenverzeichnis initialisiert ist, können Sie beide MySQL-Instanzen mit dem Dienst mysqld_multi :

 mysqld_multi start

Legen Sie das root Passwort für die zweite MySQL-Instanz fest, indem mysqladmin mit dem entsprechenden Host und Port verwenden. Denken Sie daran, wenn Host und Port nicht angegeben sind, verbindet sich mysqladmin standardmäßig mit der ersten MySQL-Instanz:

 mysqladmin --host=127.0.0.1 --port=3307 -u root password rootpwd

Im obigen Beispiel habe ich das Passwort auf „rootpwd“ gesetzt, aber es wird empfohlen, ein sichereres Passwort zu verwenden.

Zusätzliche Konfiguration von mysqld_multi

Am Ende des Abschnitts „Einrichten von mysqld_multi“ habe ich geschrieben, dass wir dem multi_admin Benutzer später die entsprechenden Rechte geben werden, also ist jetzt die Zeit dafür. Wir müssen diesem Benutzer in beiden Instanzen die entsprechenden Berechtigungen erteilen, also verbinden wir uns zuerst mit der ersten Instanz:

 mysql --host=127.0.0.1 --port=3306 -uroot -p

Führen Sie nach der Anmeldung die folgenden beiden Befehle aus:

 mysql> GRANT SHUTDOWN ON *.* TO 'multi_admin'@'localhost' IDENTIFIED BY 'multipass'; mysql> FLUSH PRIVILEGES;

Beenden Sie den MySQL-Client und verbinden Sie sich mit der zweiten Instanz:

 mysql --host=127.0.0.1 --port=3307 -uroot -p

Führen Sie nach der Anmeldung dieselben beiden Befehle wie oben aus:

 mysql> GRANT SHUTDOWN ON *.* TO 'multi_admin'@'localhost' IDENTIFIED BY 'multipass'; mysql> FLUSH PRIVILEGES;

Verlassen Sie den MySQL-Client.

Beide MySQL-Instanzen automatisch beim Booten starten

Der letzte Schritt beim Einrichten von mysqld_multi ist die Installation des automatischen Boot-Skripts in der init.d .

Erstellen Sie dazu eine neue Datei mit dem Namen mysqld_multi in /etc/init.d und geben Sie ihr die entsprechenden Berechtigungen:

 cd /etc/init.d touch mysqld_multi chmod +x /etc/init.d/mysqld_multi

Öffnen Sie diese neue Datei mit Ihrem bevorzugten Texteditor und kopieren Sie das folgende Skript:

 #!/bin/sh ### BEGIN INIT INFO # Provides: scriptname # Required-Start: $remote_fs $syslog # Required-Stop: $remote_fs $syslog # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: Start daemon at boot time # Description: Enable service provided by daemon. ### END INIT INFO bindir=/usr/bin if test -x $bindir/mysqld_multi then mysqld_multi="$bindir/mysqld_multi"; else echo "Can't execute $bindir/mysqld_multi"; exit; fi case "$1" in 'start' ) "$mysqld_multi" start $2 ;; 'stop' ) "$mysqld_multi" stop $2 ;; 'report' ) "$mysqld_multi" report $2 ;; 'restart' ) "$mysqld_multi" stop $2 "$mysqld_multi" start $2 ;; *) echo "Usage: $0 {start|stop|report|restart}" >&2 ;; esac

Fügen Sie den Dienst mysqld_multi mit dem folgenden Befehl zu den Standard- runlevels hinzu:

 update-rc.d mysqld_multi defaults

Starten Sie Ihren Computer neu und überprüfen Sie, ob beide MySQL-Instanzen ausgeführt werden, indem Sie den folgenden Befehl verwenden:

 mysqld_multi report

Richten Sie die Master-Slave-Replikation ein

Wenn nun zwei MySQL-Instanzen auf demselben Rechner laufen, richten wir die erste Instanz als Master und die zweite als Slave ein.

Ein Teil der Konfiguration wurde bereits im Kapitel „mysqld_multi einrichten“ durchgeführt. Die einzige verbleibende Änderung in der my.cnf -Datei ist das Einstellen der binären Protokollierung auf dem Master. Bearbeiten Sie dazu die Datei my.cnf mit den folgenden Änderungen und Ergänzungen in der Gruppe [mysqld1] :

 log_bin = /var/log/mysql/mysql-bin.log innodb_flush_log_at_trx_commit = 1 sync_binlog = 1 binlog-format = ROW

Starten Sie die Master-MySQL-Instanz neu, damit diese Änderungen wirksam werden:

 mysqld_multi stop 1 mysqld_multi start 1

Damit sich der Slave mit den richtigen Replikationsberechtigungen mit dem Master verbinden kann, sollte auf dem Master ein neuer Benutzer erstellt werden. Stellen Sie mithilfe des MySQL-Clients mit dem entsprechenden Host und Port eine Verbindung zur Masterinstanz her:

 mysql -uroot -p --host=127.0.0.1 --port=3306

Erstellen Sie einen neuen Benutzer für die Replikation:

 mysql> CREATE USER 'replication'@'%' IDENTIFIED BY 'replication'; mysql> GRANT REPLICATION SLAVE ON *.* TO 'replication'@'%';

Verlassen Sie den MySQL-Client.

Führen Sie folgenden Befehl aus, um einen Dump der Stammdaten zu erstellen:

 mysqldump -uroot -p --host=127.0.0.1 --port=3306 --all-databases --master-data=2 > replicationdump.sql

Hier verwenden wir die Option --master-data=2 , um einen Kommentar mit einer CHANGE MASTER -Anweisung in der Sicherungsdatei zu haben. Dieser Kommentar gibt die Replikationskoordinaten zum Zeitpunkt der Sicherung an, und wir benötigen diese Koordinaten später für die Aktualisierung der Master-Informationen in der Slave-Instanz. Hier ist das Beispiel dieses Kommentars:

 -- -- Position to start replication or point-in-time recovery from -- -- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=349;

Importieren Sie den Dump, den Sie im vorherigen Schritt erstellt haben, in die Slave-Instanz:

 mysql -uroot -p --host=127.0.0.1 --port=3307 < replicationdump.sql

Damit sich die Slave-Instanz schließlich mit der Master-Instanz verbinden kann, müssen die Master-Informationen auf dem Slave mit den entsprechenden Verbindungsparametern aktualisiert werden.

Verbinden Sie sich mit dem MySQL-Client mit dem entsprechenden Host und Port mit der Slave-Instanz:

 mysql -uroot -p --host=127.0.0.1 --port=3307

Führen Sie den folgenden Befehl aus, um die Master-Informationen zu aktualisieren (entnehmen Sie die Replikationskoordinaten aus der Speicherauszugsdatei replicationdump.sql , wie oben erläutert):

 mysql> CHANGE MASTER TO -> MASTER_HOST='127.0.0.1', -> MASTER_USER='replication', -> MASTER_PASSWORD='replication', -> MASTER_LOG_FILE='mysql-bin.000001', -> MASTER_LOG_POS=349;

Führen Sie folgenden Befehl aus, um den Slave zu starten:

 mysql> START SLAVE;

Führen Sie den folgenden Befehl aus, um zu überprüfen, ob die Replikation ausgeführt wird:

 mysql> SHOW SLAVE STATUS \G

Glückwünsche. Ihre MySQL-Master-Slave-Replikation auf demselben Computer ist jetzt erfolgreich eingerichtet.

MySQL-Master-Slave-Replikation

Einpacken

Eine in Ihrer Entwicklungsumgebung konfigurierte Master-Slave-Replikation ist hilfreich, wenn Sie sie für eine horizontal skalierbare Lösung in der Produktionsumgebung benötigen. Auf diese Weise verfügen Sie auch über separate Datenquellen, die für Schreib- und Lesevorgänge konfiguriert sind, sodass Sie vor der weiteren Bereitstellung lokal testen können, ob alles wie erwartet funktioniert.

Darüber hinaus möchten Sie möglicherweise mehrere Slave-Instanzen auf derselben Maschine konfigurieren, um den Load Balancer zu testen, der die Lesevorgänge auf mehrere Slaves verteilt. In diesem Fall können Sie dasselbe Handbuch verwenden, um andere Slave-Instanzen einzurichten, indem Sie dieselben Schritte wiederholen.