1. REPLICAÇÃO DE DADOS
Wagner Bianchi
Certified MySQL 5.0 Developer
Certified MySQL 5.0 Database Administrator
Certified MySQL 5.1 Cluster Database Administrator
2. Para iniciarmos...
! Nesta parte vamos falar de replicação de dados MySQL;
! Não vamos falar de backup, replicação é diferente;
! Atualmente, há três modelo de replicação no MySQL:
– Replicação Clássica, assíncrona;
– Replicação Clássica, semisíncrona;
– Replicação GTID, assíncrona;
! MySQL e replicação síncrona somente com MySQL Cluster;
! MySQL e replicação com base em certificados, Galera Cluster;
! O nosso foco aqui:
– Replicação Clássica e GTID (novidade do MySQL 5.6!!!)
3. Como funciona a replicação?
! Características principais do serviço:
– Servidores MASTER e servidores SLAVE;
– Um MASTER pode ter vários SLAVE;
– Um SLAVE pode ter somente um MASTER;
4. Ainda mais características...
! No MASTER, o SLAVE possui um usuário que é utilizado
para conexão e leitura dos logs binários;
! O SLAVE possui duas threads utilizadas para:
– IO_THREAD: conexão direta com o MASTER para ler os logs
binários e trazer tudo que foi alterado no MASTER e depositar
em logs denominados relay log;
– SQL_THREAD: lê o relay log e executa os comandos que
alteraram os dados dos bancos de dados no MASTER;
! Com essa sequência de execuções, o servidor ou, os
servidores SLAVE conseguem se manter em sincronia com o
MASTER;
5. Setup: replicação clássica
! Tarefas básicas antes do setup:
– Qual dos servidores será o MASTER e qual será o SLAVE?
– Configurar os Ips das máquinas como fixo/estático;
– Criar um usuário para replicação no MASTER;
– Fazer um backup no MASTER;
– Transferir o backup para o SLAVE;
– Fazer o restore do backup no SLAVE;
– Configurar a variável server_id com valores únicos;
– Obter as coordenadas do log binário do MASTER;
– Configurar a replicação no SLAVE;
6. Setup: replicação clássica
MASTER: 192.168.0.100 <= SLAVE: 192.168.0.101!
! Criando um usuário para replicação no MASTER:
mysql> grant replication slave on *.* to rpl@'%' identified by '123456';!
! Fazendo o backup completo do MASTER:
# mysql -u root -p -e "flush tables with read lock;”!
# mysqldump -u root -p --all-databases > mybackup.dmp !
# mysql -u root -p -e "unlock tables;”!
! Transferindo o arquivo de backup para o SLAVE:
# scp mybackup.dmp root@192.168.0.101:/root!
7. Setup: replicação clássica
! Fazendo o restore do backup no MySQL SLAVE:
# mysql -u root -p < mybackup.dmp
! Habilitando o log binário e configurando o server_id:
#: master!
# vim /etc/my.cnf!
[mysqld]!
server_id = 1!
log_bin=mysql01-bin!
!
#: slave!
[mysqld]!
server_id = 2!
! Reinicie o MySQL MASTER e SLAVE:
[ root@mysql01 ~]# service mysqld restart!
[ root@mysql02 ~]# service mysqld restart
8. Setup: replicação clássica
! Obtendo no MASTER as coordenadas de replicação:
mysql> show master statusG
! Configuramos o SLAVE como READ_ONLY:
mysql> set global read_only=1;!
! Configurando a replicação no servidor SLAVE com o
comando CHANGE MASTER TO:
mysql> change master to master_host=‘192.168.0.100’, !
master_log_pos=120,master_log_file=‘mysql01-bin.000001’;
! Iniciando a replicação, no SLAVE:
mysql> start slave user=‘rpl’ password=‘123456’;
9. Setup: replicação clássica
! Verifique o status da replicação com SHOW SLAVE STATUS:
# mysql –u root –p –e “show slave statusG”!
Slave_IO_State: Waiting for master to send event!
Slave_IO_Running: Yes!
Slave_SQL_Running: Yes!
Seconds_Behind_Master: 0!
Master_SSL_Verify_Server_Cert: No!
Last_IO_Errno: 0!
Last_IO_Error:!
Last_SQL_Errno: 0!
Last_SQL_Error:!
Master_Server_Id: 1!
Master_UUID: f8a2570c-3237-11e4-8fa9-0800274fb806!
Master_Info_File: /var/lib/mysql/master.info!
SQL_Delay: 0!
SQL_Remaining_Delay: NULL!
Slave_SQL_Running_State: Slave has read all relay log; waiting for the slave I/O
thread to update it!
Master_Retry_Count: 86400 […]!
!
10. Testando a replicação clássica
! No servidor MASTER, criamos um banco de dados com o
nome `meudb`:
mysql> create database meudb;!
! No servidor SLAVE verificamos se os dados foram replicados:
mysql> show databases;!
! Se o banco de dados criado no MASTER é exibido na lista de
bancos de dados do comando SHOW DATABASES, a
replicação foi configurada com sucesso!
11. Replicação GTID
MASTER: 192.168.0.100 <= SLAVE: 192.168.0.101!
! Novo modelo de replicação disponível no MySQL 5.6 ++;
! GTID significa Global Transaction Identifier;
! Cada servidor em uma topologia GTID tem um UUID;
! Cada transação executada receba um ID;
@@server_uuid!
3E11FA47-71CA-11E1-9E33-C80AA9429562:23!
trx_id!
12. Replicação GTID
! O log binário é gravado de forma diferente;
Replicação GTID:
Não necessita indicar posição do log;
Fácil recuperação em caso de falha;
Fácil visualização em caso de lagging;
Fácil configuração, AUTO_POSTION
13. Replicação GTID
! Variáveis de ambiente mandatórias em todos os servidores
de bancos de dados MySQL envolvidos na replicação:
[mysqld]!
gtid_mode=on # habilita o tipo de replicação!
log_bin=name-bin # habilita o log binário!
log_slave_updates # sem replicação em loop!
enforce_gtid_consistency # força consistência (safe mode)!
!–
enforce_gtid_consistency executará somente consultas que
possam ser executadas em modo seguro e que possam ser
envolvidas em meio à transações. Instruções problemáticas: !
• CREATE TABLE ... SELECT;!
• CREATE TENPORARY TABLE em transações;!
!
14. Replicação GTID
! Consultando o valor atual das variáveis requeridas para o
funcionamento da replicação GTID:
mysql> select @@server_id,!
-> @@gtid_mode as gtid,!
-> @@log_bin as binlog,!
-> @@log_slave_updates as logslaveupdates,!
-> @@enforce_gtid_consistency safe_trxs;!
+-------------+------+--------+-----------------+-----------+!
| @@server_id | gtid | binlog | logslaveupdates | safe_trxs |!
+-------------+------+--------+-----------------+-----------+!
| 1 | OFF | 0 | 0 | 0 |!
+-------------+------+--------+-----------------+-----------+!
1 row in set (0.00 sec)!
15. Setup: replicação GTID
! Edite o arquivo de configuração do MySQL (my.cnf) nos
servidores MASTER e SLAVE e inclua as variáveis
mandatórias abaixo da seção [mysqld]:
[mysqld]!
server_id=1 # configure 1 master, 2 slave!
gtid_mode=on # habilita o tipo de replicação!
log_bin=name-bin # habilita o log binário!
log_slave_updates # sem replicação em loop!
enforce_gtid_consistency=true # força consistência (safe mode)!
! Fazemos o restart após a edição do arquivo de configuração:
# service mysqld restart!
16. Setup: replicação GTID
! Certificamos se as variáveis configuradas foram realmente
reconfiguradas a partir do arquivo de configuração:
#: servidor master!
mysql> select @@server_id, !
@@gtid_mode as gtid, !
@@log_bin as binlog, !
@@log_slave_updates as logslaveupdates, !
@@enforce_gtid_consistency safe_trxs;!
+-------------+------+--------+-----------------+-----------+!
| @@server_id | gtid | binlog | logslaveupdates | safe_trxs |!
+-------------+------+--------+-----------------+-----------+!
| 1 | ON | 1 | 1 | 1 |!
+-------------+------+--------+-----------------+-----------+!
1 row in set (0.00 sec)!
17. Setup: replicação GTID
! Certificamos se as variáveis configuradas foram realmente
reconfiguradas a partir do arquivo de configuração:
#: servidor slave!
mysql> select @@server_id, !
@@gtid_mode as gtid, !
@@log_bin as binlog, !
@@log_slave_updates as logslaveupdates, !
@@enforce_gtid_consistency safe_trxs;!
+-------------+------+--------+-----------------+-----------+!
| @@server_id | gtid | binlog | logslaveupdates | safe_trxs |!
+-------------+------+--------+-----------------+-----------+!
| 2 | ON | 1 | 1 | 1 |!
+-------------+------+--------+-----------------+-----------+!
1 row in set (0.00 sec)!
18. Setup: replicação GTID
! Depois de confirmarmos as configurações, no SLAVE,
precisamos parar e dar um reset na replicação clássica:
mysql> stop slave; -- para as duas threads de replicação!
Query OK, 0 rows affected (0.05 sec)!
!
mysql> reset slave; -- reinicia as configurações de replicação!
Query OK, 0 rows affected (0.38 sec)!
! Como já temos um usuário para replicação no MASTER,
basta enviarmos o comando CHANGE MASTER TO:
mysql> change master to master_host=‘192.168.0.100’, !
master_auto_position=1;
19. Setup: replicação GTID
! Damos um start na replicação GTID:
mysql> start slave user=‘rpl’ password=‘123456’;!
! Verificamos o status da replicação:
mysql> show slave statusG!
Slave_IO_State: Waiting for master to send event!
Master_Host: 192.168.0.101!
Master_User: rpl!
Master_Port: 3306!
Connect_Retry: 60!
Master_Log_File: mysql02-bin.000004!
Read_Master_Log_Pos: 407!
Relay_Log_File: mysqld-relay-bin.000002!
Relay_Log_Pos: 621!
Relay_Master_Log_File: mysql02-bin.000004!
Slave_IO_Running: Yes!
Slave_SQL_Running: Yes!
Retrieved_Gtid_Set: b80666fd-32da-11e4-93ce-0800274fb806:1-2!
Executed_Gtid_Set: b80666fd-32da-11e4-93ce-0800274fb806:1-2!
Auto_Position: 1!