Heute widmen wir uns mal dem Thema MySQL etwas mehr. Ich will euch hier im Artikel zeigen, wie man eine Master/Slave Replikation mit CentOS 7 und mariaDB baut.
Benötigt werden dafür zwei Server, auf den CentOS 7 bereits installiert ist.
Schritt 1: mariaDB installieren
Um eine Master/Slave Replikation zu implementieren, müssen wir zuerst auf beiden Servern mariaDB installieren. Dies ist relativ einfach und mit dem folgenden Befehl schnell gemacht.
1 | yum install mariadb-server |
Anschließend wir der mariadb Service auf dem Server gestartet.
1 | service mariadb start |
Dies getan, setzten wir noch ein Passwort für den root User.
1 2 3 4 5 6 | mysql -u root mysql> use mysql; mysql> update user set password=PASSWORD("MEIN_ROOT_PASSWORT") where User='root'; mysql> flush privileges; mysql> exit; |
MEIN_ROOT_PASSWORT muss durch unser root Passwort ersetzt werden.
Anschließend auf dem Slave System mariadb wieder stoppen
1 | systemctl stop mariadb |
Schritt 2: Master Konfiguration
Nun wollen wir damit weiter machen, den Master Server zu konfigurieren. Dafür müssen wir zuerst ein paar Einstellungen in /etc/my.cnf ändern. Dafür öffnen wir die Datei mit einem Editor unserer Wahl
1 | vim /etc/my.cnf |
Hier suchen wir die Sektion [mysqld] heraus und ergänzen es um die folgenden Zeilen
1 2 3 4 | server_id=1 log_bin = mysql-bin sync_binlog = 1 bind-address = 1.2.3.4 |
Anschließend muss mariaDB neugestartet werden.
1 | systemctl restart mariadb |
Dies getan, prüfen wir die binary logs des masters
1 2 3 | mysql -u root -p mysql> show master status; |
Die Ausgabe sollte dann so aussehen
1 2 3 4 5 6 | <span style="color: #000000">+--------------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +--------------------+----------+--------------+------------------+ | mariadb-bin.000002 | 245 | | | +--------------------+----------+--------------+------------------+ 1 row in set (0.00 sec)</span> |
Jetzt brauchen wir noch einen User für die Replikation.
1 2 | mysql> GRANT REPLICATION SLAVE ON *.* TO repl IDENTIFIED BY "SECRET" WITH GRANT OPTION; mysql> flush privileges; |
Der User heißt in diesem Fall repl. SECRET muss noch durch ein Passwort für die Replikation ersetzt werden.
Nun prüfen wir noch den User in der Datenbank.
1 | mysql> select * from mysql.user WHERE user="repl"\G; |
Die Ausgabe sollte dann wie folgt aussehen.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | *************************** 1. row *************************** Host: % User: repl Password: *C7B0F93AB354C7F98949395F70387AE3F79A5549 Select_priv: N Insert_priv: N Update_priv: N Delete_priv: N Create_priv: N Drop_priv: N Reload_priv: N Shutdown_priv: N Process_priv: N File_priv: N Grant_priv: Y References_priv: N Index_priv: N Alter_priv: N Show_db_priv: N Super_priv: N Create_tmp_table_priv: N Lock_tables_priv: N Execute_priv: N Repl_slave_priv: Y Repl_client_priv: N Create_view_priv: N Show_view_priv: N Create_routine_priv: N Alter_routine_priv: N Create_user_priv: N Event_priv: N Trigger_priv: N Create_tablespace_priv: N ssl_type: ssl_cipher: x509_issuer: x509_subject: max_questions: 0 max_updates: 0 max_connections: 0 max_user_connections: 0 plugin: authentication_string: |
Jetzt müssen wir noch einen Datenbank Dump erstellen, den wir auf dem Slave dann einbinden könne.
Dafür sperren wir zuerst den Zugriff auf die Datenbank
1 | mysql> FLUSH TABLES WITH READ LOCK; |
Nun müssen wir noch einen Dump der aktuellen Installation erstellen:
1 | mysqldump -u root -p --events --ignore-table=mysql.events --all-databases > /var/backups/mysqldump.sql |
Diesen Dump kopieren wir anschließend auf den Slave in das Homeverzeichnis unseres Users:
1 | scp /var/backups/mysqldump.sql modius@1.2.3.4:/home/modius |
Schritt 3: Slave Konfiguration
Auch beim Slave müssen wir als erstes die my.cnf anpassen.
1 | vim /etc/my.cnf |
Dem Slave geben wir hier die Server ID 2
1 2 3 | server_id = 2 relay_log = mysql-relay-bin read_only = yes |
Danach starten wir mariadb.
1 | systemctl start mariadb |
Jetzt spielen wir den zuvor kopierten mysql Dump auf dem Slave ein.
1 | mysql -uroot -p < /home/modius/mysqldump.sql |
Anschließend loggen wir uns in die Datenbank ein
1 | mysql -u -root -p |
In der Datenbank muss nun hinterlegt werden, dass die Daten von einem anderen Server komme.
1 2 3 4 5 6 | mysql> CHANGE MASTER TO MASTER_HOST='IP_Adresse_MASTER', MASTER_USER='repl', MASTER_PASSWORD='Replikations_Passwort', MASTER_LOG_FILE='mariadb-bin.000002.bin', MASTER_LOG_POS=245; |
Anschließend starten wir den Slave Modus.
1 | mysql> slave start; |
Diesen prüfen wir anschließend noch.
1 | mysql> show slave status\G; |
Die Ausgabe sollte dann wie folgt aussehen:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | MariaDB [(none)]> show slave status\G *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 1.2.3.4 Master_User: repl Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.000004 Read_Master_Log_Pos: 245 Relay_Log_File: mysql-relay-bin.000004 Relay_Log_Pos: 529 Relay_Master_Log_File: mysql-bin.000004 Slave_IO_Running: Yes Slave_SQL_Running: Yes Replicate_Do_DB: Replicate_Ignore_DB: 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: 245 Relay_Log_Space: 1107 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: 0 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) |
Damit haben wir erfolgreich eine Master/Slave Replikation aufgesetzt
Mögliche Probleme
Da ich komplett neue Systeme für dieses Tutorial verwendet habe, hatte ich noch folgendes Problem. Bei der Eingabe von show slave status\G habe ich die folgende Ausgabe erhalten
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | MariaDB [(none)]> show slave status\G *************************** 1. row *************************** Slave_IO_State: Connecting to master Master_Host: 1.2.3.4 Master_User: repl Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.000003 Read_Master_Log_Pos: 245 Relay_Log_File: mysql-relay-bin.000002 Relay_Log_Pos: 4 Relay_Master_Log_File: mysql-bin.000003 Slave_IO_Running: Connecting Slave_SQL_Running: Yes Replicate_Do_DB: Replicate_Ignore_DB: 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: 245 Relay_Log_Space: 245 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: 2003 Last_IO_Error: error connecting to master 'repl@1.2.3.4:3306' - retry-time: 60 retries: 86400 message: Can't connect to MySQL server on '1.2.3.4' (113) Last_SQL_Errno: 0 Last_SQL_Error: Replicate_Ignore_Server_Ids: Master_Server_Id: 0 |
Bei Last IO Error sehen wir, dass es Probleme mit der Verbindung gibt. Darauf hin habe ich einen telnet auf den Port 3306 gemacht und dabei festgestellt, dass dieser nicht offen ist. Mit den folgenden zwei firewalld Befehlen lässt sich das ganz einfach lösen.
1 2 | firewall-cmd --zone=public --add-port=3306/tcp --permanent firewall-cmd --reload |
Sollte das System produktiv eingesetzt werden, macht es Sinn hier eine DMZ Zone hinzuzufügen und die Regel feiner zu definieren.
Hallo,
danke für den Artikel! Ich habe noch ein paar Ergänzungen:
Es kann sein, dass der Dateiname für den Binary Log angepasst werden muss. Auf dem Master findet man das so heraus:
MariaDB [(none)]> show binary logs;
+——————+———–+
| Log_name | File_size |
+——————+———–+
| mysql-bin.000001 | 529 |
| mysql-bin.000002 | 1239 |
| mysql-bin.000003 | 1328 |
| mysql-bin.000004 | 589 |
| mysql-bin.000005 | 245 |
+——————+———–+
5 rows in set (0.00 sec)
MariaDB [(none)]>
Außerdem gibt es diesen merkwürdigen Passwort Bug:
http://blogs.n1zyy.com/n1zyy/2010/08/29/mysql-replication-permission-denied-errors/
Mebus
Hallo Mebus,
danke für diese Ergänzung =)
Gruß
Christian