Dando continuidade ao post anterior vamos ver um exemplo de como configurar 2 masters e 1 slave utilizando multi-source replication.
Como foi dito anteriormente, por enquanto esta funcionalidade esta disponível somente na versão labs.
A configuração em si é muito simples, vamos precisar de 2 masters utilizando GTID(veja este outro post e aprenda como configurar) e o slave com as opções para garantir o chamado “crash-safe”.
Master 1 e 2:
gtid-mode=on enforce-gtid-consistency
Slave
master_info_repository=TABLE relay_log_info_repository=TABLE gtid-mode=on enforce-gtid-consistency
Vamos primeiro criar o usuário para replicação:
master1 [localhost] {msandbox} ((none)) > GRANT REPLICATION SLAVE ON *.* TO 'slave_user'@'127.0.0.1' IDENTIFIED BY '123'; master2 [localhost] {msandbox} ((none)) > GRANT REPLICATION SLAVE ON *.* TO 'slave_user'@'127.0.0.1' IDENTIFIED BY '123';
Vamos configurar o slave normalmente, com apenas um novo detalhe, foi introduzida a opção FOR CHANNEL. Essa opção basicamente vai identificar cada master que o nosso slave vai se conectar:
slave [localhost] {msandbox} ((none)) > CHANGE MASTER TO MASTER_HOST="127.0.0.1", MASTER_USER="slave_user", MASTER_PASSWORD="123", MASTER_PORT=7773 FOR CHANNEL="channel1"; slave [localhost] {msandbox} ((none)) > CHANGE MASTER TO MASTER_HOST="127.0.0.1", MASTER_USER="slave_user", MASTER_PASSWORD="123", MASTER_PORT=7774 FOR CHANNEL="channel2";
Agora basta iniciar a replicação:
slave [localhost] {msandbox} ((none)) > START SLAVE FOR ALL CHANNELS;
Vamos inserir alguns dados em ambos os masters para ver se eles são replicados no servidor slave:
master1 [localhost] {msandbox} ((none)) > CREATE TABLE test.tst1 (ID INT); Query OK, 0 rows affected (0.12 sec) master1 [localhost] {msandbox} ((none)) > INSERT INTO test.tst1 SET ID=1; Query OK, 1 row affected (0.01 sec) master2 [localhost] {msandbox} ((none)) > CREATE TABLE test.tst2 (ID INT); Query OK, 0 rows affected (0.06 sec) master2 [localhost] {msandbox} ((none)) > INSERT INTO test.tst2 SET ID=2; Query OK, 1 row affected (0.01 sec) slave [localhost] {msandbox} ((none)) > USE test; Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Database changed slave [localhost] {msandbox} (test) > SHOW TABLES; +----------------+ | Tables_in_test | +----------------+ | tst1 | | tst2 | +----------------+ 2 rows in set (0.00 sec) slave [localhost] {msandbox} (test) > SELECT * FROM tst1; +------+ | ID | +------+ | 1 | +------+ 1 row in set (0.00 sec) slave [localhost] {msandbox} (test) > SELECT * FROM tst2; +------+ | ID | +------+ | 2 | +------+ 1 row in set (0.00 sec)
Fácil não???
Alguns comandos uteis para se utilizar:
START | STOP SLAVE [SQL_THREAD | IO_THREAD] FOR CHANNEL=”channel name"; START | STOP SLAVE [SQL_THREAD | IO_THREAD] FOR ALL CHANNELS; SHOW SLAVE STATUS FOR CHANNEL='channel name'\G FLUSH RELAY LOGS FOR CHANNEL="channel name"; RESET SLAVE FOR CHANNEL="channel name";
Isso ai, temos nosso slave recebendo dados de ambos os master via multi-source replication.