Replicação MySQL Fundamentos, Funcionamento, Monitoração e Aplicação na Prática HTI Consultoria e Tecnologia Alexandre M de Almeida www.hti.com.br [email_address]
O que é replicação? Replicação => Duplicação Não é uma exclusividade de BD Criar e manter uma “ réplica ” de uma base inteira de bases ou tabelas específicas
Replicar porquê? Aumentar/melhorar:  Disponibilidade capacidade peformance
Componentes  (principais) Master Slave Binary Log Relay Log IO Thread SQL Thread
Master Operações de escrita ou escrita/leitura Um master pode ter vários slaves
Slave Exclusivamente para leitura Um slave pode ter somente um master Hardware depende da aplicação do slave É o slave que determina o master
Binary Log 1/2 Registro de toda alteração no banco Somente “UPDATES” => DDL/DML Registro ordenado => Offset Back UP incremental Recuperação RTO/RPO Aumento de I/O disco Sensível redução de performance Lado do Master*
Binary Log 2/2 … # at 263 #111026 17:28:54 server id 100   end_log_pos 366  Query thread_id=7 exec_time=0 error_code=0 SET TIMESTAMP=1319635734/*!*/; create database vamos_replicar /*!*/; # at 366 #111026 17:29:36 server id 100  end_log_pos 526  Query thread_id=7 exec_time=0 error_code=0 use vamos_replicar/*!*/; SET TIMESTAMP=1319635776/*!*/; create table belezinha (id int not null auto_increment primary key, texto varchar(100)) /*!*/; # at 526 #111026 17:29:54 server id 100  end_log_pos 604  Query thread_id=7 exec_time=0 error_code=0 SET TIMESTAMP=1319635794/*!*/; BEGIN /*!*/; # at 604 #111026 17:29:54 server id 100  end_log_pos 632  Intvar SET INSERT_ID=1/*!*/; # at 632 #111026 17:29:54 server id 100  end_log_pos 760  Query thread_id=7 exec_time=0 error_code=0 SET TIMESTAMP=1319635794/*!*/; insert into belezinha values (null,'primeiro registro') /*!*/; # at 760 #111026 17:29:54 server id 100  end_log_pos 787  Xid = 515 COMMIT/*!*/;
Relay Log Cópia do Binary Log Lado do Slave
I/O Thread Lado do Slave Responsável por: “ Download” do Binary Log Gravação do Relay Log Permissão “Replication Slave” Gerenciamento de Posição
SQL Thread Lado do Slave “ Lê o Relay Log ”  e  “ aplica ”  na base Gerenciamento de posição
Topologia  1/2
Topologia  2/2 One way Master    n Slave(s) Two way (master/master) Master    Master Circular Master a    Master b    Master a
Exemplo de Mundo Real
Montando uma Replicação 1/5 (servidor Master) Ligar Binary Log & Id do servidor Editando o arquivo de configuração (my.cnf) [mysqld] … log-bin server-id = 100 Baixar & Subir o servidor (mysqld) Criar usuário para o(s) slave(s) mysql>  GRANT REPLICATION SLAVE ON *.* TO chupacabras@’10.1.1.%’  IDENTIFIED BY ‘senha123’;
Montando uma Replicação 2/5 (servidor Master)
Montando uma Replicação 3/5 (servidor slave) Ajuste o id do servidor, editando o my.cnf [mysqld]    faça coisa certa mysqld e não mysql … server-id=200 Baixar & Subir servidor (mysql) Restaurar a backup no slave shell>  mysql -uuser –p < minhabkp.sql
Montando uma Replicação 4/5 (servidor slave) Pegue a posição e arquivo da replicação  shell>  head –n25 minhabkp.sql  … -- -- Position to start replication or point-in-time recovery from -- CHANGE MASTER TO MASTER_LOG_FILE='mysqld-bin.000001', MASTER_LOG_POS=263; Diga ao slave quem dá as cartas  shell>  CHANGE MASTER TO  MASTER_HOST = '10.1.1.11',  MASTER_PORT = 3306,  MASTER_USER = 'chupacabras',  MASTER_PASSWORD = 'senha123', MASTER_LOG_FILE = 'mysqld-bin.000001',  MASTER_LOG_POS = 263,  MASTER_CONNECT_RETRY=10;
Montando uma Replicação 5/5 (servidor slave) E deixe a mágica começar mysql>  START SLAVE; Verifique se está tudo funcionando mysql>  SHOW SLAVE STATUS\G *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Slave_IO_Running: Yes Slave_SQL_Running: Yes … Seconds_Behind_Master: 0 …
Monitorando Replicação  1/4 MySQL Monitoring Dashboard  (MES) MONyog OpManager MaatKit Modo Escorpião
Monitorando Replicação  2/4
Monitorando Replicação  3/4
Monitorando Replicação  4/4 # ------------------------------ MASTER-A #master_a_3306=`/usr/local/mysql/bin/mysql -uhti -p'hti_monitor_123' -h192.168.1.1 -P3306 riel_producao -e &quot;select  variable_value from information_schema.global_status where variable_name = 'slave_running';&quot; --batch --skip-column-names` # ------------------------------ SLAVE-A slave_a_3306=`/usr/local/mysql/bin/mysql -uhti -p'hti_monitor_123' -h192.168.1.3 -P3306 -e &quot;select  variable_value from information_schema.global_status where variable_name = 'slave_running';&quot; --batch --skip-column-names` # ------------------------------ SLAVE-B slave_b_3306=`/usr/local/mysql/bin/mysql -uhti -p'hti_monitor_123' -h192.168.1.10 -P3306 -e &quot;select  variable_value from information_schema.global_status where variable_name = 'slave_running';&quot; --batch --skip-column-names` # ------------------------------ VERIFICACOES servers=&quot;Servidores com falha na replicacao: &quot; [ &quot;$slave_a_3306&quot; != &quot;ON&quot; ] &&  servers=$servers&quot;[slave_a:3306] ” [ &quot;$slave_b_3306&quot; != &quot;ON&quot; ] &&  servers=$servers&quot;[slave_b:3306] ” [ ${#servers} != 36 ] && echo $servers | mail -s ’[MONITORAMENTO: FALHA REPLICACAO]’ socorro@hti.com.br
Já imaginou como usar? Back up on line Back up on line    off-line   Escalabilidade Alta disponibilidade Distribuição Geográfica Usuários malas e seus relatórios Manutenção, etc
Dicas Importantes Natureza Assíncrona Serialização  Hardware envolvido Monitoramento READ_ONLY
Ufa! Perguntas & Respostas (Atenção! Tomates não são permitidos)
Obrigado!

