You are on page 1of 11

Universidade Federal do Rio de Janeiro Instituto de Matem atica Departamento de Ci encia da Computa c ao Grupo de Resposta a Incidentes de Seguran ca Rio

de Janeiro, RJ - Brasil

Banco de Dados MySQL Sincroniza c ao em tempo real


GRIS-2014-T-001

Guilherme Alves

A vers ao mais recente deste documento pode ser obtida na p agina ocial do GRIS: http://www.gris.dcc.ufrj.br.

GRIS - Grupo de Resposta a Incidentes de Seguran ca Av. Brigadeiro Trompowski, s/n CCMN Bloco F1 - Decania Cidade Universit aria - Rio de Janeiro/RJ CEP: 21949-900 Telefone: +55 (21) 2598-9491

Este documento e Copyright 2010 GRIS. Ele pode ser livremente copiado desde que sejam respeitadas as seguintes condi c oes: permitido fazer e distribuir c E opias inalteradas deste documento, completo ou em partes, contanto que esta nota de copyright e distribui c ao seja mantida em todas as c opias, e que a distribui c ao n ao tenha ns comerciais. Se este documento for distribu do apenas em parte, instru c oes vedada a distribui de como obt e-lo por completo devem ser inclu das. E c ao de vers oes modicadas deste documento, bem como a comercializa c ao de c opias, sem a permiss ao expressa do GRIS. Embora todos os cuidados tenham sido tomados na prepara c ao deste documento, o GRIS n ao garante a corre c ao absoluta das informa c oes nele contidas, nem se responsabiliza por eventuais conseq u encias que possam advir do seu uso.

Ultima atualiza c ao em: 11 de abril de 2014

Resumo A replica c ao de um servidor MySQL e uma solu c ao para a divis ao da carga de acesso a um sistema e tamb em uma solu c ao para aumento da seguran ca dos dados, pois estes podem estar acess veis em tempo real em mais de uma m aquina f sica. O objetivo deste tutorial e criar um servidor MySQL secund ario que ir a conter todos os dados do servidor MySQL principal e ser a atualizado em tempo real. Para realizar tal tarefa, utilizaremos o software Percona Xtrabackup. Neste tutorial utilizaremos o sistema operacional Debian 7 64bits, mas voc e pode facilmente adaptar os comandos para a necessidade do seu sistema operacional.

Sum ario
1 Condi c oes iniciais necess arias 1.1 Servidor Prim ario . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.2 Servidor Secund ario . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.3 Percona Xtrabackup . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 Etapa 1: download do Programa Xtrabackup 3 Etapa 2: Backup do servidor Prim ario 4 Etapa 3: Copie os arquivos do backup para o ServidorSecundario 5 Etapa 4: Congurando o Servidor MySQL Prim ario 6 Etapa 5: Congurando o Servidor MySQL Secund ario 7 Etapa 6: Iniciando a replica c ao 8 Etapa 7: Verica c ao 3 3 3 3 3 4 4 5 6 6 7

9 Etapa Extra: Adicionando mais Servidores Secund arios ao Principal 7 10 Resolu c ao de Problema comum de sincronismo 11 Refer encias Bibliogr acas 9 9

1
1.1

Condi co es iniciais necess arias


Servidor Prim ario

Um sistema com servidor MySQL instalado, congurado e em execu ca o. Este sistema ser a chamado ServidorPrimario, e ser a onde os dados guardados ser ao replicados para os servidores secund arios. N os assumiremos as seguintes caracter sticas neste sistema: 1. O servidor MySQL pode se comunicar com os outros pela porta padr ao TCP/IP; 2. O servidor SSH est a instalado e congurado; 3. Voc e tem conta de usu ario no sistema com os privil egios necess arios; 4. Voc e tem conta de usu ario no MySQL com os privil egios necess arios; 5. O servidor MySQL possui binlogs enabled e server-id 1;

1.2

Servidor Secund ario

Outro sistema, com servidor MySQL instalado. Este sistema ser a chamado de ServidorSecundario e iremos assumir as mesmas condi co es realizadas no ServidorPrimario, exceto a congura c ao do server-id, que dever a ser server-id 2.

1.3

Percona Xtrabackup

A ferramenta de backup utilizada deve ser instalada em todas as m aquinas envolvidas no sistema.

Etapa 1: download do Programa Xtrabackup

A primeira etapa e o download do software Percona Xtrabackup. A URL do website do desenvolvedor e: http://www.percona.com/software/percona-xtrabackup

# wget http://www.percona.com/redir/downloads/XtraBackup/LATEST/ deb/wheezy/x86_64/percona-xtrabackup_2.1.5-680-1.wheezy_amd64.deb Obs: se o link estiver quebrado provavelmente e porque foi lan cada uma nova vers ao, ent ao ser a necess ario entrar no site do desenvolvedor e baixar a u ltima vers ao lan cada.

Etapa 2: Backup do servidor Prim ario

No ServidorPrimario, realize o seguinte comando no shell para realizar do backup do MySQL:

ServidorPrimario$ innobackupex --user=seuUsuarioBD --password=SENHA /caminho_backup Depois da naliza ca o, esta sa da dever a ser exibida: innobackupex: completed OK!

