MySQL Replication: Mova o escravo para ser escravo de outro escravo, sem nenhum (ou menos possível) tempo de inatividade

2

Eu tenho a seguinte configuração:

M1 = Mestre 1
S1 = Escravo 1
S2 = escravo 2
S3 = Escravo 3

Onde todos os escravos estão replicando diretamente do M1. Eu gostaria de mover S2 e S3 para serem escravos de S1.

Não tenho certeza sobre como fazer isso sem qualquer tempo de inatividade e com a replicação aumentando de onde parou. Como garantir que os escravos continuem do ponto correto nos logs de seu novo mestre sem perder nenhuma escrita ou tentando repetir as gravações que eles já haviam feito antes da alteração.

Um dos escravos está em um local externo em uma conexão relativamente lenta, e é um DB bastante grande, então reconstruir os escravos de um dump ou copiar arquivos de dados levaria muito tempo, e parece-me que deveria ser desnecessário!

Qualquer ajuda ou conselho muito apreciado!

Simon

    
por SimonK 21.01.2012 / 21:54

1 resposta

1

AVISO: leia com atenção, entenda & confie

Aqui vamos nós:

Passo 01) Obtenha o endereço IP privado do S1 (escreva em algum lugar)

$ ip addr show

Passo 02) Obtenha o nome de usuário e senha para replicação de S1

cd /var/lib/mysql
cat master.info

O nome de usuário e a senha estão em texto simples neste arquivo

Passo 03) Execute isto em S1

mysql> GRANT REPLICATION SLAVE ON *.* TO '<username from Step 02>'@'%' IDENTIFIED BY '<password from Step 02>';

Passo 04) No S1, adicione isto ao /etc/my.cnf

[mysqld]
log-slave-updates
log-bin=mysql-bin

Passo 05) No S1, execute este

service mysql restart

Isso cria logs binários em S1

Passo 06) No M1, execute isto na linha de comando

$ mysql -u... -p... -e"FLUSH TABLES WITH READ LOCK; SELECT SLEEP(86400);" &
$ sleep 15
$ mysql -u... -p... -e"SHOW PROCESSLIST;" | grep "SELECT SLEEP(86400)" | awk '{print $1}'

Isso colocará o mestre em estado de animação suspensa. A posição do registro binário no mestre irá parar de se mover. Isso dará a todos os Escravos a chance de todos pararem no mesmo lugar na Replicação. A última linha irá ecoar o ProcessID do MySQL que está segurando o bloqueio de leitura. NÃO PERCA ESTE NÚMERO !!!

Passo 07) Execute isto em S1

mysql> RESET MASTER; SHOW MASTER STATUS;

Isso limpará todos os logs binários em S1 e mostrará o log binário e a posição de S1. O arquivo de log deve ser chamado de mysql-bin.000001 . A posição irá variar com base na versão do MySQL. Para o MySQL 5.5, é 107. Para o MySQL 5.1, é 106. Para qualquer versão anterior ao MySQL 5.1, é 98.

Passo 08) Execute isto em S2 e S3

mysql> STOP SLAVE;

Passo 09) No M1, execute isto:

mysql> KILL <ProcessID From Step 06>;

Isso liberará todos os INSERTs, UPDATEs e DELETEs pendentes.

Passo 10) Execute isto em S2 e S3

mysql> CHANGE MASTER TO
MASTER_HOST='<ip address of S1 from Step 01>',
MASTER_PORT=3306,
MASTER_USER='<username from Step 02>',
MASTER_PASSWORD='<password from Step 02>',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=107;

Lembre-se, usuário MASTER_LOG_POS=106 para o MySQL 5.1 ou MASTER_LOG_POS=98 para o MySQL 5.0 e vice-versa.

Isto irá apontar a replicação de S2 e S3 para iniciar a partir de S1.

Passo 11) Execute isto em S2

mysql> START SLAVE; SELECT SLEEP(5); SHOW SLAVE STATUS\G

Isto irá iniciar a replicação, pausar 5 segundos e mostrar o status do escravo. Se Slave_IO_Running=Yes e Slave_SQL_Running=Yes , tudo deu certo.

Passo 12) Repita o Passo 11 para S3

É isso.

CAVEAT

O tempo de inatividade começa com o passo 06 e termina com o passo 09

    
por 22.01.2012 / 01:16