GNU/Linux >> LINUX-Kenntnisse >  >> Debian

Einrichten der Master-Master-Replikation mit MySQL unter Debian 8 (Jessie)

Dieses Tutorial beschreibt ein repliziertes MySQL-Setup (Mater/Master-Replikation) mit 2 Knoten, bei dem Daten gleichzeitig gelesen und auf beide Knoten geschrieben werden können. MySQL kümmert sich darum, die Daten auf den anderen Knoten zu replizieren und stellt sicher, dass primäre Autoinkrementschlüssel nicht kollidieren.

Seit Version 5 verfügt MySQL über eine integrierte Unterstützung für die Master-Master-Replikation, wodurch das Problem gelöst wird, das mit selbst generierten Schlüsseln auftreten kann. In früheren MySQL-Versionen bestand das Problem bei der Master-Master-Replikation darin, dass es sofort zu Konflikten kam, wenn Knoten A und Knoten B beide einen automatisch inkrementierenden Schlüssel in dieselbe Tabelle einfügten. Die Vorteile der Master-Master-Replikation gegenüber der traditionellen Master-Slave-Replikation bestehen darin, dass Sie Ihre Anwendungen nicht ändern müssen, um nur auf den Master schreibend zuzugreifen, und dass es einfacher ist, Hochverfügbarkeit bereitzustellen, denn wenn der Master ausfällt, Sie haben immer noch den anderen Master.

1 Vorbemerkung

In diesem Tutorial zeige ich, wie man die Datenbank exampledb vom Server server1.example.com mit der IP-Adresse 192.168.1.101 auf den Server server2.example.com mit der IP-Adresse 192.168.1.102 repliziert und umgekehrt. Jedes System ist gleichzeitig der Slave des anderen Masters und der Master des anderen Slaves. Auf beiden Systemen läuft Debian 8; Die Konfiguration sollte jedoch mit geringen oder keinen Änderungen für fast alle Distributionen gelten.

2 Installation von MySQL 5.5

Wenn MySQL noch nicht auf Server1 und Server2 installiert ist, installieren Sie es jetzt:

server1/server2:

apt-get -y install mysql-server-5.5 mysql-client-5.5

Um sicherzustellen, dass die Replikation funktioniert, müssen wir MySQL dazu bringen, auf allen Schnittstellen zu lauschen, deshalb kommentieren wir die Zeile bind-address =127.0.0.1 in /etc/mysql/my.cnf:

aus

server1/server2:

nano /etc/mysql/my.cnf
[...]
# Instead of skip-networking the default is now to listen only on
# localhost which is more compatible and is not less secure.
#bind-address           = 127.0.0.1
[...]

Starten Sie danach MySQL neu:

server1/server2:

service mysql restart

Prüfen Sie dann mit

server1/server2:

netstat -tap | grep mysql

dass MySQL wirklich auf allen Schnittstellen lauscht:

netstat -tap | grep mysql
tcp 0 0 *:mysql *:* LISTEN 15437/mysqld
server1:~#

Jetzt richten wir einen Replikationsbenutzer slave2_user ein, der von server2 verwendet werden kann, um auf die MySQL-Datenbank auf server1 zuzugreifen.

server1:

Melden Sie sich bei der MySQL-Shell an:

mysql --defaults-file=/etc/mysql/debian.cnf

Führen Sie in der MySQL-Shell die folgenden Befehle aus:

server1:

GRANT REPLICATION SLAVE ON *.* TO [email protected]'%' IDENTIFIED BY 'secretpassword';
FLUSH PRIVILEGES;
quit;

Ersetzen Sie das Wort „secretpassword " mit einem sicheren Passwort Ihrer Wahl. Jetzt wiederholen wir die letzten beiden Schritte auf Server2:

server2:

mysql --defaults-file=/etc/mysql/debian.cnf
GRANT REPLICATION SLAVE ON *.* TO [email protected]'%' IDENTIFIED BY 'secretpassword';
FLUSH PRIVILEGES;
quit;

