Replikacja Master – Slave w MySQL

Tym razem opiszemy jak skonfigurować replikację MySQL typu Master – Slave. Jest to typ jednokierunkowej synchronizacji danych, gdzie wszelkie zmiany wykonane na serwerze master będą widoczne także na serwerze slave.

Środowisko testowe

Do konfiguracji użyjemy 2 wirtualnych maszyn z zainstalowanym systemem CentOS 6.2. Załóżmy, że IP serwera master to 1.1.1.1, a serwera slave to 1.1.1.2:

  • master => 1.1.1.1
  • slave => 1.1.1.2
mysql -V
mysql  Ver 14.14 Distrib 5.5.25, for Linux (x86_64) using readline 5.1
uname -a
Linux master 2.6.32-220.23.1.el6.x86_64 #1 SMP Mon Jun 18 18:58:52 BST 2012 x86_64 x86_64 x86_64 GNU/Linux

Konfiguracja

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

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

oraz na maszynie slave:

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

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

Możemy teraz zrestartować proces mysqld:

[root@master ~]# /etc/init.d/mysqld restart
[root@slave ~]# /etc/init.d/mysqld restart

Na serwerze master dodamy nowego użytkownika z prawami do replikacji:

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

Możemy przetestować połączenie z serwera slave:

[root@slave ~]# mysql -u slaveuser -h 1.1.1.1 -p
Enter password: *****
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 979
Server version: 5.5.25-log MySQL Community Server
...

Pobranie współrzędnych pliku replikacji

Wraz z włączeniem replikacji mysql tworzy pliki dziennika w katalogu /var/log/mysql (dokładnie tak jak zdefiniowaliśmy w pliku /etc/my.cnf). Do synchronizacji serwera slave z master, musimy znać aktualną pozycję tego pliku. Musimy też zablokować możliwość dodawania/edycji/usuwania danych z naszej bazy na pewien czas, ponieważ każda z tych operacji powoduje zmianę współrzędnych. Na serwerze master wpisujemy:

mysql> FLUSH TABLES WITH READ LOCK;
mysql> show master status \G
*************************** 1. row ***************************
File: mysql-bin.000001
Position: 107
Binlog_Do_DB:
Binlog_Ignore_DB:

Jak widzimy powyżej, aktualny plik dziennika to mysql-bin.000001, a pozycja ma wartość = 107.

Eksport i import baz danych

Kolejnym krokiem jest eksport bazy z serwera master na slave.

[root@master ~]# mysqldump --add-drop-table --master-data --quick -u superroot -p --all-databases > /tmp/db-master.sql

Bo zrzuceniu bazy, możemy odblokować tabele:

mysql> UNLOCK TABLES;

Następnie kopiujemy plik db-master.sql na serwer slave:

[root@master ~]# scp /tmp/db-maser.sql root@1.1.1.2:/tmp

oraz importujemy ją (przedtem musimy zatrzymac process slave):

mysql> STOP SLAVE:
mysql> source /tmp/db-master.sql

Konfiguracja serwera Slave

Ostatnim krokiem jest „powiedzenie” serwerowi slave, gdzie jest znajduje się master:

mysql> CHANGE MASTER TO
MASTER_HOST='1.1.1.1',
MASTER_USER='slaveuser',
MASTER_PASSWORD='haslo',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=107;

Gdzie MASTER_LOG_FILE i MASTER_LOG_POS to współrzędne dziennika replikacji, które pobraliśmy wczesniej (show master status). Teraz możemy ponownie uruchomić proces slave oraz sprawdzić jego status:

mysql> start slave;
mysql> show slave status \G
*************************** 1. row ***************************
Slave_IO_Running: Yes
Slave_SQL_Running: Yes

Jeżeli wartość Slave_IO_Running oraz Slave_SQL_Running jest ustawiona na Yes oznacza to, że wszystko działa. Możemy teraz przetestować replikację, zmieniając coś w bazie na serwerze master. Zmiana powina być natychmiast widoczna na serwerze slave. Należy też pamietać, że zmiany wykonane tylko na serwerze slave mogą prowadzić do błędów oraz zatrzymania replikacji.

  1. Replikacja Master – Master w MySQL | ITCore Tech - pingback on 2012/08/08 w 10:09

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

*

Trackback'i i Pingback'i: