Possível fazer o servidor mysql mestre e escravo?

4

Estou me preparando para mover um banco de dados de um servidor para outro. A fim de reduzir o tempo de inatividade do cliente, estou me perguntando se seria possível ativar a replicação e dar tempo para replicação completa, basta apontar o cliente para o novo servidor.

O problema que tenho é que o servidor para o qual estou mudando tem bancos de dados ativos e existentes para outros clientes. E o servidor do qual estou me mudando tem outros clientes ativos que não estarão se movendo no momento.

Isso é possível? Em caso afirmativo, como configuro o servidor do qual estou me movendo e o para o qual estou me movendo?

    
por Amy Anuszewski 09.04.2012 / 18:19

2 respostas

4

sim - é possível que o servidor mysql seja mestre e escravo ao mesmo tempo.

Se você usar o innodb como seu mecanismo de armazenamento para esses dados e mover bancos de dados inteiros, será possível:

  • ativar o registro em log no servidor antigo
  • faça um despejo consistente completo do servidor antigo sem bloquear nenhum tráfego em andamento
  • transferir esse despejo para o novo servidor, restaurar lá
  • ative a replicação para bancos de dados selecionados e permita que o novo servidor 'alcance' a máquina de produção
  • quando os servidores precisarem de bancos de dados sincronizados, alterne o tráfego

isso pode ser útil:

ps. Eu suponho que não há sobreposição de nome para os bancos de dados entre o servidor antigo e novo.

    
por 09.04.2012 / 18:40
3

Sim, claro.

A ideia que você deve implementar é conhecida como Replicação Circular do MySQL.

Por exemplo, digamos que você tenha o seguinte:

  • O DBServer1 tinha bancos de dados db1, db2, db3, db4
  • Você deseja mover o db3 e o db4 para o DBServer2
  • Você deseja restringir leituras e gravações para db1 e db2 no DBServer1
  • Você deseja restringir leituras e gravações no db3 e no db4 no DBServer2

Aqui está algo que você pode tentar

STEP01) Execute GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO replicator@'%' IDENTIFIED BY 'replpass'; no DBServer1

STEP02) Instale a mesma versão do MySQL no DBServer2 (você terá dados padrão em / var / lib / mysql)

STEP03) rsync DBServer1: / var / lib / mysql DBServer2: / var / lib / mysql

STEP04) Repetir STEP02 até que dois rsyncs consecutivos sejam o mesmo tempo, de preferência < 2 min.

STEP05) Desabilite seu aplicativo de escrever qualquer coisa para os bancos de dados

STEP06) service mysql stop no DBServer1

STEP07) Configurar o registro binário no DBServer1

Adicione isto ao /etc/my.cnf no DBServer1

[mysqld]
server-id=1
log-bin=mysql-bin

Adicione isto ao /etc/my.cnf no DBServer2

[mysqld]
server-id=2
log-bin=mysql-bin

STEP08) DBServer2 rsync: / var / lib / mysql DBServer2: / var / lib / mysql (FINAL RSYNC)

STEP09) service mysql start no DBServer1 (os registros binários começarão a ser preenchidos)

STEP10) service mysql start no DBServer2 (os logs binários começarão a ser preenchidos)

PASSO 11) Aponte seus aplicativos para db1 e db2 no DBServer1

STEP12) Aponte seus aplicativos para db3 e db4 no DBServer2

STEP13) Execute isto no DBServer1

CHANGE MASTER TO
MASTER_HOST='xxx.xx.xx.xxx',
MASTER_PORT=3306,
MASTER_USER='replicator',
MASTER_PASSWORD='replpass',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=PPPP;

STEP14) Execute isto no DBServer2

CHANGE MASTER TO
MASTER_HOST='yyy.yy.yy.yyy',
MASTER_PORT=3306,
MASTER_USER='replicator',
MASTER_PASSWORD='replpass',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=PPPP;

Para os passos 13 e 14

  • xxx.xx.xx.xxx é o endereço de IP privado do DBServer2
  • yyy.yy.yy.yyy é o endereço de IP privado do DBServer1
  • PPPP é a posição inicial de qualquer log binário
    • Para o MySQL 5.5, o PPPP é de 107
    • Para o MySQL 5.1, o PPPP é de 106
    • Antes do MySQL 5.1, o PPPP é 98

STEP15) Execute START SLAVE; no DBServer1

STEP16) Execute START SLAVE; no DBServer2

STEP17) Execute SHOW SLAVE STATUS\G no DBServer1 até que Seconds_Behind_Master seja 0

STEP18) Execute SHOW SLAVE STATUS\G no DBServer2 até que Seconds_Behind_Master seja 0

Esta implementação não permitirá a divisão de bancos de dados, mas também permitirá servidores de reserva para o banco de dados.

DBServer1 será o local para fazer leituras e gravações para db1 e db2. Também fornece um backup do db3 e do db4.

DBServer2 será o local para fazer leituras e gravações para db3 e db4. Também fornece um backup do db1 e do db2.

Experimente!

    
por 09.04.2012 / 19:04