Einrichten von Master-Master Replikation mit MySQL 5 auf Debian Etch

Als Nächstes sperren wir die exampledb Datenbank auf server1, finden den Master Status von server1 heraus, erstellen einen SQL dump von exampledb (den wir in exampledb auf server2 importieren, sodass beide Datenbanken die gleichen Daten beinhalten) und schalten die Datenbank wieder frei, damit sie wieder verwendet werden kann:

server1:

mysql -u root -p

Führe in der MySQL Kommandozeile folgende Befehle aus:

server1:

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

Der letzte Befehl sollte etwas wie das anzeigen (schreib es bitte auf, wir brauchen es später noch):

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

mysql>

Verlasse nicht die MySQL Kommandozeile. Denn wenn Du dies tust, wird die gesperrte Datenbank wieder frei geschaltet und das wollen wir gerade nicht, da wir jetzt einen Datenbank dump erstellen müssen. Während die MySQL Kommandozeile immer noch geöffnet ist, öffnen wir ein zweites Kommandozeilenfenster, in dem wir den SQL dump snapshot.sql erstellen und ihn auf server2 transferieren (mittels scp):

server1:

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

Danach kannst Du das zweite Kommandozeilenfenster schließen. Nun können wir in dem ersten Kommandozeilenfenster die Datenbank freischalten und die MySQL Kommandozeile verlassen:

server1:

UNLOCK TABLES;
quit;

Nun können wir auf server2 den SQL dump snapshot.sql wie folgt importieren:

server2:

/usr/bin/mysqladmin –user=root –password=yourrootsqlpassword stop-slave
cd /tmp
mysql -u root -pyourrootsqlpassword exampledb < snapshot.sql

Danach müssen wir auch den Master Status von server2 ermitteln und aufschreiben:

server2:

mysql -u root -p

USE exampledb;
FLUSH TABLES WITH READ LOCK;

SHOW MASTER STATUS;

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

mysql>

Schalte dann die Tabellen frei:

server2:

UNLOCK TABLES;

und führe folgenden Befehl aus um aus server2 einen Slave von server1 zu machen (es ist wichtig, dass Du die Werte im folgenden Befehl mit den Werten, die Du vom SHOW MASTER STATUS; Befehl erhalten hast, den wir auf server1 ausgeführt haben, ersetzt!):

CHANGE MASTER TO MASTER_HOST=’192.168.0.100′, MASTER_USER=’slave2_user‘, MASTER_PASSWORD=’slave2_password‘, MASTER_LOG_FILE=’mysql-bin.000009′, MASTER_LOG_POS=98;

Starte schließlich den Slave:

server2:

START SLAVE;

Überprüfe dann den Slave Status:

server2:

SHOW SLAVE STATUS;

Es ist wichtig, dass beide, Slave_IO_Running und Slave_SQL_Running den Wert Yes in der Ausgabe aufweisen (sonst ist etwas schief gelaufen und Du solltest Dein Setup nochmal überprüfen und Dir /var/log/syslog ansehen, um Fehler festzustellen):

mysql> SHOW SLAVE STATUS;
+----------------------------------+---------------+-------------+-------------+---------------+------------------+---------------------+--------------------+---------------+-----------------------+------------------+-------------------+-----------------+---------------------+--------------------+------------------------+-------------------------+-----------------------------+------------+------------+--------------+---------------------+-----------------+-----------------+----------------+---------------+--------------------+--------------------+--------------------+-----------------+-------------------+----------------+-----------------------+
| Slave_IO_State                   | Master_Host   | Master_User | Master_Port | Connect_Retry | Master_Log_File  | Read_Master_Log_Pos | Relay_Log_File     | Relay_Log_Pos | Relay_Master_Log_File | Slave_IO_Running | Slave_SQL_Running | Replicate_Do_DB | Replicate_Ignore_DB | Replicate_Do_Table | Replicate_Ignore_Table | Replicate_Wild_Do_Table | Replicate_Wild_Ignore_Table | Last_Errno | Last_Error | Skip_Counter | Exec_Master_Log_Pos | Relay_Log_Space | Until_Condition | Until_Log_File | Until_Log_Pos | Master_SSL_Allowed | Master_SSL_CA_File | Master_SSL_CA_Path | Master_SSL_Cert | Master_SSL_Cipher | Master_SSL_Key | Seconds_Behind_Master |
+----------------------------------+---------------+-------------+-------------+---------------+------------------+---------------------+--------------------+---------------+-----------------------+------------------+-------------------+-----------------+---------------------+--------------------+------------------------+-------------------------+-----------------------------+------------+------------+--------------+---------------------+-----------------+-----------------+----------------+---------------+--------------------+--------------------+--------------------+-----------------+-------------------+----------------+-----------------------+
| Waiting for master to send event | 192.168.0.100 | slave2_user |        3306 |            60 | mysql-bin.000009 |                  98 | slave-relay.000002 |           235 | mysql-bin.000009      | Yes              | Yes               | exampledb       |                     |                    |                        |                         |                             |          0 |            |            0 |                  98 |             235 | None            |                |             0 | No                 |                    |                    |                 |                   |                |                     0 |
+----------------------------------+---------------+-------------+-------------+---------------+------------------+---------------------+--------------------+---------------+-----------------------+------------------+-------------------+-----------------+---------------------+--------------------+------------------------+-------------------------+-----------------------------+------------+------------+--------------+---------------------+-----------------+-----------------+----------------+---------------+--------------------+--------------------+--------------------+-----------------+-------------------+----------------+-----------------------+
1 row in set (0.00 sec)

