REPLICAÇÃO DE DADOS
Wagner Bianchi Certified MySQL 5.0 Developer
Certified MySQL 5.0 Database Administrator Certified MySQL 5.1 Cluster Database Administrator
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!!!)
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;
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;
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;
Setup: replicação clássica
! Criando um usuário para replicação no MASTER:
! Fazendo o backup completo do MASTER:
! Transferindo o arquivo de backup para o SLAVE:
mysql> grant replication slave on *.* to rpl@'%' identified by '123456';!
# 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;”!
# scp mybackup.dmp [email protected]:/root!
MASTER: 192.168.0.100 <= SLAVE: 192.168.0.101!
Setup: replicação clássica ! Fazendo o restore do backup no MySQL SLAVE:
! Habilitando o log binário e configurando o server_id:
! Reinicie o MySQL MASTER e SLAVE:
# mysql -u root -p < mybackup.dmp
#: master!# vim /etc/my.cnf![mysqld]!server_id = 1!log_bin=mysql01-bin!!#: slave![mysqld]!server_id = 2!
[ root@mysql01 ~]# service mysqld restart![ root@mysql02 ~]# service mysqld restart
Setup: replicação clássica ! Obtendo no MASTER as coordenadas de replicação:
! Configuramos o SLAVE como READ_ONLY:
! Configurando a replicação no servidor SLAVE com o comando CHANGE MASTER TO:
! Iniciando a replicação, no SLAVE:
mysql> set global read_only=1;!
mysql> change master to master_host=‘192.168.0.100’, ! master_log_pos=120,master_log_file=‘mysql01-bin.000001’;
mysql> show master status\G
mysql> start slave user=‘rpl’ password=‘123456’;
Setup: replicação clássica ! Verifique o status da replicação com SHOW SLAVE STATUS: # mysql –u root –p –e “show slave status\G”! 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 […]!!
Testando a replicação clássica ! No servidor MASTER, criamos um banco de dados com o
nome `meudb`:
! No servidor SLAVE verificamos se os dados foram replicados:
! 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!
mysql> create database meudb;!
mysql> show databases;!
Replicação GTID ! 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;
3E11FA47-71CA-11E1-9E33-C80AA9429562:23!
@@server_uuid!
trx_id!
MASTER: 192.168.0.100 <= SLAVE: 192.168.0.101!
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
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;!
!
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)!
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]:
! Fazemos o restart após a edição do arquivo de configuração:
[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)!
# service mysqld restart!
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)!
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)!
Setup: replicação GTID ! Depois de confirmarmos as configurações, no SLAVE,
precisamos parar e dar um reset na replicação clássica:
! Como já temos um usuário para replicação no MASTER, basta enviarmos o comando CHANGE MASTER TO:
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)!
mysql> change master to master_host=‘192.168.0.100’, ! master_auto_position=1;
Setup: replicação GTID ! Damos um start na replicação GTID:
! Verificamos o status da replicação: mysql> show slave status\G!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!
mysql> start slave user=‘rpl’ password=‘123456’;!
Yes!!!! We’re done & happy now!!!