Spis treści
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.
0 Komentarze.