Replicação entre servidores MySQL

MySQL é uma das base de dados Open Source mais utilizadas no mundo. 

Este tutorial vai mostrar como criar um servidor de replicação do MySQL.

A replicação no MySQL permite que tenhamos um ou mais servidores exactamente iguais.

Nota: A replicação não é nenhum processo de Backup. Tudo o que for efectuado no servidor Master será imediatamente replicado para o servidor Slave.

Vamos mostrar como replicar uma base de dados (exemplodb) já existente no master para o servidor slave.

Configurar o Master

 

Agora, vamos entrar no MySQL e criar um utilizador para replicação

mysql -uroot -p

grant replication slave on *.* to '<utilizador_replicacao>'@'%' identified by '<password>';

flush privileges;

Seguidamente, configurar o servidor para a replicação:

Editar o ficheiro /etc/my.cnf para activar a funcionalidade de network no MySQL. Se as seguintes linhas existirem, têm que as comentar:

#skip-networking

#bind-address            = 127.0.0.1

Seguidamente, temos que indicar ao MySQL para que base de dados deve escrever logs,  (estes logs vão permitir ao servidor slave verificar o que se passa no servidor Master),  que ficheiro usar para os escrever e indicar que este servidor é o Master.

Relativamente aos logs, eu gosto de os manter separados, assim, criei uma directoria em /var/logs chamada mysqld.

cd /var/log

mkdir mysqld

chown mysql:mysql -R mysqld

Novamente, editamos o ficheiro /etc/my.cnf e acrescentamos as seguintes linhas na zona [mysqld]:

log-bin=/var/log/msqyld/mysql-bin.log

binlog-do-db=exemplodb

server-id=1

Guardamos e reiniciamos o servidor Master.

/etc/init.d/mysqld restart

Neste momento, ja temos o MySQL a criar logs binários.

Configuração Slave

No servidor slave, vamos editar o ficheiro /etc/my.cnf e na secção [mysqld]:

 

server-id=2

master-host=10.20.30.10 <tambem podem user o hostname>

master-connect-retry=60

master-user=utilizador_replicacao (criado em cima)

master-password=<password_do_utilizador>

replicate-do-db=exampledb

relay-log=/var/log/mysqld/slave-relay.log

relay-log-index=/var/log/mysqld/slave-relay-log.index

 

Agora, reiniciem o serviço:
/etc/init.d/mysqld restart

Inserir os dados no SLAVE

No servidor Master

Assumindo que têm um slave vazio. Se o servidor master estiver constantemente a ser acedido, temos que prevenir o acesso às tabelas antes de as replicar. Se não houver dados a serem acedidos no servidor, podem passar este passo.

mysql -uroot -p

mysql> flush tables with read lock;

Agora, iremos usar o mysqldump para retirar os dados:

mysqldump -uroot -p exemplodb > exemplodb.sql

Copiem o ficheiro exemplodb.sql para o servidor slave.

 

No servidor Slave

mysql -uroot -p

create database exemplodb

mysql -uroot -p -D exemplodb < exemplodb.sql

 

Colocar a replicação a funcionar

A partir deste momento, estamos prontos para colocar os servidores a replicar

No servidor Master

mysql -uroot -p

Precisamos de saber qual a posição nos logs onde o master está:

mysql> show master status;

+-------------------+----------+--------------+------------------+

| File              | Position | Binlog_Do_DB | Binlog_Ignore_DB |

+-------------------+----------+--------------+------------------+

| mysqld-bin.000001 |       98 | exemplodb     |                 | 

+-------------------+----------+--------------+------------------+

Escreva a informacao em cima, vamos precisar dela para o servidor slave. Esta informação vai permitir saber desde quando o servidor slave vai replicar os dados. Se não colocarmos esta informação, só começa a replicar a partir do momento que o slave iniciar.

mysql> quit;

No servidor Slave

mysql -uroot -p

Agora vamos parar o slave e indicar-lhe exactamente onde procurar no log do servidor master. Usamos os valores do resultado anterior no servidor Master.

slave stop

change master to master_host='10.20.30.10', master_user='utilizador_replicacao', master_password='password', master_log_file='mysqld-bin.000001', master_log_pos=98;

slave start

 

Valores:

master_host : o endereço (ou hostname) do servidor Master
master_user : o utilizador criado em cima para efectuar a replicação
master_password : a password dada ao utilizador em cima
master_log_file : o ficheiro visto em cima quando vimos o status do master
master_log_pos : o valor também mostrado na tabela vista em cima.
 

O servidor Slave vai agora ficar à espera de alterações, mas antes, ainda existe uma coisa a fazer.

De volta ao Master

mysql -uroot -p

unlock tables;

Nota: Só é preciso efectuar o comando em cima se foi efectuado o comando FLUSH TABLES WITH READ LOCK;

Notas:

O manual do Mysql indica que, se as tabelas forem InnoDB, que se devem adicionar os seguintes parâmetros ao my.cnf, em [mysqld]:

innodb_flush_log_at_trx_commit=1
sync_binlog=1

Pronto. Neste momento todos os dados do Master já se encontram no slave. Qualquer alteração efectuada no Master será replicada para o slave. Atenção, isto é válido para qualquer comando, até drop. Como foi dito no inicio, a replicação não é uma forma de bakcup.

Referências

http://aciddrop.com/2008/01/10/step-by-step-how-to-setup-mysql-database-replication/

http://www.howtoforge.com/mysql_database_replication