Isto far a a c opia dos dados do seu MySQL para o diret orio /caminho backup/$TIME STAMP. Voc e solicitou ao Percona XtraBackup (atrav es do script innobackupex) para conectar no servidor de banco de dados, usando o seu usu ario/senha, e fazer um hot-backup de todos os dados existentes (todas as tabelas MyISAM, InnoDB e seus indexes). Para manter o snapshot consistente, agora voc e precisa preparar os dados: ServidorPrimario$ innobackupex --user=seuUsuarioBD --password=SENHA / --apply-log /caminho_backup/$TIMESTAMP/ Voc e precisa selecionar o caminho onde o snapshot foi realizado baseando-se no timestamp, por exemplo /home/backups/2014-01-10 12-45-09. Se tudo estiver OK, o sistema exibir a a mesma mensagem de OK. Desta forma, os logs de transa c oes foram aplicados nos arquivos do banco de dados e novos foram criados, fazendo com que os dados estejam prontos para serem utilizados pelo servidor MySQL. Percona XtraBackup acessa o caminho padr ao do my.cnf. Se voc e possuir um arquivo de congura ca o em um local diferente do padr ao, voc e dever a usar a op ca o --defaults-file =/local_do_my.cnf.

Etapa 3: Copie os arquivos do backup para o ServidorSecundario

Utilize o rsync ou scp para copiar os dados do ServidorPrimario para o ServidorSecundario. Se voc e est a sincronizando diretamente para o diret orio do MySQL do ServidorSecund ario, e altamente recomendado que voc e nalize o seu mysqld antes da c opia. ServidorPrimario$ scp -P22 -r /caminho/para/backup/$TIMESTAMP root@ServidorSecundario:/caminho_para_mysql/

Depois que os dados forem copiados para o ServidorSecund ario, voc e deve realizar uma c opia de seguran ca do diret orio datadir original do MySQL. (Aten c ao: Lembrese de desligar o servidor MySQL antes de mover os dados): ServidorSecundario$ mv /var/lib/mysql /var/lib/mysql_bkp e mova o snapshot copiado do ServidorPrimario para o diret orio do MySQL do ServidorSecund ario: ServidorSecundario$ mv /caminho_para_mysql/$TIMESTAMP /var/lib/mysql Depois de mover os dados, tenha certeza de que o MySQL possui as permiss oes adequadas para acessar os arquivos: ServidorSecundario$ chown -R mysql:mysql /var/lib/mysql No caso dos arquivos ibdata e iblog estarem localizados em diretorios fora do diret orio padr ao do MySQL, voc e dever a coloc a-los no diret orio adequado.

Etapa 4: Congurando o Servidor MySQL Prim ario

Adicione as permiss oes adequadas para o usu ario do Secund ario poder conectar no servidor Prim ario: ServidorPrimario|mysql> GRANT REPLICATION SLAVE ON *.* TO repl@$ipsecundario INDENTIFIED BY $senhasecundario; Tamb em certique-se de que as regras do rewall est ao corretas e o ServidorSecund ario pode conectar no ServidorPrim ario. Teste executando o cliente do MySQL no ServidorSecund ario de modo a conectar-se e autenticar-se no ServidorPrim ario. ServidorSecundario$ mysql --host=ipprimario --user=repl --password=$senhasecundario Verique os privil egios: mysql> SHOW GRANTS;

Etapa 5: Congurando o Servidor MySQL Secund ario


Primeiro copie o arquivo my.cnf do ServidorPrim ario para o ServidorSecund ario:

ServidorSecundario$ scp -P22 /etc/mysql/my.cnf user@ServidorPrimario:/etc/mysql/my.cnf agora altere a linha seguinte no arquivo /etc/mysql/my.cnf: server-id=2 e inicie/reinicie o processo mysqld no ServidorSecund ario. ServidorSecundario$ /etc/init.d/mysqld restart

Etapa 6: Iniciando a replica c ao

a um conte udo Analise o conte udo do arquivo xtrabackup binlog info, que possuir similar a este: ServidorSecundario$ cat /var/lib/mysql/xtrabackup_binlog_info mysql-bin.000001 8922 Execute a instru ca o CHANGE MASTER na console do MySQL e utilize o par usu ario e senha que foi denido na Etapa 3: ServidorSecundario|mysql> CHANGE MASTER TO MASTER_HOST=$ipprimario, MASTER_USER=repl, MASTER_PASSWORD=$senhasecundario, MASTER_LOG_FILE=mysql-bin.000001, MASTER_LOG_POS=8922; onde mysql-bin.000001 e o arquivo denido em xtrabackup_binlog_info e 8922 e a posi c ao encontrada no referido arquivo. Agora inicie o servidor secund ario: ServidorSecundario|mysql> START SLAVE;

Etapa 7: Verica c ao
Voc e pode vericar se tudo ocorreu perfeitamente com o comando:

