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.
Boa tarde Marcelo, tentei executar esse teste mas quando faço o CHANGE MASTER TO ele apresenta um erro no FOR CHANNEL, não aceita o FOR CHANNEL como parte do comando, sabe o que pode ser?
Ronaldo,
Qual a versao de MySQL estas utilizando?
Qual o erro que acontece?
Bom artigo,
Parece que o recurso não está presente na beta corrente – versão “5.7.3-m13”.
Olhei na documentação do “help CHANGE MASTER TO” e não encontrei os parâmetros “FOR CHANNEL|FOR ALL CHANNELS”.
mysql> SHOW VARIABLES LIKE “%version%”;
+————————-+——————————+
| Variable_name | Value |
+————————-+——————————+
| innodb_version | 5.7.3 |
| protocol_version | 10 |
| slave_type_conversions | |
| version | 5.7.3-m13-log |
| version_comment | MySQL Community Server (GPL) |
| version_compile_machine | x86_64 |
| version_compile_os | Linux |
+————————-+——————————+
7 rows in set (0.00 sec)
mysql> START SLAVE FOR ALL CHANNELS;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘FOR ALL CHANNELS’ at line 1
Ola Samy,
Você pode baixar o mysql com suporte a Multi-Source Replication em labs.mysql.com, na parte inferior tem um drop-down, basta selecionar MySQL Multi-source Replication.
abs
Olá Marcelo,
Eu testei a versão 5.7.2, meu comentário foi com a intenção de discutir se a feature pode\poderia ter saído do backlog do produto, pois não está presente na versão beta atual.
Abraços
MySQL 5.7.4 could not recognize ‘For Channel’
what may be the reason?
You need to download MySQL from labs.mysql.com and select the MySQL Multi-source Replication build, which is in version 5.7.2 at the moment.
Eu gostaria de implementar um cenário onde eu replicaria os bancos de dados db1 e db2 entre os servidores A e B, e replicaria os bancos de dados db3 e db4 entre os servidores A e C. Teria como eu associar as opções binlog-do-db ou replicate-do-db com o uso de channels para especificar os bancos de dados que eu desejo replicar? Obrigado.
Acredito que sim,
Se entendi bem tua questão, queres eles configurados como master master onde A e B replicam entre si e A e C replicam entre si:
A < -> B
A < -> C
No servidor A vais ter os bancos db1, db2, db3 e db4 vais configurar ele como slave dos servidores B e C utilizando a opção FOR CHANNEL (ele também será o master destes servidores).
No servidor B vais ter os bancos db1 e db2, como vai querer replicar somente estes 2 bancos do master A, vai adicionar 2 vezes a configuração replicate-do-db no arquivo cnf (uma para cada banco).
No servidor C vais ter a mesma configuraçãodo servidor B, porém, nas opções replicate-do-db adicionadas no arquivo cnf, vais incluir os bancos db3 e db4.
Configura desta maneira e volta aqui para comentar se deu certo.
Abraço!
Hello.
Would it be possible to replicate 20 master into the same DB – I only want the data from a table on each master to on slaveDB – so all info are collected in the same Database.
Hi Per, yes, it should be possible, make sure you configure all your masters with auto_increment_increment and auto_increment_offset. If you only need data from 1 table. If you want only 1 table, have a look if replicate-do-table works with multi source replication.
Thanks
i have multiple tables in each database on diffrent masters so how it would be possible to replicate the data from all masters to one
slave.
Hello ,
I have two production servers worth around 100 GB.I have to setup multi-source replication to a single slave for these servers.My preferable method of backup is percona xtrabackup or enterprise backup.Could you please guide how can i restore the backup to from these two master servers to the slave ?
Hi Dheeraj,
You will have to restore 1 backup normally on this new slave. The second server backup you will have to:
1) dump all the tables structures (CREATE TABLE). You can use mysqldump with –no-data
2) take a full back with xtrabackup
To
restore it on your slave server, follow
https://www.percona.com/doc/percona-xtrabackup/LATEST/innobackupex/restoring_individual_tables_ibk.html
Let me know if it clarifies your question.
Hi Marcelo,
Thank you for your prompt response.I tested this and it worked like charm.