Hier erläutern wir, wie du einen MySQL Master- und Slave-Server einrichtest, um eine effektive Datenverteilung und -sicherung zu gewährleisten. Dies ist unerlässlich für alle, die auf Datenverfügbarkeit und Lastverteilung angewiesen sind.

Ausgangssituation

Server 1 (Hauptserver) = Eine bestehende Datenbank

Server 2 (Replikation) = Gar keine Datenbank

Wir gehen davon aus, dass die MySQL Server Software auf beiden Maschinen installiert ist.

Master – Master

Datenbank erreichbar machen

Einstellungen auf Server 1 und Server 2

Damit die Datenbank über das Netzwerk erreichbar ist, muss die Zeile

# /etc/mysql/my.cnf
...
bind-address = 127.0.0.1
...

auskommentiert werden.

Userrechte vergeben

Einstellungen auf Server 1 und Server 2

Damit der andere Server auf diesen Zugriff hat, muss der User die Rechte dazu haben.

GRANT REPLICATION SLAVE ON *.* TO 'userFromRemoteDatabase'@'%' IDENTIFIED BY 'passwordFromRemoteDatabase';
FLUSH PRIVILEGES;

Datenbank anlegen

Einstellungen auf Server 2

Jetzt muss die Datenbank angelegt werden, die die Replikation darstellen soll.

CREATE DATABASE exampledb;

Konfiguration erstellen

Einstellungen auf Server 1 und Server 2

Folgende Anpassungen für den MySql Dienst

# /etc/mysql/my.cnf<br>...
[mysqld]
server-id = 1                     # die ID in der Replikation
replicate-same-server-id = 0      # default 0 zur Vermeidung von loops
auto-increment-increment = 2      # Anzahl der Server die in der Replikation verwendet werden
auto-increment-offset = 1         # bestimmt den Startpunkt für das Auto Inkrement ( Server 1 = 1, Server 2 = 2 ...)
 
replicate-do-db = exampledb       # Datenbanknamen
 
log-bin = /var/log/mysql/mysql-bin.log 
binlog-do-db = exampledb          # Datenbankname
log-slave-updates                 # Wird benötigt um die log Datei zu schreiben, die der andere Master verwendet. Nur benötigt bei mehreren Masters.
 
relay-log = /var/lib/mysql/slave-relay.log
relay-log-index = /var/lib/mysql/slave-relay-log.index
 
expire_logs_days        = 10
max_binlog_size         = 500M
[...]

Slave Prozess stoppen

Einstellungen auf Server 1 und Server 2

/usr/bin/mysqladmin --user=root --password=password stop-slave

MySql Dienst neu starten

Einstellungen auf Server 1 und Server 2

service mysql restart

Master Status anzeigen lassen

Auf Server 1

USE exampledb;
FLUSH TABLES WITH READ LOCK;
SHOW MASTER STATUS;

Die Ausgabe sieht dann so ähnlich aus:

mysql> SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000010 |       98 | exampledb    |                  |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
 
mysql>

Diese Ausgabe am besten angezeigt lassen oder aufschreiben.

Die SQL-Shell jetzt NICHT schließen!!!

Dump erstellen und duplizieren

Auf Server 1

Es wird eine neue Shell geöffnet.

cd /tmp
mysqldump -u root -ppassword --opt exampledb > snapshot.sql
scp snapshot.sql root@192.168.0.101:/tmp

Jetzt können wir wieder auf die erste Shell zurück gehen und die Datenbank wieder frei geben.

UNLOCK TABLES;

Datenbank wieder einspielen

Auf Server 2

cd /tmp
mysql -u root -ppassword exampledb < snapshot.sql

Masterstatus herausfinden

Auf Server 2

USE exampledb;
FLUSH TABLES WITH READ LOCK;
SHOW MASTER STATUS;

Dann kommt wieder so eine Ausgabe:

mysql> SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000010 |     1067 | exampledb    |                  |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
 
mysql>

Diese dann merken.

Jetzt die Tabelle wieder freigeben.

UNLOCK TABLES;

Replikation Server 2 zu Server 1

Auf Server 2

Jetzt wird Server 2 zu einem Slave von Server 1 gemacht.

Es ist wichtig das die Parameter ‚MASTER_LOG_FILE‘ und ‚MASTER_LOG_POS‘ mit den Werten ausgetauscht werden, die ‚SHOW MASTER STATUS‘ von Server 1 uns ausgegeben hat.

CHANGE MASTER TO MASTER_HOST='192.168.0.100', MASTER_PORT=3306, MASTER_USER='userServer1', MASTER_PASSWORD='passwordUserServer1', MASTER_LOG_FILE='mysql-bin

Zu guter Letzt wird der Slave gestartet.

START SLAVE;

Mit folgendem Befehl wird der aktuelle Status von dem Slave ausgelesen.

SHOW SLAVE STATUS \G

Wir sehen nun folgendes:

*************************** 1. row ***************************
             Slave_IO_State: Waiting for master to send event
                Master_Host: 192.168.0.100
                Master_User: userServer1
                Master_Port: 3306
              Connect_Retry: 60
            Master_Log_File: mysql-bin.000010
        Read_Master_Log_Pos: 98
             Relay_Log_File: slave-relay.000002
              Relay_Log_Pos: 235
      Relay_Master_Log_File: mysql-bin.000010
           Slave_IO_Running: Yes
          Slave_SQL_Running: Yes
            Replicate_Do_DB: exampledb
        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: 98
            Relay_Log_Space: 235
            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
1 row in set (0.01 sec)
 
mysql>

Es ist wichtig, dass ‚Slave_IO_Running‘ und ‚Slave_SQL_Running‘ beide ‚YES‘ anzeigen. Ist dies nicht der Fall, ist etwas bei der Konfiguration falsch gelaufen.

Jetzt sind wir mit der Konfiguration von Server 2 fertig und können die Replikation von Server 1 zu Server 2 einrichten.

Replikation Server 1 zu Server 2

Auf Server 1

STOP SLAVE;

Es ist wichtig das die Parameter ‚MASTER_LOG_FILE‘ und ‚MASTER_LOG_POS‘ mit den Werten ausgetauscht werden, die ‚SHOW MASTER STATUS‘ von Server 2 uns ausgegeben hat.

CHANGE MASTER TO MASTER_HOST='192.168.0.100', MASTER_PORT=3306, MASTER_USER='userServer2', MASTER_PASSWORD='passwordUserServer2', MASTER_LOG_FILE='mysql-bin.000010', MASTER_LOG_POS=98;

Zu guter Letzt wird der Slave gestartet.

START SLAVE;

Mit folgendem Befehl wird der aktuelle Status von dem Slave ausgelesen.

SHOW SLAVE STATUS \G

Wir sehen nun folgendes:

*************************** 1. row ***************************
             Slave_IO_State: Waiting for master to send event
                Master_Host: 192.168.0.100
                Master_User: userServer2
                Master_Port: 3306
              Connect_Retry: 60
            Master_Log_File: mysql-bin.000010
        Read_Master_Log_Pos: 98
             Relay_Log_File: slave-relay.000002
              Relay_Log_Pos: 235
      Relay_Master_Log_File: mysql-bin.000010
           Slave_IO_Running: Yes
          Slave_SQL_Running: Yes
            Replicate_Do_DB: exampledb
        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: 98
            Relay_Log_Space: 235
            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
1 row in set (0.01 sec)
 
mysql>

Es ist wichtig, dass ‚Slave_IO_Running‘ und ‚Slave_SQL_Running‘ beide ‚YES‘ anzeigen. Ist dies nicht der Fall, ist etwas bei der Konfiguration falsch gelaufen.