Replikacja Master – Master w MySQL

Na łamach naszego bloga opisaliśmy jak stworzyć replikację MySQL typu Master – Slave. Teraz wracamy do tematu replikacji, ale typu Master – Master. Jak łatwo się domyślić jest to dwukierunkowa synchronizacja danych, więc wszelkie zmiany wykonane na którymkolwiek z serwerów będą widoczne też na drugim z nich.

Środowisko testowe

Do konfiguracji użyjemy 2 wirtualnych maszyn z zainstalowanym systemem OpenBSD 5.1:

  • obsd51-m1 => 192.168.1.250
  • obsd51-m2 => 192.168.1.247
root@obsd51-m1:~>mysql -V
mysql  Ver 14.14 Distrib 5.1.60, for unknown-openbsd5.1 (i386) using readline 4.3

Konfiguracja

Każda z maszyn ma świeżo zainstalowany pakiet mysql-client i mysql-server. W pliku /etc/my.cnf dodajemy następujące linie:

server-id = 1
log-bin = /var/log/mysql/mysql-bin.log
sync_binlog = 1

master-host = 192.168.1.247
master-user = slaveuser
master-password = haslo
master-connect-retry = 60

oraz na maszynie obsd51-m2:

server-id = 2
log-bin = /var/log/mysql/mysql-bin.log
sync_binlog=1

master-host = 192.168.1.250
master-user = slaveuser
master-password = haslo
master-connect-retry = 60

Pamiętajmy, że server-id musi mieć unikalną wartość na każdym z serwerów oraz być różnym od 0. Chcemy też, żeby mysql automatycznie usuwał pliki mysql-bin.log starsze niż 10 dni, a maksymalna wielkość pojedynczego pliki to 500MB. Warto też się upewnić czy wartość opcji innodb_flush_log_at_trx_commit jest równa 1.

expire_logs_days        = 10
max_binlog_size         = 500M
innodb_flush_log_at_trx_commit = 1

W pliku zdefiniowaliśmy też użytkownika z prawami do replikacji, więc musimy go teraz stworzyć. Dla serwera obsd51-m1:

mysql> CREATE USER 'slaveuser'@'192.168.1.247' IDENTIFIED BY 'haslo';
mysql> GRANT REPLICATION SLAVE ON *.* TO 'slaveuser'@'192.168.1.247';
mysql> flush privileges;

oraz obsd51-m2:

mysql> CREATE USER 'slaveuser'@'192.168.1.250' IDENTIFIED BY 'haslo';
mysql> GRANT REPLICATION SLAVE ON *.* TO 'slaveuser'@'192.168.1.250';
mysql> flush privileges;

Na każdym z serwerów tworzymy katalog /var/log/mysql z pełnymi prawami dla użytkownika _mysql:

root@obsd51-m2:/etc>mkdir /var/log/mysql
root@obsd51-m2:/etc>chown _mysql._mysql /var/log/mysql/

Możemy przetestować połączenie z jednego serwera na drugi (przykładowo z obsd51-m1 na obsd51-m2):

root@obsd51-m1:~>mysql -u slaveuser -h 192.168.1.247 -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Server version: 5.1.60-log OpenBSD port: mysql-server-5.1.60
...

Teraz restart daemona mysqld na naszych serwerach:

root@obsd51-m1:~>/etc/rc.d/mysqld restart
mysqld(ok)
root@obsd51-m2:~>/etc/rc.d/mysqld restart
mysqld(ok)

Sprawdzamy status master i slave na każdym z serwerów. Dla obsd51-m1:

mysql> show slave status \G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.1.247
                  Master_User: slaveuser
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000002
          Read_Master_Log_Pos: 106
               Relay_Log_File: obsd51-m1-relay-bin.000025
                Relay_Log_Pos: 251
        Relay_Master_Log_File: mysql-bin.000002
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes

mysql> show master status \G
*************************** 1. row ***************************
            File: mysql-bin.000002
        Position: 106

i dla obsd51-m2:

mysql> show slave status \G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.1.250
                  Master_User: slaveuser
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000002
          Read_Master_Log_Pos: 189
               Relay_Log_File: obsd51-m2-relay-bin.000024
                Relay_Log_Pos: 334
        Relay_Master_Log_File: mysql-bin.000002
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes

mysql> show master status \G
*************************** 1. row ***************************
            File: mysql-bin.000002
        Position: 191

Podobnie jak w przypadku replikacji master-slave zmienne Slave_IO_Running i Slave_SQL_Running muszą mieć wartość Yes. Teoretycznie replikacja master-master już działa, czas więc na test. Utworzymy testową bazę na serwerze obsd51-m2, a następnie usuniemy ją na obsd51-m1. Wszystkie zmiany powinny być widoczny na każdym z serwerów:

mysql> create database bazatestowa;
Query OK, 1 row affected (0.00 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| bazatestowa        |
| mysql              |
+--------------------+
3 rows in set (0.00 sec)

Baza jest też widoczna na drugim serwerze (obsd51-m1):

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| bazatestowa        |
| mysql              |
+--------------------+
3 rows in set (0.00 sec)

mysql> drop database bazatestowa;
Query OK, 0 rows affected (0.00 sec)

I wracamy do obsd51-m2:

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| bazatestowa        |
| mysql              |
+--------------------+
2 rows in set (0.01 sec)

Świetnie, replikacja master-master działa jak należy.

Zostaw komentarz


Podpowiedź - możesz użyć tych HTML tagów i atrybutów:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

Obraz CAPTCHY

*