Post on 24-May-2015
description
Replicação MySQLFundamentos, Funcionamento,
Monitoração e Aplicação na Prática
HTI Consultoria e TecnologiaAlexandre M de Almeida
www.hti.com.bralexandre@hti.com.br
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=0SET 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=0use 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=0SET TIMESTAMP=1319635794/*!*/;BEGIN/*!*/;# at 604#111026 17:29:54 server id 100 end_log_pos 632 IntvarSET 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=0SET TIMESTAMP=1319635794/*!*/;insert into belezinha values (null,'primeiro registro')/*!*/;# at 760#111026 17:29:54 server id 100 end_log_pos 787 Xid = 515COMMIT/*!*/;
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 wayMaster n Slave(s)
• Two way (master/master)Master Master
• CircularMaster 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 SLAVEON *.* 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 slaveshell> 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çarmysql> START SLAVE;
• Verifique se está tudo funcionandomysql> SHOW SLAVE STATUS\G
*************************** 1. row ***************************Slave_IO_State: Waiting for master to send eventSlave_IO_Running: YesSlave_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 "select variable_value from information_schema.global_status where variable_name = 'slave_running';" --batch --skip-column-names`
# ------------------------------ SLAVE-Aslave_a_3306=`/usr/local/mysql/bin/mysql -uhti -p'hti_monitor_123' -h192.168.1.3 -P3306 -e "select variable_value from information_schema.global_status where variable_name = 'slave_running';" --batch --skip-column-names`
# ------------------------------ SLAVE-Bslave_b_3306=`/usr/local/mysql/bin/mysql -uhti -p'hti_monitor_123' -h192.168.1.10 -P3306 -e "select variable_value from information_schema.global_status where variable_name = 'slave_running';" --batch --skip-column-names`
# ------------------------------ VERIFICACOES
servers="Servidores com falha na replicacao: "
[ "$slave_a_3306" != "ON" ] && servers=$servers"[slave_a:3306] ”
[ "$slave_b_3306" != "ON" ] && servers=$servers"[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!