Ersetzen Sie das Wort „secretpassword " auch hier ein sicheres Passwort. Notieren Sie sich die Passwörter, da wir sie später benötigen. 

3 Einige Notizen

Im Folgenden gehe ich davon aus, dass beide MySQL-Server leer sind (noch keine Datenbank außer der 'mysql'-Datenbank enthalten).

Wenn das auf Ihrem Server nicht der Fall ist, müssen Sie die Datenbanken auf dem ersten Server sperren und sichern und auf dem zweiten importieren, bevor Sie fortfahren. Entsperren Sie die Datenbanken nicht, bevor die Replikation eingerichtet ist. Nachfolgend einige Befehle, die zeigen, wie Sie alle Datenbanken auf einen neuen Server kopieren, falls Sie nicht mit einem "sauberen" MySQL-Setup beginnen.

Beispiel zum Sperren aller Datenbanktabellen in einer MySQL-Datenbank.

FLUSH TABLES WITH READ LOCK;
SET GLOBAL read_only = ON;

Beispiel, wie man alle Datenbanken in eine Datei all_databases.sql ausgibt.

mysqldump --defaults-file=/etc/mysql/debian.cnf -cCeQ --hex-blob --quote-names --routines --events --triggers --all-databases -r all_databases.sql

Beispiel zum Importieren aller Tabellen auf dem zweiten Server aus der Datei all_databses.sql.

mysql --defaults-file=/etc/mysql/debian.cnf < all_databases.sql

4 Einrichten der Replikation

Jetzt richten wir die Master-Master-Replikation in /etc/mysql/my.cnf ein. Die entscheidenden Konfigurationsoptionen für die Master-Master-Replikation sind auto_increment_increment und auto_increment_offset:

  • auto_increment_increment steuert das Inkrement zwischen aufeinanderfolgenden AUTO_INCREMENT-Werten.
  • auto_increment_offset bestimmt den Startpunkt für AUTO_INCREMENT-Spaltenwerte.

Nehmen wir an, wir haben N MySQL-Knoten (in diesem Beispiel N=2), dann hat auto_increment_increment auf allen Knoten den Wert N, und jeder Knoten muss einen anderen Wert für auto_increment_offset haben (1, 2, ..., N).

Lassen Sie uns nun unsere beiden MySQL-Knoten konfigurieren:

server1:

nano /etc/mysql/my.cnf

Suchen Sie nach dem Abschnitt, der mit [mysqld] beginnt, und fügen Sie die folgenden Optionen ein (kommentieren Sie alle vorhandenen widersprüchlichen aus Optionen):

[...]
[mysqld]

# Unique Server ID
server-id = 1

# Do not replicate the following databases
binlog-ignore-db = mysql
replicate-ignore-db = mysql

# Auto increment offset
auto-increment-increment = 2

# Do not replicate sql queries for the local server ID
replicate-same-server-id = 0

# Beginne automatisch inkrementelle Werte mit 1
auto-increment-offset = 1

# Delete binlog data after 10 days
expire_logs_days = 10

# Max binlog size
max_binlog_size = 500M

# Binlog file path
log_bin = /var/log/mysql/mysql-bin.log

[...]

Starten Sie dann MySQL neu:

server1:

service mysql restart

Machen Sie jetzt dasselbe auf server2:

server2:

nano /etc/mysql/my.cnf
[...]

# Unique Server ID
server-id = 2

# Do not replicate the following databases
binlog-ignore-db = mysql
replicate-ignore-db = mysql

# Auto increment offset
auto-increment-increment = 2

# Do not replicate sql queries for the local server ID
replicate-same-server-id = 0

# Beginne automatisch inkrementelle Werte mit 1
auto-increment-offset = 2

# Delete binlog data after 10 days
expire_logs_days = 10

# Max binlog size
max_binlog_size = 500M

# Binlog file path
log_bin = /var/log/mysql/mysql-bin.log

[...]

server2:

