Chwilę temu na tym blogu pojawiły się dwa posty (ten i ten), które opisywały zasadę działania mechanizmu replikacji zastosowanego w MySQL. Pisałem tam, że zajmiemy się także tym, w jaki sposób konfiguruje się serwery MySQL aby replikacja działała poprawnie. Zajmiemy się tym dziś właśnie.

Jeśli serwery są puste, konfiguracja jest banalna. Upewniamy się, że w konfiguracji obu serwerów zdefiniowane jest id serwera. Definiujemy je na przykład w pliku konfiguracyjnym:

[mysqld]
server-id=1

Ważne jest, aby id był różny na każdym serwerze, który będzie brał udział w procesie replikacji, czy to jako master czy to jako jeden z serwerów slave. Zazwyczaj id ustawiane jest tak, że serwer master ma ustawioną tą zmienną na 1, ale jest to tylko zwyczaj i nie ma to wpływu na działanie replikacji. Id można ustawić dowolnie, byle się nie pokrywały. Następnie sprawdzamy na którym pliku binlogu i na jakiej pozycji znajduje się serwer master:

mysql> SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000543 |   341053 |              |                  |
+------------------+----------+--------------+------------------+
1 row in set (0,00 sec)

Tu dane są wzięte z działającego serwera, w przypadku czystego numer binlogu zazwyczaj będzie gdzieś w rejonie 1, pozycja także bliżej początku. Dwie ostatnie kolumny są stosunkowo istotne, o szczegółach będzie później.

Do działania replikacji potrzebujemy utworzyć na masterze użytkownika, który będzie miał odpowiednie prawa:

CREATE USER 'slave_user'@'slave_host' IDENTIFIED BY 'jakies_haslo';
GRANT REPLICATION SLAVE ON *.* TO 'slave_user'@'slave_host';

Mając powyższe dane możemy uruchomić replikację. Na serwerze slave wykonujemy zapytanie:

CHANGE MASTER TO
MASTER_HOST = 'host_do_polaczenia_z_masterem',
MASTER_USER = 'slave_user',
MASTER_PASSWORD = 'jakies_haslo',
MASTER_LOG_FILE = 'mysql-bin.000543',
MASTER_LOG_POS = 341053;

Oczywiście, jako użytkownika i hasło podajemy dane dostępowe tego użytkownika, którego chwilę wcześniej dodaliśmy na masterze. Po wykonaniu tego polecenia możemy uruchomić replikację:

START SLAVE;

Działanie replikacji możemy sprawdzić poleceniem:

SHOW SLAVE STATUS\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: master.example.com
Master_User: root
Master_Port: 3306
Connect_Retry: 3
Master_Log_File: mysql-bin.000543
Read_Master_Log_Pos: 341053
Relay_Log_File: relay-bin.005
Relay_Log_Pos: 548
Relay_Master_Log_File: mysql-bin.000543
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
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: 79
Relay_Log_Space: 552
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: 8

To, co jest najważniejsze, to kolumny:

Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Last_Errno: 0
Last_Error:

W tym momencie widać, że oba wątki działają poprawnie (I/O i SQL). Gdyby pojawiły się jakieś problemy, przynajmniej jeden z nich nie funkcjonowałby poprawnie a w kolumnie Last_Error i Last_errno pojawiłyby się informacje, które powinny (teoretycznie) wyjaśnić na czym problem polega. Czasami przydatne informacje można także znaleźć w errorlogu.

Jeśli wszystko poszło ok, replikacja jest poprawnie skonfigurowana. W tym momencie możemy zacząć wgrywać dane (np. z backupu) na serwer master, wszelkie operacje realizowane przez SQL na masterze będą replikowane na slave.

Powyższe to, umówmy się, czysta teoria. W praktyce rzadko kiedy jest okazja konfigurować replikację od zera, przy pustym serwerze master. Zazwyczaj są tam już jakieś dane, a sam serwer działa produkcyjnie i zależałoby nam na tym, aby przerwa w jego działaniu, związana z konfiguracją replikacji, była jak najkrótsza. Kolejny odcinek (tym razem przerwa będzie znacznie krótsza)  będzie właśnie o tym, co zrobić, jeśli mamy już działający serwer i trzeba wykonać jego replikę.