Modius - Techblog

  • Ansible
  • Docker
  • DevOps
  • Gastautor werden
  • Newsletter abonnieren
  • Über Mich
  • Kontakt

MySQL – Master/Slave Replikation mit mariaDB unter Centos 7

Veröffentlicht am 19. Juni 2015 von Christian Piazzi 2 Kommentare , Aktualisiert am 19. Juni 2015
Geschätzte Lesezeit: 2 Minuten

Mariadb-seal-flat-browntextHeute 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.

Shell
1
yum install mariadb-server

Anschließend wir der mariadb Service auf dem Server gestartet.

Shell
1
service mariadb start

Dies getan, setzten wir noch ein Passwort für den root User.

MySQL
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

Shell
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

Shell
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

MySQL
1
2
3
mysql -u root -p
 
mysql> show master status;

Die Ausgabe sollte dann so aussehen

MySQL
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.

MySQL
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.

MySQL
1
mysql> select * from mysql.user WHERE user="repl"\G;

Die Ausgabe sollte dann wie folgt aussehen.

MySQL
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

MySQL
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:

Shell
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.

Shell
1
vim /etc/my.cnf

Dem Slave geben wir hier die Server ID 2

Shell
1
2
3
server_id = 2
relay_log = mysql-relay-bin
read_only = yes

Danach starten wir mariadb.

Shell
1
systemctl start mariadb

Jetzt spielen wir den zuvor kopierten mysql Dump auf dem Slave ein.

Shell
1
mysql -uroot -p < /home/modius/mysqldump.sql

Anschließend loggen wir uns in die Datenbank ein

Shell
1
mysql -u -root -p

In der Datenbank muss nun hinterlegt werden, dass die Daten von einem anderen Server komme.

MySQL
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.

MySQL
1
mysql> slave start;

Diesen prüfen wir anschließend noch.

MySQL
1
mysql> show slave status\G;

Die Ausgabe sollte dann wie folgt aussehen:

MySQL
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

MySQL
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.

Kategorie: Linux Tags: centos 7, CentOS7, Datenbanken, mariaDB, Master, MySQL, Replikation, Slave

Über Christian Piazzi

Ich blogge hier über alles, was mir so in meinem ITler Altag über den Weg läuft =)
Man findet mich privat bei Google+ und Twitter

Kommentare

  1. Mebus meint

    25. Oktober 2015 um 09:49

    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

    Antworten
    • Christian Piazzi meint

      25. Oktober 2015 um 09:54

      Hallo Mebus,

      danke für diese Ergänzung =)

      Gruß

      Christian

      Antworten

Schreibe einen Kommentar Antworten abbrechen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Kategorien

  • Linux
  • Internet, Bloggen & Co
  • Programmierung
  • Sicherheit
  • Netzwerk & Co
  • Mikrokontroller
  • Windows

Beliebte Artikel

  • Docker Container – anzeigen, starten, stoppen und löschen
  • Nextcloud https mit self-signed Zertifikat einrichten
  • ioBroker auf dem Raspberry Pi installieren und konfigurieren
  • Soft- und Hardlinks unter Linux
  • Arten von Betriebssystemen

Neueste Kommentare

  • Docker Compose Guide - Modius - Techblog bei Docker Compose – Automatisiertes starten von Microservices
  • Keksiminer bei Minecraft Bukkit Server – dynmap installieren und konfigurieren
  • Thorben bei Nextcloud https mit self-signed Zertifikat einrichten
  • Sepp bei Automatisierte Dokumentation von Python Projekten mit sphinx
  • Sascha bei Arduino – 4fach 7-Segmentanzeige mit Schieberegister

Werbung

Archive

Kontakt, Datenschutz und Impressum

  • Kontakt
  • Datenschutz
  • Impressum

Schlagwörter

Anleitung Ansible Apache Apple App Store Automatisierung Blogparade C++ Centos CentOS7 centos 7 Container Datenbank DevOps Docker Dr. Racket Dr. Scheme funktional Gastartikel Google HowTo httpd Icinga2 Icinga 2 Installation itsm Linux Minecraft Monitoring mooc MySQL owncloud PHP Plugin Programmierung python Raspberry Pi Schritt für Schritt Server Sicherheit Tutorial Ubuntu Update Windows Wordpress

Copyright © 2023 · Outreach Pro on Genesis Framework · WordPress · Anmelden