service mysql restart

Als nächstes sperren wir die exampledb-Datenbank auf server1, finden den Master-Status von server1 heraus, erstellen einen SQL-Dump von exampledb (den wir in exampledb auf server2 importieren, damit beide Datenbanken die gleichen Daten enthalten) und entsperren die Datenbank, damit sie kann wieder verwendet werden:

server2:

Nun starten wir die Replikation auf Server 2. Öffnen Sie die MySQL-Shell:

mysql --defaults-file=/etc/mysql/debian.cnf

Und führen Sie den folgenden SQL-Befehl aus, um die Replikation von Server1 nach Server2 zu aktivieren:

CHANGE MASTER TO MASTER_HOST='192.168.1.101', MASTER_USER='repl', MASTER_PASSWORD='secretpassword';

Ersetzen Sie geheimes Passwort mit dem Passwort für den repl MySQL-Benutzer, den Sie in Kapitel 2 festgelegt haben.

Überprüfen Sie nun den Slave-Status, indem Sie in der MySQL-Shell den Befehl "show slave status\G" ausführen.

show slave status\G

Die Ausgabe sieht ungefähr so ​​aus:

mysql> show slave status\G
*************************** 1. row ***************************
Slave_IO_State:
Master_Host: 192.168.1.101
Master_User: repl
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000001
Read_Master_Log_Pos: 107
Relay_Log_File: mysqld-relay-bin.000003
Relay_Log_Pos: 253
Relay_Master_Log_File: mysql-bin.000001
Slave_IO_Running: No
Slave_SQL_Running: No
Replicate_Do_DB:
Replicate_Ignore_DB: mysql
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 107
Relay_Log_Space: 410
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: NULL
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 1
1 row in set (0.00 sec)

Die Zeilen, die Sie überprüfen sollten, sind diese:

Master_Host: 192.168.1.101
Master_User: repl
Master_Port: 3306
Master_Log_File: mysql-bin.000001
Relay_Log_File: mysqld-relay-bin.000003
Slave_IO_Running: No
Slave_SQL_Running: No

Starten Sie nun die Replikation mit diesem Befehl auf der MySQL-Shell:

start slave;

und prüfen Sie dann erneut den Slave-Status:

show slave status\G

Die folgenden zwei Zeilen sollten jetzt "yes" anzeigen:

Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Seconds_Behind_Master: 0

Wenn "Seconds_Behind_Master" nicht 0 ist, warten Sie einige Sekunden und überprüfen Sie den Status erneut. Dieses Feld zeigt an, ob Master und Slave synchron sind.

Für den nächsten Schritt müssen wir die Werte von „Master_Log_File“ und „Read_Master_Log_Pos“ des Befehls „show slave status\G“ kennen. In meinem Fall sind dies:

Master_Log_File: mysql-bin.000001
Read_Master_Log_Pos: 107

Notieren Sie sich die Werte, die Sie auf Ihrem Server erhalten, wir brauchen sie für den nächsten Schritt auf Server 1.

Danach können Sie die MySQL-Shell verlassen:

quit

server1:

Wir fahren auf dem ersten Server fort und öffnen die MySQL-Shell auf Server1:

mysql --defaults-file=/etc/mysql/debian.cnf

Und führen Sie den folgenden MySQL-Befehl aus:

CHANGE MASTER TO MASTER_HOST='192.168.1.102', MASTER_USER='repl', MASTER_PASSWORD='secretpassword', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=107;

Sie müssen ein paar Dinge im obigen Befehl ersetzen:

  1. Die IP-Adresse muss die IP Ihres zweiten MySQL-Servers sein.
  2. Das Passwort „secretpassword“ muss dasjenige sein, das Sie in Kapitel 2 für die Benutzerersetzung gewählt haben.
  3. Die MASTER_LOG_FILE und MASTER_LOG_POS müssen die Werte sein, die wir im letzten Schritt notiert haben.

Prüfen Sie jetzt mit:

show slave status\G

