MySql Replikation Master und Slave Server einrichten
Write a commentAusgangssituation
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.
You are a guest
or post as a guest
Be the first to comment.