Unterstütze unsere Tutorials mit einem WerbeClick!

Linux Tipps

Debian Tipp #12: Das Paket grep-dctrl enthält einige nützliche Skripts, um verschiedene Kontroll-Dateien für Pakete (wie zum Beispiel die Datei der verfügbaren Pakete) zu durchsuche.

MySql Replikation Master und Slave Server einrichten

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
... [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 Diese E-Mail-Adresse ist vor Spambots geschützt! Zur Anzeige muss JavaScript eingeschaltet sein!:/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.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: 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.

Unterstütze unsere Tutorials mit einem Werbeclick!

Über uns

Wir sind ein agiles Team von Softwareentwicklungen, UX-Designern und IT-Supporten und haben uns auf individuelle Softwarelösung für den Mittelstand spezialisiert. Unsere besondere Stärken sind  Web-Anwendungen mit dem Symfony Framework sowie individuelle Industrielösungen für Produktionslinien, Servicetechniker oder Inspekteure zu entwickeln. Eine weitere Stärke ist die Erweiterung von Content Management Systemen wie beispielsweise Wordpress, Typo3, Drupal und Joomla. Das entwickeln von Apps für Android, Windows und Apple OS Systemen ist selbstverständlich!