ServidorSecundario|mysql> SHOW SLAVE STATUS \G ... Slave_IO_Running: Yes Slave_SQL_Running: Yes ... Seconds_Behind_Master: 15 ... Ambas threads IO e SQL precisam estar em execu c ao. Seconds Behind Master signica que o SQL do ServidorSecund ario est a sendo executado atualmente com um tempo de defasagemde 15 segundos em rela ca o ao ServidorPrim ario. Esta estimativa e relacionada com o atraso na comunica c ao entre o ServidorPrimario e o ServidorSecundario. Repare que no in cio, um valor alto pode ser exibido at e que o ambos os servidores estejam sincronizados.

Etapa Extra: Adicionando mais Servidores Secund arios ao Principal

Voc e pode usar este procedimento com uma pequena modica ca o para adicionar mais servidores secund arios ao servidor prim ario. N os utilizaremos o Percona Xtrabackup para clonar um servidor secund ario. Por conveni encia, n os continuaremos utilizando o cen ario anterior, mas iremos adicionar o servidor NOVOServidorSecundario no tutorial. No ServidorSecundario, fa ca um backup completo: ServidorSecundario$ innobackupex --user=seuUsuarioBD --password=SENHA / --slave-info /caminho_backup Utilizando slave-info, o Percona XtraBackup ir a criar um arquivo adicional chamado xtrabackup slave info. Aplique os logs: ServidorSecundario$ innobackupex -aply-log -use-memory=2G /caminho_backup/$TIMESTAMP/

Copie o diret orio do ServidorSecundario para o NOVOServidorSecundario (Aten ca o: certique-se de que o servidor MySQL est a desligado no NOVOServidorSecundario antes de realizar a c opia dos dados do seu datadir): ServidorSecundario$ scp -P22 -r /caminho_backup/$TIMESTAMP root@NOVOServidorSecundario:/var/lib/mysql Adicione as permiss oes necess arias no ServidorPrimario: ServidorPrimario|mysql> GRANT REPLICATION SLAVE ON *.* TO repl2@$ipnovosecundario2 INDENTIFIED BY $senhasecundario; Copie o arquivo de congura c ao do ServidorSecundario: NOVOServidorSecundario$ scp -P22 user@ServidorSecundario:/etc/mysql/ my.cnf /etc/mysql/my.cnf Certique-se de alterar a vari avel server-id dentro do arquivo /etc/mysql/my.cnf para 3 e a skip-slave para desabilitar a replica c ao no in cio: skip-slave-start server-id=3 Ap os congurar o server id, inicie o mysqld. Consulte os dados master log le e master log pos do arquivo xtrabackup slave info, execute a instru ca o para congurar o master e o arquivo de log para o NOVOServidorSecundario: NOVOServidorSecundario|mysql> CHANGE MASTER TO MASTER_HOST=$ipprimario, MASTER_USER=repl2, MASTER_PASSWORD=$senhasecundario2, MASTER_LOG_FILE=mysql-bin.000001, MASTER_LOG_POS=8922; e inicie o novo servidor secund ario: NOVOServidorSecundario|mysql> START SLAVE; O NOVOServidorSecundario estar a replicando o ServidorPrimario se ambas as threads IO e SQL estiverem em execu c ao quando voc e consultar o NOVOServidorSecundario. NOVOServidorSecundario|mysql> SHOW SLAVE STATUS \G ... Slave_IO_Running: Yes Slave_SQL_Running: Yes ... Seconds_Behind_Master: 18 ... 8

10

Resolu c ao de Problema comum de sincronismo

Caso apare ca algum problema de sincronismo durante a execu c ao do servidor, analise se as diretivas Slave IO Running ou Slave SQL Running possuem No em seus valores. Caso alguma possua o valor No, e poss vel analisar o erro em Last Error. ServidorSecundario|mysql> SHOW SLAVE STATUS \G ... Slave_IO_Running: Yes Slave_SQL_Running: No ... Seconds_Behind_Master: 15 ... Caso a query que provocou o erro n ao seja crucial para o sistema, voc e pode ignor a-la para tentar reestabelecer o sincronismo entre os servidores. ServidorSecundario|mysql> STOP SLAVE; ServidorSecundario|mysql> SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1; Inicie novamente o servidor para que a sincroniza c ao seja efetuada: ServidorSecundario|mysql> START SLAVE; Verique se Slave IO Running e Slave SQL Running voltaram para Yes. Caso positivo, signica que o seu problema foi solucionado. ServidorSecundario|mysql> SHOW SLAVE STATUS \G ... Slave_IO_Running: Yes Slave_SQL_Running: Yes ... Seconds_Behind_Master: 15 ... Caso o problema n ao seja solucionado desta forma, voc e dever a realizar todo o processo de backup a partir do servidor principal.

11

Refer encias Bibliogr acas

1. Documenta c ao do Percona Xtrabackup - website: www.percona.com/doc/ percona-xtrabackup 2. Documenta c ao do MySQL website: dev.mysql.com/doc/refman/5.6/en/

3. Blog do criador do Percona - website: www.mysqlperformanceblog.com/2008/07/07/how-show-slave-status-relates-to-chang 9

4. M etodo de ignorar querys inv alidas - website: www.howtoforge.com/how-to-repair-mysql-replication

10