mysql>

Danach kannst Du die MySQL Kommandozeile auf server2 verlassen:

server2:

quit

Nun ist die Replikation von server1 auf server2 eingerichtet. Als Nächstes müssen wir die Replikation von server2 auf server1 konfigurieren.

Dafür beenden wir den Slave auf server1 und machen aus ihm einen Slave von server2:

server1:

mysql -u root -p

STOP SLAVE;

Vergewissere Dich, dass Du in folgendem Befehl die Werte des SHOW MASTER STATUS; Befehls verwendest, den Du auf server2 ausgeführt hast:

server1:

CHANGE MASTER TO MASTER_HOST=’192.168.0.101′, MASTER_USER=’slave1_user‘, MASTER_PASSWORD=’slave1_password‘, MASTER_LOG_FILE=’mysql-bin.000009′, MASTER_LOG_POS=783;

Starte dann den Slave auf server1:

server1:

START SLAVE;

Überprüfe dann den Slave Status:

server1:

SHOW SLAVE STATUS;

Es ist wichtig, dass beide, Slave_IO_Running und Slave_SQL_Running den Wert Yes in der Ausgabe aufweisen (sonst ist etwas schief gelaufen und Du solltest Dein Setup nochmal überprüfen und Dir /var/log/syslog ansehen um mögliche Fehler festzustellen):

mysql> SHOW SLAVE STATUS;
+----------------------------------+---------------+-------------+-------------+---------------+------------------+---------------------+--------------------+---------------+-----------------------+------------------+-------------------+-----------------+---------------------+--------------------+------------------------+-------------------------+-----------------------------+------------+------------+--------------+---------------------+-----------------+-----------------+----------------+---------------+--------------------+--------------------+--------------------+-----------------+-------------------+----------------+-----------------------+
| Slave_IO_State                   | Master_Host   | Master_User | Master_Port | Connect_Retry | Master_Log_File  | Read_Master_Log_Pos | Relay_Log_File     | Relay_Log_Pos | Relay_Master_Log_File | Slave_IO_Running | Slave_SQL_Running | Replicate_Do_DB | Replicate_Ignore_DB | Replicate_Do_Table | Replicate_Ignore_Table | Replicate_Wild_Do_Table | Replicate_Wild_Ignore_Table | Last_Errno | Last_Error | Skip_Counter | Exec_Master_Log_Pos | Relay_Log_Space | Until_Condition | Until_Log_File | Until_Log_Pos | Master_SSL_Allowed | Master_SSL_CA_File | Master_SSL_CA_Path | Master_SSL_Cert | Master_SSL_Cipher | Master_SSL_Key | Seconds_Behind_Master |
+----------------------------------+---------------+-------------+-------------+---------------+------------------+---------------------+--------------------+---------------+-----------------------+------------------+-------------------+-----------------+---------------------+--------------------+------------------------+-------------------------+-----------------------------+------------+------------+--------------+---------------------+-----------------+-----------------+----------------+---------------+--------------------+--------------------+--------------------+-----------------+-------------------+----------------+-----------------------+
| Waiting for master to send event | 192.168.0.101 | slave1_user |        3306 |            60 | mysql-bin.000009 |                 783 | slave-relay.000002 |           235 | mysql-bin.000009      | Yes              | Yes               | exampledb       |                     |                    |                        |                         |                             |          0 |            |            0 |                 783 |             235 | None            |                |             0 | No                 |                    |                    |                 |                   |                |                     0 |
+----------------------------------+---------------+-------------+-------------+---------------+------------------+---------------------+--------------------+---------------+-----------------------+------------------+-------------------+-----------------+---------------------+--------------------+------------------------+-------------------------+-----------------------------+------------+------------+--------------+---------------------+-----------------+-----------------+----------------+---------------+--------------------+--------------------+--------------------+-----------------+-------------------+----------------+-----------------------+
1 row in set (0.00 sec)

mysql>

Danach kannst Du die MySQL Kommandozeile verlassen:

quit

Wenn nichts schief gegangen ist, sollte die MySQL Master-Master Replikation nun funktionieren. Wenn nicht, überprüfe bitte /var/log/syslog wegen MySQL Fehlern auf server1 und server2.

5 Links

Das könnte dich auch interessieren …