Replicação Master-Master no MySQL

Posted on março 23, 2012. Filed under: Linux, MySQL | Tags:, , , |

Introdução

Neste artigo vamos demonstrar como configurar replicação Master-Master entre dois servidores MySQL. Este tipo de replicação normalmente é usado em um sistema de failover/cluster.

Preparando

O primeiro passo é sincronizar os bancos de dados, utilizados na replicação, entre os dois servidores do MySQL. Podemos usar o mysqldump nesta tarefa.

No servidor A:
# mysqldump -u root -p --databases base1 base2 > servidorA-dump.sql

No servidor B:
# mysql -u root -p < servidorA-dump.sql

Vamos assumir os seguintes endereços IPs para os servidores:

Servidor A: 192.168.0.1
Servidor B: 192.168.0.2

Configurando Permissões de Usuário

O processo de replicação do MySQL exige uma conexão ativa entre os dois servidores em ambos os lados. É preciso definir um usuário/senha para essa conexão.

No servidor A:
GRANT ALL PRIVILEGES ON *.* TO replicacao@192.168.0.2 IDENTIFIED BY 'repl123' WITH GRANT OPTION;

No servidor B:
GRANT ALL PRIVILEGES ON *.* TO replicacao@192.168.0.1 IDENTIFIED BY 'repl123' WITH GRANT OPTION;

Perceba que setamos os pervilégios do usuário replicacao para todos os bancos de dados no MySQL. Porém você pode definir somente as bases que serão incluídas na replicação ao invés de incluir todas bases.

Configurando o MySQL

As configurações abaixo devem ser incluídas na seção [mysqld] do my.cnf

Servidor A:

server-id = 1
auto-increment-increment = 2
auto-increment-offset = 1

log-bin
binlog-do-db = base1

master-host = 192.168.0.2
master-user = replicacao
master-password = repl123
master-port = 3306
master-connect-retry = 60

Servidor B:

server-id = 2
auto-increment-increment = 2
auto-increment-offset = 2

log-bin
binlog-do-db = base1

master-host = 192.168.0.1
master-user = replicacao
master-password = repl123
master-port = 3306
master-connect-retry = 60

A definição dos parâmetros auto-increment-increment e auto-increment-offset evitam colisão entre campos auto_increment. Mantenha o mesmo valor no campo auto-increment-increment para os dois servidores. O campo auto-increment-offset mantenha sequencialmente entre os servidores. No caso, 1 e 2.

O campo server-id também deve ser único entre os dois servidores. No caso, 1 e 2.

No exemplo de configuração acima estamos replicando somente o banco chamado base1. Caso precise replicar mais de uma base de dados, você pode inserir quantas linhas do parâmetro binlog-do-db forem necessárias:

binlog-do-db = base1
binlog-do-db = base2
binlog-do-db = base3
...

Caso você não especifique nenhum parâmetro binlog-do-db, todas as base de dados serão replicadas. Você tem também a opção de especificar o parâmetro binlog-ignore-db para ignorar quais base de dados não serão replicadas. É o processo inverso ao do parâmetro binlog-do-db:

binlog-ignore-db = mysql
binlog-ignore-db = information_schema

Iniciando a replicação

Reinicie o MySQL nos dois serviores:
# /etc/init.d/mysql restart

Neste momento a replicação deve ter iniciado. Se por algum motivo não tiver sido iniciado (Verificar erro no arquivo de log do mysql). Entre nos dois servidores e execute o comando:

mysql> start slave

Testando

Entre no MySQL nos dois servidores e execute o comando:
mysql> show slave status\G

Verifique os parâmetros Slave_IO_Running e Slave_SQL_Running. Ambos devem estar com o valor “YES”. Caso não esteja, refaça o processo.

Outro teste importante, é fazer alterações na base de um servidor e verificar se a mudança foi replicada para o outro servidor e vice-cversa.

Conclusão

Configurar uma replicação master-master no mysql é relativamente simples conforme demonstrado neste artigo. Outros ambientes de replicação também não são complicados. Com poucos ajustes na configuração acima você consegue adicionar mais que 2 servidores na replicação de master para master. Espero que tenha ajudado. Obrigado.

Make a Comment

Deixe uma resposta para Frank Cancelar resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Foto do Google

Você está comentando utilizando sua conta Google. Sair /  Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

Conectando a %s

13 Respostas to “Replicação Master-Master no MySQL”

RSS Feed for Pasqua Tecnologia Comments RSS Feed

ótimo tuto, mas tenho uma duvida, caso algum desses servidores caia, bastaria trocar o master do anterior para o próximo da lista certo? Não teria como fazer uma arquitetura do tipo árvore? Com um nó coordenador?

Rafael, você pode resolver esse problema usando um software de gerenciamento de Alta Disponibilidade, como o hearbeat ou keepalived. Eles são responsáveis por ficar verificando a disponibilidade de um nó do cluster e caso esse nó cair, o outro nó assume. Isso tudo de forma transparante para a aplicação que esta acessando o servidor.

Falha na replicação ? Seguinte link pode ajudar:
http://www.howtoforge.com/how-to-repair-mysql-replication

Este link do pasquati foi tiro e queda pra mim!!

Boa tarde,
Parabéns pelo tópico, muito bom.
Porem precisava add mais 2 servidores todos como master..
podem me ajudar.

Agradeço a atenção.

Olá Carlos Henrique,

Acredito que o link abaixo possa te ajudar:
http://www.howtoforge.com/setting-up-master-master-replication-on-four-nodes-with-mysql-5-on-debian-etch

Boa sorte!

Eu preciso que todos dos meus 5 servidores sejam “MASTER”,

Boa tarde!

Ótimo tutorial, parabéns!
Agora uma duvida, na segunda linha informada, não tá aceitando o comando “mysql -u root -p < servidorA-dump.sql", aparece um erro de sintaxe. será se ficou faltando o "mysqldump"?
Obrigado pela atenção.

Olá Frank,

O comando esta correto sim. Não esta faltando o mysql”dump”. O que pode estar acontecendo é que o usuário root do seu mysql esta sem senha. Neste caso basta omitir o parâmetro “-p” do comando que você mencionou.

Caso continue com erro, por favor, poste o erro aqui para tentar te ajudar.

Boa sorte!

Poderia dar exemplo pra colocar 4 servidores sendo todos master. é possivel?

Olá Carlos Henrique, infelizmente no momento eu não tenho nenhum ambiente com 4 servidores master.

Aquele link que informei no comentário anterior, tem um exemplo de como configurar 4 servidores mysql como master.

Boa sorte!

Ola, sou leigo no assunto mas tenho o seguinte problema, estou usando phpmyadmin em um tablet com banco de dados mysql que será encessario trabalhar offline, após uma conecção com internet eu gostaria que as informações do banco local (tablet) fosse adicionadas ao banco na WEB.
o problema é não sei como fazer essa conecção.
da pra fazer em php?
Alguem pode me ajudar.

Olá Eneas, acredito que usar a replicação do MySQL não é a melhor opção no caso.

Aconselho realmente criar um script php para realizar essa operação, acho mais adequado.

Dá uma olhada na classe abaixo, talvez já lhe poupe esforços na criação do script:
http://www.phpclasses.org/package/1803-PHP-Synchronize-MySQL-database-copies.html

Boa sorte!


Where's The Comment Form?

Liked it here?
Why not try sites on the blogroll...

%d blogueiros gostam disto: