How To Set Up MySQL Master-Master Replication

Posted on Friday, 30 of December of 2016
1245by Octávio GonçalvesMySQL

Introdução

A replicação MySQL é o processo pelo qual um único conjunto de dados, armazenado numa base de dados MySQL, será copiada em tempo real para um segundo servidor. Essa configuração, chamada replicação "master-slave" (mestre-escravo), é uma configuração típica. A nossa configuração será melhor do que isso, porque a replicação master-master permite que os dados sejam copiados de um servidor para outro. Esta diferença sutil mas importante permite-nos executar leituras ou escritas mysql a partir de qualquer servidor. Essa configuração adiciona redundância e aumenta a eficiência ao lidar com o acesso aos dados.

Os exemplos neste artigo serão baseados em duas VPS, denominadas Servidor C e Servidor D.

Servidor C: 3.3.3.3
Servidor D: 4.4.4.4

Passo #1: Instalar e configurar o MySQL no Servidor C

A primeira coisa que precisamos fazer é instalar os pacotes mysql-server e mysql-client em nosso servidor. Podemos fazer isso digitando o seguinte:

sudo apt-get install mysql-server mysql-client

Normalmente o processo mysql só aceitará ligações em localhost (127.0.0.1). Para alterar esse comportamento padrão e alterar algumas outras configurações necessárias para que a replicação funcione corretamente, precisamos editar o /etc/mysql/my.cnf no Servidor C. Há quatro linhas que precisamos alterar, que estão atualmente definidas como se segue:

#server-id= 1#log_bin= /var/log/mysql/mysql-bin.log#binlog_do_db = include_database_namebind-address= 127.0.0.1

A primeira dessas linhas serve apenas para identificar nosso servidor específico, na nossa configuração de replicação. Precisamos descomentar essa linha, removendo o "#" antes dela. A segunda linha indica o arquivo no qual as alterações em qualquer base de dados ou tabela mysql serão registradas.

A terceira linha indica quais as bases de dados que queremos replicar entre os nossos servidores. Pode adicionar tantas base de dados a esta linha como pretender. O exemplo utilizaremos uma única base de dados chamada "example" para simplificar. E a última linha diz ao nosso servidor para aceitar conexões da Internet (não escutando em 127.0.0.1).

server-id = 1log_bin = /var/log/mysql/mysql-bin.logbinlog_do_db= example# bind-address= 127.0.0.1

Agora precisamos reiniciar o mysql:

sudo service mysql restart

Em seguida, precisamos alterar algumas configurações de linha de comando dentro de nossa instância mysql. De volta à nossa shell, podemos chegar ao nosso utilizador root mysql digitando o seguinte:

mysql -u root -p 

Observe que a senha que este comando lhe será solicitada é a do utilizador root mysql, não o utilizador root no nosso sistema. Para confirmar que você está ligado à shell mysql, o prompt deve ser semelhante ao seguinte.

mysql> 

Uma vez conectados, precisamos executar alguns comandos.

Precisamos de criar um pseudo-utilizador que será usado para replicar dados entre as nossas duas VPS. Nos exemplos deste artigo iremos assumir que vai nomear este utilizador "replicator". Substitua "password" pela senha que deseja usar para replicação.

create user 'replicator'@'%' identified by 'password'; 

Em seguida, precisamos dar a este utilizador permissões para replicar as nossas bases de dados mysql:

grant replication slave on *.* to 'replicator'@'%'; 

As permissões para replicação não podem, infelizmente, ser dadas por base de dados. O nosso utilizador só irá replicar a(s) base(s) de dados que nós indicarmos no nosso ficheiro de configuração.

Para a etapa final da configuração inicial do Servidor C, precisamos de obter algumas informações sobre a instância atual do MySQL que mais tarde forneceremos ao Servidor D.

O comando a seguir produzirá algumas informações importantes, que precisaremos de tomar nota:

show master status; 

O resultado será parecido com o seguinte, e terá duas tipos de informação crítica:

+------------------+----------+--------------+------------------+| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |+------------------+----------+--------------+------------------+| mysql-bin.000001 | 107| example||+------------------+----------+--------------+------------------+1 row in set (0.00 sec)

Precisamos de anotar o arquivo e a posição para serem usados no próximo passo.

Passo #2: Instalar e configurar o MySQL no Servidor D

Precisamos repetir os mesmos passos que seguimos no Servidor C. Primeiro precisamos instalá-lo, o que podemos fazer com o seguinte comando:

sudo apt-get install mysql-server mysql-client

Once the two packages are properly installed, we need to configure it in much the same way as we configured Server C. We will start by editing the /etc/mysql/my.cnf file.

Assim que os dois pacotes estejam devidamente instalados, precisamos configurá-los da mesma forma que configurámos no Servidor C. Começaremos por editar o ficheiro /etc/mysql/my.cnf.

sudo nano /etc/mysql/my.cnf 

Precisamos de alterar as mesmas quatro linhas no ficheiro de configuração conforme mudámos anteriormente.

As pré-definições são listados abaixo, seguidas das mudanças que precisamos de fazer.

#server-id= 1#log_bin= /var/log/mysql/mysql-bin.log#binlog_do_db = include_database_namebind-address= 127.0.0.1

Precisamos alterar essas quatro linhas para combinar com as linhas abaixo. Observe que, diferentemente do Servidor C, o id do servidor para o Servidor D não pode ser definido como 1.

server-id = 2log_bin = /var/log/mysql/mysql-bin.logbinlog_do_db= example# bind-address= 127.0.0.1

Depois de guardar e sair desse ficheiro, precisa reiniciar o mysql:

sudo service mysql restart

Deverá entrar na shell do mysql e definir mais algumas opções de configuração.

mysql -u root -p

Primeiro, assim como no Servidor C, vamos criar o pseudo-utilizador que será responsável pela replicação. Substitua "password" pela senha que deseja utilizar.

create user 'replicator'@'%' identified by 'password'; 

Depois, precisamos criar a base de dados que vamos replicar na nossa VPS.

create database example; 

E precisamos dar ao nosso recém criado utilizador 'replication' as permissões para replicação.

grant replication slave on *.* to 'replicator'@'%'; 

O próximo passo envolve pegar nas informações que tomámos nota do servidor anterior e aplicá-las à nossa instância mysql. Isso permitirá que a replicação comece. O seguinte deve ser introduzido na shell do mysql:

slave stop; CHANGE MASTER TO MASTER_HOST = '3.3.3.3', MASTER_USER = 'replicator', MASTER_PASSWORD = 'password', MASTER_LOG_FILE = 'mysql-bin.000001', MASTER_LOG_POS = 107; slave start; 

Precisa substituir 'password' pela senha que escolheu para replicação. Os seus valores para MASTER_LOG_FILE e MASTER_LOG_POS podem diferir dos acima. Deve copiar os valores que o comando "SHOW MASTER STATUS" retorna no Servidor C.

A última coisa que precisamos fazer antes de concluir a replicação master-master do mysql é anotar o ficheiro de registos principal (logs) e a posição a ser usada para replicar na outra direção (do Servidor D ao Servidor C).

Podemos fazer isso digitando o seguinte:

SHOW MASTER STATUS; 

O resultado será semelhante ao seguinte:

+------------------+----------+--------------+------------------+| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |+------------------+----------+--------------+------------------+| mysql-bin.000004 |107 | example||+------------------+----------+--------------+------------------+1 row in set (0.00 sec)

Anote o nome do ficheiro e posição, porque teremos que inserir esse dados no servidor C, para concluir a replicação bidirecional.

O próximo passo explicará como fazer isso.

Passo #3: Concluindo a Replicação no Servidor C

De volta ao Servidor C, precisamos terminar de configurar a replicação na linha de comandos. Executando este comando irá replicar todos os dados do Servidor D.

slave stop; CHANGE MASTER TO MASTER_HOST = '4.4.4.4', MASTER_USER = 'replicator', MASTER_PASSWORD = 'password', MASTER_LOG_FILE = 'mysql-bin.000004', MASTER_LOG_POS = 107; slave start; 

Mantenha em mente que os seus valores podem diferir dos acima. Por favor substitua o valor de MASTER_PASSWORD pela senha que criou quando definiu o utilizador de replicação.

O resultado será semelhante ao seguinte:

Query OK, 0 rows affected (0.01 sec)

A última coisa a fazer é testar que a replicação está a funcionar em ambas as VPS. A última etapa explicará uma maneira fácil de testar essa configuração.

Passo #4: Testando a Replicação Master-Master

Agora que temos toda as definições configuradas, vamos testá-las agora. Para fazer isso, vamos criar uma tabela na nossa base de dados de exemplo no Servidor C e verificar no Servidor D para ver se ele aparece. Depois, vamos excluí-la do Servidor D e certificar-mo-nos que ela desaparece do Servidor C.

Agora precisamos criar a base de dados que será replicada entre os servidores. Podemos fazer isso digitando o seguinte na shell do mysql:

create database example; 

Uma vez criada, vamos criar uma tabela fictícia no servidor C:

create table example.dummy (`id` varchar(10)); 

Agora vamos verificar Servidor D para ver se a nossa tabela existe.

show tables in example; 

Devemos ver um resultado semelhante ao seguinte:

+-------------------+| Tables_in_example |+-------------------+| dummy |+-------------------+1 row in set (0.00 sec)

O último teste a fazer é apagar a nossa tabela dummy do Servidor D. Ela também deverá desaparecer do Servidor C.

Podemos fazer isso digitando o seguinte no Servidor D:

DROP TABLE dummy; 

To confirm this, running the "show tables" command on Server C will show no tables:

Para confirmar isso, executando o comando "show tables" no servidor C ele não mostrará tabelas:

Empty set (0.00 sec)

E aí está!

Share or save this article

slashdot