Páginas

sábado, 14 de abril de 2012

Manual de Replicação do MySQL no Linux


     Bom pessoal , fiz um manual de replicação de base de dados MySQL e estou compartilhando aqui no Blog para ajudar aqueles que um dia vão precisar. Nesse artigo a replicação utilizada é a Master-to-Master aonde tenho duas bases MySQL que são Master(Mestre) e Slave(Escravo)  uma da outra, tendo um ambiente de replicação estável, integro e disponível.

Pré-Requisitos de Utilização:
- Ter Instalado o MySQL Server versão 5.0.x, 5.1.x, 5.5.x no Host que será usado para replicação.

Ambiente Utilizado:
- Servidor Debian 5.0.8 Lenny
- MySQL Server 5.0.51a

1.  Para configurar a replicação do MySQL é preciso edita o arquivo my.cnf no Linux, que se localiza em “/etc/mysql”:


1.1 Como já possuimos um arquivo de configuração de exemplo, segue abaixo os parametros que ficará no Servidor Master 1:

[my.cnf]

######## INICIO REPLICACAO #################

##### Configuracoes Servidor Replicacao ########
server-id = 1                ##### Identificador Servidor Master 1 ####

master-host = 192.168.2.151  ##### Ip Servidor Master 2 #####
master-user = replication    ##### Usuario de replicacao - Servidor Master 2 ####
master-password = slave      ##### Senha do Usuário de replicacao - Servidor Master 2 ####
master-port = 3306                    ##### Porta de replicacao - Servidor Master 2 ####

####### Configurando Log #######
log-bin = replica_cad               
binlog-do-db = cadastro_clientes   #### Nome da Base de dados que efetuara o Log ####
log-error = erro_replica_cad
log-slave-updates

##### Log de Vigilancia #######
relay-log = relay-log
relay-log-index = relay-log-index
relay-log-info = relay-log-info

###### Configurcao para manter as bases em sincronia em caso de queda #####
sync_binlog=1

###### Seleciona a base de dados que sera replicada #######
#replicate-do-db=cadastro_clientes

###### Seleciona a Tabela da base de dados que sera replicada #######
replicate-do-table=cadastro_clientes.clientes

######## Nome do Host ou IP a ser informado ao master durante o registro da maquina slave ########
report-host=192.168.2.150     ##### Ip Servidor Master 1 ######
report-user=replication       ##### Usuario de replicacao - Servidor Master 1 ####
report-password=slave         ##### Senha do Usuário de replicacao - Servidor Master 1 ####
report-port=3306              ##### Porta de replicacao - Servidor Master 1 ####

######## FIM REPLICACAO #####################

OBS: Comente as linhas abaixo a seção , abaixo contida no my.cnf:
# The following can be used as easy to replay backup logs or for replication.
# note: if you are setting up a replication slave, see README.Debian about
#       other settings you may need to change.
#server-id              = 1
#log_bin                          = /var/log/mysql/mysql-bin.log
#expire_logs_days   = 10
#max_binlog_size         = 100M
#binlog_do_db                  = include_database_name
#binlog_ignore_db    = include_database_name

1.2  Como já possuimos um arquivo de configuração de exemplo, segue abaixo os parametros que ficará no Servidor Master 2:

[my.cnf]

######## INICIO REPLICACAO #################

##### Configuracoes Servidor Replicacao ########
server-id = 2                      #### Identificador - Servidor Master 2 ####

master-host = 192.168.2.150        ##### Ip Servidor Master 1 #####
master-user = replication          ##### Usuario de replicacao - Servidor Master 1 ####
master-password = slave            ##### Senha do Usuário de replicacao - Servidor Master 1 ####
master-port = 3306                 ##### Porta de replicacao - Servidor Master 1 ####

####### Configurando Log #######
log-bin = replica_cad
binlog-do-db = cadastro_clientes   #### Nome da Base de dados que efetuara o Log ####
log-error = erro_replica_cad
log-slave-updates

##### Log de Vigilancia #######
relay-log = relay-log
relay-log-index = relay-log-index
relay-log-info = relay-log-info

###### Configurcao para manter as bases em sincronia em caso de queda #####
sync_binlog=1

###### Seleciona a base de dados que sera replicada #######
#replicate-do-db=cadastro_clientes

###### Seleciona a Tabela da base de dados que sera replicada #######
replicate-do-table=cadastro_clientes.clientes

######## Nome do Host ou IP a ser informado ao master durante o registro da maquina slave ########
report-host=192.168.2.151            ##### Ip Servidor Master 2 ######
report-user=replication              ##### Usuario de replicacao - Servidor Master 2 ####
report-password=slave                ##### Senha do Usuário de replicacao - Servidor Master 2 ####
report-port=3306                     ##### Porta de replicacao - Servidor Master 2 ####

######## FIM REPLICACAO ####################