auf der MySQL-Shell, wenn keine Fehler vorliegen.

mysql> show slave status\G
*************************** 1. row ***************************
Slave_IO_State:
Master_Host: 192.168.1.102
Master_User: repl
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000001
Read_Master_Log_Pos: 107
Relay_Log_File: mysqld-relay-bin.000001
Relay_Log_Pos: 4
Relay_Master_Log_File: mysql-bin.000001
Slave_IO_Running: No
Slave_SQL_Running: No
Replicate_Do_DB:
Replicate_Ignore_DB: mysql
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 107
Relay_Log_Space: 107
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: NULL
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 0
1 row in set (0.00 sec)

Und starte den Slave.

start slave;

Überprüfen Sie den Slave-Status erneut:

show slave status\G

Die folgenden zwei Zeilen sollten jetzt "yes" anzeigen:

Slave_IO_Running: Yes
Slave_SQL_Running: Yes

Danach können Sie die MySQL-Shell verlassen:

quit

Wenn nichts schief gelaufen ist, sollte die MySQL-Master-Master-Replikation jetzt funktionieren. Wenn dies nicht der Fall ist, überprüfen Sie bitte /var/log/syslog auf MySQL-Fehler auf Server1 und Server2.

5 Testen Sie die Replikation

Jetzt ist es an der Zeit, unser Replikations-Setup zu testen. Ich erstelle eine Datenbank exampledb1 auf Server1 und überprüfe dann auf Server2, ob die Datenbank auf den zweiten Server repliziert wurde:

server1:

Melden Sie sich bei der MySQL-Konsole auf server1 an und erstellen Sie die Datenbank:

mysql --defaults-file=/etc/mysql/debian.cnf
CREATE DATABASE exampledb1;

server2

Melden Sie sich jetzt bei der MySQL-Konsole auf Server2 an und prüfen Sie, ob exampledb1 jetzt dort existiert:

mysql --defaults-file=/etc/mysql/debian.cnf
show databases;

Wie wir sehen können, erscheint die neue Datenbank auch auf Server2.

mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| exampledb1 |
| mysql |
| performance_schema |
+--------------------+
4 rows in set (0.00 sec)

Als nächstes werde ich testen, ob die Replikation auch in die andere Richtung funktioniert. Wir sind weiterhin auf server2 angemeldet und erstellen dort eine Datenbank exampledb2:

CREATE DATABASE exampledb2;

Gehen Sie nun zurück zu server1 und führen Sie "show databases" in der MySQL-Konsole aus:

server1

show databases;

Das Ergebnis zeigt unsere neue Datenbank exampledb2, die Replikation funktioniert also in beide Richtungen.

mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| exampledb1 |
| exampledb2 |
| mysql |
| performance_schema |
+--------------------+
5 rows in set (0.01 sec)

  • MySQL:http://www.mysql.com
  • Debian:http://www.debian.org

Debian
  1. So konfigurieren Sie die MySQL (MariaDB) Master-Slave-Replikation unter Debian 10

  2. So richten Sie die MySQL-Master-Master-Replikation ein

  3. So richten Sie die PostgreSQL-Streaming-Replikation mit Replikations-Slots unter Debian 10 ein

  4. So installieren Sie WebDAV mit Lighttpd unter Debian 8 (Jessie)

  5. So installieren Sie MySQL v5.7 mit apt-get unter Debian 8 Jessie

Chrooting von Apache 2.4 mit mod_unixd auf Debian 8 (Jessie)

Installieren eines Web-, E-Mail- und MySQL-Datenbank-Clusters auf Debian 8.4 Jessie mit ISPConfig 3.1

So installieren Sie Nginx mit PHP + MySQL (LEMP) unter Debian 9

So installieren Sie LAMP (Apache, MySQL, PHP) unter Debian 8 Jessie

Master-Master-Replikation mit MariaDB

Installieren Sie Zabbix auf Debian 11 Bullseye mit MySQL/MariaDB &Apache