Fundamentos Replicação MySQL

  • 1.
    Replicação MySQL Fundamentos,Funcionamento, Monitoração e Aplicação na Prática HTI Consultoria e Tecnologia Alexandre M de Almeida www.hti.com.br [email_address]
  • 2.
    O que éreplicação? Replicação => Duplicação Não é uma exclusividade de BD Criar e manter uma “ réplica ” de uma base inteira de bases ou tabelas específicas
  • 3.
    Replicar porquê? Aumentar/melhorar: Disponibilidade capacidade peformance
  • 4.
    Componentes (principais)Master Slave Binary Log Relay Log IO Thread SQL Thread
  • 5.
    Master Operações deescrita ou escrita/leitura Um master pode ter vários slaves
  • 6.
    Slave Exclusivamente paraleitura Um slave pode ter somente um master Hardware depende da aplicação do slave É o slave que determina o master
  • 7.
    Binary Log 1/2Registro de toda alteração no banco Somente “UPDATES” => DDL/DML Registro ordenado => Offset Back UP incremental Recuperação RTO/RPO Aumento de I/O disco Sensível redução de performance Lado do Master*
  • 8.
    Binary Log 2/2… # at 263 #111026 17:28:54 server id 100 end_log_pos 366 Query thread_id=7 exec_time=0 error_code=0 SET TIMESTAMP=1319635734/*!*/; create database vamos_replicar /*!*/; # at 366 #111026 17:29:36 server id 100 end_log_pos 526 Query thread_id=7 exec_time=0 error_code=0 use vamos_replicar/*!*/; SET TIMESTAMP=1319635776/*!*/; create table belezinha (id int not null auto_increment primary key, texto varchar(100)) /*!*/; # at 526 #111026 17:29:54 server id 100 end_log_pos 604 Query thread_id=7 exec_time=0 error_code=0 SET TIMESTAMP=1319635794/*!*/; BEGIN /*!*/; # at 604 #111026 17:29:54 server id 100 end_log_pos 632 Intvar SET INSERT_ID=1/*!*/; # at 632 #111026 17:29:54 server id 100 end_log_pos 760 Query thread_id=7 exec_time=0 error_code=0 SET TIMESTAMP=1319635794/*!*/; insert into belezinha values (null,'primeiro registro') /*!*/; # at 760 #111026 17:29:54 server id 100 end_log_pos 787 Xid = 515 COMMIT/*!*/;
  • 9.
    Relay Log Cópiado Binary Log Lado do Slave
  • 10.
    I/O Thread Ladodo Slave Responsável por: “ Download” do Binary Log Gravação do Relay Log Permissão “Replication Slave” Gerenciamento de Posição
  • 11.
    SQL Thread Ladodo Slave “ Lê o Relay Log ” e “ aplica ” na base Gerenciamento de posição
  • 12.
  • 13.
    Topologia 2/2One way Master  n Slave(s) Two way (master/master) Master  Master Circular Master a  Master b  Master a
  • 14.
  • 15.
    Montando uma Replicação1/5 (servidor Master) Ligar Binary Log & Id do servidor Editando o arquivo de configuração (my.cnf) [mysqld] … log-bin server-id = 100 Baixar & Subir o servidor (mysqld) Criar usuário para o(s) slave(s) mysql> GRANT REPLICATION SLAVE ON *.* TO chupacabras@’10.1.1.%’ IDENTIFIED BY ‘senha123’;
  • 16.
    Montando uma Replicação2/5 (servidor Master)
  • 17.
    Montando uma Replicação3/5 (servidor slave) Ajuste o id do servidor, editando o my.cnf [mysqld]  faça coisa certa mysqld e não mysql … server-id=200 Baixar & Subir servidor (mysql) Restaurar a backup no slave shell> mysql -uuser –p < minhabkp.sql
  • 18.
    Montando uma Replicação4/5 (servidor slave) Pegue a posição e arquivo da replicação shell> head –n25 minhabkp.sql … -- -- Position to start replication or point-in-time recovery from -- CHANGE MASTER TO MASTER_LOG_FILE='mysqld-bin.000001', MASTER_LOG_POS=263; Diga ao slave quem dá as cartas shell> CHANGE MASTER TO MASTER_HOST = '10.1.1.11', MASTER_PORT = 3306, MASTER_USER = 'chupacabras', MASTER_PASSWORD = 'senha123', MASTER_LOG_FILE = 'mysqld-bin.000001', MASTER_LOG_POS = 263, MASTER_CONNECT_RETRY=10;
  • 19.
    Montando uma Replicação5/5 (servidor slave) E deixe a mágica começar mysql> START SLAVE; Verifique se está tudo funcionando mysql> SHOW SLAVE STATUS\G *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Slave_IO_Running: Yes Slave_SQL_Running: Yes … Seconds_Behind_Master: 0 …
  • 20.
    Monitorando Replicação 1/4 MySQL Monitoring Dashboard (MES) MONyog OpManager MaatKit Modo Escorpião
  • 21.
  • 22.
  • 23.
    Monitorando Replicação 4/4 # ------------------------------ MASTER-A #master_a_3306=`/usr/local/mysql/bin/mysql -uhti -p'hti_monitor_123' -h192.168.1.1 -P3306 riel_producao -e &quot;select variable_value from information_schema.global_status where variable_name = 'slave_running';&quot; --batch --skip-column-names` # ------------------------------ SLAVE-A slave_a_3306=`/usr/local/mysql/bin/mysql -uhti -p'hti_monitor_123' -h192.168.1.3 -P3306 -e &quot;select variable_value from information_schema.global_status where variable_name = 'slave_running';&quot; --batch --skip-column-names` # ------------------------------ SLAVE-B slave_b_3306=`/usr/local/mysql/bin/mysql -uhti -p'hti_monitor_123' -h192.168.1.10 -P3306 -e &quot;select variable_value from information_schema.global_status where variable_name = 'slave_running';&quot; --batch --skip-column-names` # ------------------------------ VERIFICACOES servers=&quot;Servidores com falha na replicacao: &quot; [ &quot;$slave_a_3306&quot; != &quot;ON&quot; ] && servers=$servers&quot;[slave_a:3306] ” [ &quot;$slave_b_3306&quot; != &quot;ON&quot; ] && servers=$servers&quot;[slave_b:3306] ” [ ${#servers} != 36 ] && echo $servers | mail -s ’[MONITORAMENTO: FALHA REPLICACAO]’ socorro@hti.com.br
  • 24.
    Já imaginou comousar? Back up on line Back up on line  off-line Escalabilidade Alta disponibilidade Distribuição Geográfica Usuários malas e seus relatórios Manutenção, etc
  • 25.
    Dicas Importantes NaturezaAssíncrona Serialização Hardware envolvido Monitoramento READ_ONLY
  • 26.
    Ufa! Perguntas &Respostas (Atenção! Tomates não são permitidos)
  • 27.