Sie können Ihre MySQL-Server-Datenbank automatisch auf andere MySQL-Datenbank-Server spiegeln, indem Sie die Replikationsfunktion von MySQL verwenden. Sie lernen die Grundlagen der MySQL-Replikation und die Konfiguration einer replizierten MySQL-Datenbankumgebung kennen.
Dies ist eine Einführung, wie man dies in Ubuntu einrichtet. Getestet am Ubuntu 18.04 und 16.04.
Es gibt einen Master-Server (in diesem Beispiel: 192.168.0.1), der über unsere Datenbank verfügt, die repliziert (gespiegelt) wird. Der Master-Server speichert alle ausgeführten Datenbankbefehle ("CREATE", "INSERT", "UPDATE",...) in seiner binären Protokolldatei (mysql-bin.log).
Der/die Slave-Server (in diesem Beispiel: 192.168.0.10) sind mit dem Master-Server verbunden. Der Slave-Server liest die binäre Protokolldatei des Master-Servers und kopiert die Daten von dort in die Relay-Protokolldatei (mysql-relay-bin) des Slave-Servers. Die Ereignisse und Befehle der Relay-Protokolldatei werden dann Schritt für Schritt auf dem Datenbankserver des Slave-Servers ausgeführt.
Es kann mehrere Slave-Server, aber nur einen Master-Server geben. Die Slave-Server haben keine Schreibrechte auf die Datenbank des Master-Servers, sondern nur Replikationsprivilegien.
Verwendung
Ein replizierter Datenbankserver kann zum Beispiel zur Lastverteilung Ihrer Datenbank verwendet werden. Der Lastausgleich in MySQl kann mit der Proxy-Software "HaProxy" realisiert werden.
Ihr HaProxy-Proxyserver ist mit allen verwendeten Datenbankservern verbunden. Der Zugriff auf den Datenbankserver erfolgt über "HaProxy", der Sie dann mit einem laufenden Datenbankserver verbindet.
Anfragen an den Datenbankserver werden auf verschiedene konfigurierte, laufende Datenbankserver verteilt. Der Proxy-Server überprüft auch, ob Ihre MySQL-Server laufen, indem er das Modul "mysql-check" verwendet.
Dieses Tutorial behandelt jedoch nur die Erstellung einer replizierten Datenbankserver-Umgebung. Sie können dann zusätzlich einen lastverteilenden Proxy hinzufügen oder Sie können den Slave-Datenbankserver als Backup verwenden, um Ihre Datenbankdaten schneller wiederherzustellen.
Hinweis: Bitte überprüfen Sie, ob der MySQL-Port 3306 in allen verwendeten Datenbankservern geöffnet ist (Firewall-Einstellungen).
1. Installieren Sie MySQL sowohl auf dem Master-Server als auch auf dem Slave-Server
sudo apt-get install mysql-client mysql-server
Vergessen Sie nicht, auch ein sicheres Root-Passwort hinzuzufügen.
sudo mysql_secure_installation
2. Einrichten des MySQL-Servers auf dem Master-Server
2.1 Konfiguration des MySQL-Servers
Öffnen Sie Ihre MySQL-Konfigurationsdatei:
sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf
Stellen Sie unter "bind-address" Ihre öffentliche IP-Adresse des Master-Servers oder "0.0.0.0.0" ein.
bind-address = 192.168.0.1
Setzen Sie die "Server-ID" auf "1".
server-id = 1
Fügen Sie auch die Pfade zu den Dateien relay_log, relay_log_index, log_bin und log_bin_index hinzu:
relay_log = /var/log/mysql/mysql-relay-bin
relay_log_index = /var/log/mysql/mysql-relay-bin.index
log_bin = /var/log/mysql/mysql-bin.log
log_bin_index =/var/log/mysql/mysql-bin.log.index
Wenn Sie nur eine bestimmte Datenbank replizieren wollen, dann fügen Sie diese mit Ihrem Datenbanknamen hinzu:
binlog_do_db = YOUR_DATABASE_NAME
Wenn Sie eine Datenbank von der Replikation ausschließen möchten, dann fügen Sie diese mit Ihrem Datenbanknamen hinzu:
binlog_ignore_db = YOUR_DATABASE_NAME
2.2 Hinzufügen eines Benutzers, der für die Replikation verwendet wird
Loggen Sie sich in den MySQL-Server Ihres Master-Servers ein.
sudo mysql -u root -p
Erstellen Sie in MySQL einen neuen Benutzer, der für die Replikation dieses Datenbankservers verwendet wird. Der Benutzer sollte mit der öffentlichen IP-Adresse des Slave-Servers referenziert werden. In diesem Beispiel ist es die IP-Adresse "192.168.10".
CREATE USER 'replicator'@'192.168.0.10' IDENTIFIED BY 'REPLICATOR_PASSWORD';
Fügen Sie die folgenden Privilegien für den neuen Benutzer hinzu:
GRANT REPLICATION SLAVE ON *.* TO 'replicator'@'192.168.0.10';
FLUSH PRIVILEGES;
Dies sind die Privilegien des MySQL-Benutzers, der die Replikation Ihrer Datenbank durchführt. Wenn Sie einen Load Balancer mit einer CMS-Software wie Joomla verwenden, sollten Sie für die verwendeten Datenbanken in Ihrem Slave-Server ein Nur-Lese-Privileg festlegen.
Wenn Sie eine Datenbank replizieren möchten, die bereits erstellt und verwendet wird, dann wechseln Sie bitte zu dieser Datenbank und sperren Sie die Datenbank mit diesem Befehl:
USE MY_DATABASE;
FLUSH TABLES WITH READ LOCK;
Wenn Sie mit dem Einrichten des Datenbank-Replikationsservers fertig sind, vergessen Sie nicht, Ihre Datenbank mit diesem Befehl zu entsperren: UNLOCK TABLES ENTSPERREN;
Überprüfen Sie nun den Status Ihres Datenbank-Masterservers und notieren Sie sich die ersten beiden Werte ("Datei" und "Position").
SHOW MASTER STATUS\G
Die beiden ersten Werte werden später beim Einrichten des Slave-Servers benötigt.
mysql> SHOW MASTER STATUS\G
*************************** 1. row ***************************
File: mysql-bin.001202
Position: 1017657
Binlog_Do_DB:
Binlog_Ignore_DB:
Executed_Gtid_Set:
1 row in set (0.00 sec)
In diesem Beispiel sind dies "mysql-bin.001202" und "1017657".
Erstellen Sie ein Dump Ihres Datenbankservers.
sudo mysqldump -u root -p --add-drop-database --all-databases > /database_master_dump.sql
Wenn Sie nur eine bestimmte (laufende) Datenbank replizieren möchten, dann erstellen Sie mit diesem Befehl einen Speicherauszug dieser bestimmten Datenbank:
sudo mysqldump -u root -p --single-transaction --databases MY_DATABASE > /database_master_dump.sql
3. Einrichten des MySQL-Servers auf dem Slave-Server
3.1 Konfiguration des MySQL-Servers
Öffnen Sie Ihre MySQL-Konfigurationsdatei.
sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf
Stellen Sie unter "bind-address" Ihre öffentliche IP-Adresse des Slave-Servers oder "0.0.0.0.0" ein:
bind-address = 192.168.0.10
Setzen Sie die "Server-ID" auf "2":
server-id = 2
Fügen Sie auch die Pfade zu den Dateien relay_log, relay_log_index, log_bin und log_bin_index hinzu:
relay_log = /var/log/mysql/mysql-relay-bin
relay_log_index = /var/log/mysql/mysql-relay-bin.index
log_bin = /var/log/mysql/mysql-bin.log
log_bin_index =/var/log/mysql/mysql-bin.log.index
Starten Sie den MySQL-Server neu:
sudo systemctl restart mysql
Melden Sie sich bei Ihrem MySQL-Server an.
sudo mysql -u root -p
Stoppen Sie den Slave-Server.
STOP SLAVE;
Führen Sie diesen Befehl mit den Werten der MySQL-Konfiguration des Master-Servers aus, die in Schritt 2 dieses Tutorials gezeigt wurden.
CHANGE MASTER TO MASTER_HOST = '192.168.0.1', MASTER_USER ='replicatior', MASTER_PASSWORD ='REPLICATOR_PASSWORD', MASTER_LOG_FILE = 'mysql-bin.001202', MASTER_LOG_POS = 1017657;
In diesem Beispiel ist die IP-Adresse "192.168.0.1" die öffentliche IP des Master-Servers. Die "MASTER_USER" und "MASTER_PASSWORD" sind die Anmeldedaten des Benutzers, der im Master-Server für die Datenbankreplikation erstellt wurde.
"MASTER_LOG_FILE" und "MASTER_LOG_POS" sind Werte, die wir durch folgenden Befehl erhalten haben, den wir auf dem MySQL-Server im Master-Server ausführen: SHOW MASTER STATUS\G
Vergessen Sie nicht, den erstellten MySQL-Dump des Master-Datenbankservers in den Datenbankserver des Slave-Servers zu importieren. Beispiel-Befehl:
mysql -u root -p < /database_master_dump.sql
4. Starten des Master- und Slave-Servers
Starten Sie nun den Slave-Server.
START SLAVE;
Loggen Sie sich in den MySQL-Server in Ihrem Master-Server ein und starten Sie auch den Master-Server.
mysql -u root -p
START MASTER;
5. Überprüfen Sie den Status Ihres Master- und Slave-Servers
Status des Slave-Servers:
SHOW SLAVE STATUS\G
Status des Master-Servers:
SHOW MASTER STATUS\G
Dies war eine Einführung in die MySQL-Replikation. Sie können auch weitere Slave-Server hinzufügen, indem Sie die Schritte von 2.1 bis 4 wiederholen.
Mehr über MySQL-Replikation:
https://dev.mysql.com/doc/refman/8.0/en/replication.html