OBS: Comente as linhas abaixo a seção , abaixo contida no my.cnf:
# The following can be used as easy to replay backup logs or for replication.
# note: if you are setting up a replication slave, see README.Debian about
#       other settings you may need to change.
#server-id              = 1
#log_bin                          = /var/log/mysql/mysql-bin.log
#expire_logs_days   = 10
#max_binlog_size         = 100M
#binlog_do_db                  = include_database_name
#binlog_ignore_db    = include_database_name

2.  Criar para Replicação das bases de dados.

Comando para criação do usuário replication no MySQL:
grant replication slave on *.* to 'replication'@'%' identified by 'slave';

O Usuário “replication” tem que obrigatóriamente , ser criado nos dois servidores MySQL. Tanto o Servidor Master 1 e no Servidor Master 2.


3.  Ativando a Replicação:

Se você seguiu todos os passos corretamente nesse momento o master já esta registrando gerando as informações no log binário, então agora é o momento de ligar a replicação.
Existe duas formas de ligar a replicação, uma é atraves de variaveis do my.cnf, outra é com o comando change master to, por considerar o comando change master to mais seguro escolhi essa opção:

No master execute o comando:

Show master status;
Você deve ter uma resposta parecida com essa:
mysql> show master status;
+------------------+-----------+--------------+------------------+
| File             | Position  | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+-----------+--------------+------------------+
| replica_cad.000005 | 307 | cadastro_clientes|                  |
+------------------+-----------+--------------+------------------+

No slave execute o seguinte comando :

use as informações obtidas no comando show master status;

 CHANGE MASTER TO
         MASTER_HOST='nome_do_servidor_master',
         MASTER_USER='usuario_para_replicacao',
         MASTER_PASSWORD='senha_do_usuario',
         MASTER_LOG_FILE='nome_do_log_binario',
         MASTER_LOG_POS=0;
Agora execute o comando:

mysql> STOP SLAVE; START SLAVE;

Pronto , você acabou de configurar uma replicação sincronizada no Mysql.

Para verificar o status execute o comando:

show slave status\G;

E o  resultado terá que ser semelhante o abaixo:

mysql> show slave status\G;
*************************** 1. row ***************************
             Slave_IO_State: Waiting for master to send event
                Master_Host: 192.168.2.151
                Master_User: replication
                Master_Port: 3306
              Connect_Retry: 60
            Master_Log_File: replica_cad.000010
        Read_Master_Log_Pos: 352
             Relay_Log_File: relay-log.000013
              Relay_Log_Pos: 237
      Relay_Master_Log_File: replica_cad.000010
           Slave_IO_Running: Yes
          Slave_SQL_Running: Yes
            Replicate_Do_DB:
        Replicate_Ignore_DB:
         Replicate_Do_Table: cadastro_clientes.clientes
     Replicate_Ignore_Table:
    Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
                 Last_Errno: 0
                 Last_Error:
               Skip_Counter: 0
        Exec_Master_Log_Pos: 352
            Relay_Log_Space: 237
            Until_Condition: None
             Until_Log_File:
              Until_Log_Pos: 0
         Master_SSL_Allowed: No
         Master_SSL_CA_File:
         Master_SSL_CA_Path:
            Master_SSL_Cert:
          Master_SSL_Cipher:
             Master_SSL_Key:
      Seconds_Behind_Master: 0

9 comentários:

  1. Legal, parabéns!! Show de bola.

    capin

    ResponderExcluir
  2. por favor poderia me manda o configuração no windows email bynhodepaula87@gmail.com

    ResponderExcluir
  3. preciso muito de ante mão te agradeço !!!

    ResponderExcluir
    Respostas
    1. Robson,
      Segue abaixo, a configuração de replicação para Windows.
      https://www.dropbox.com/s/61edgdg12yzxf0c/conf_replicacao_windows.zip

      Att,
      Emerson

      Excluir
  4. E se quisermos colocar mais bases no conjunto?

    ResponderExcluir
    Respostas
    1. é só adicionar o nome das bases separando com vírgula na ordem que desejar.

      Ex:
      replicate-do-db=cadastro_clientes, cadastro_carros

      Excluir
  5. Neste caso posso efetuar leitura/escrita nos dois servidores master? o que você usou para fazer balanceamento de carga ?

    ResponderExcluir
  6. Neste escopo o balanceamento estava sendo feito manualmente no servidor de aplicação que utilizava as bases. Mais geralmente o indicado é utilizar o MySQL Proxy ou produto de terceiros que atuem no mesmo propósito.

    ResponderExcluir
  7. Boa tarde Emerson.
    Primeiramente parabéns pelo post, com certeza tirou várias das dúvidas que tinha sobre replicação entre bancos MySQL.
    Porém (sempre tem um porém hehe) ainda tenho algumas dúvidas relacionadas ao assunto, posso te enviar um email? Posto aqui nos comentários? Qual seria a melhor forma? Claro, se for possível ajudar.
    Parabéns mais uma vez pela iniciativa!
    Abraços.

    ResponderExcluir