Crie um escravo MySQL de outro escravo, mas aponte para o mestre

8

Problema

Eu tenho a configuração de replicação do MySQL entre 2 servidores, mestre ( A ) e escravo ( B ). Eu preciso adicionar um novo escravo ao mix ( C ). Quero que esse escravo obtenha suas atualizações diretamente do mestre, não quero replicação em cadeia do escravo. No entanto, o mestre está "quente", eu geralmente uso o Xtrabackup para criar um backup completo do mestre, mas isso o bloqueará por uns bons 10 minutos, pois o banco de dados tem cerca de 20 GB de tamanho.

Solução possível

ABRIR TABELAS COM LER LOCK no escravo B , use SHOW SLAVE STATUS em B , anote o binlog e posicione. Em seguida, faça backup do banco de dados com o Xtrabackup, envie o backup para C e use-o para criar o escravo e defina a replicação para apontar para A com a posição do binlog que acabei de escrever.

Questão

Existe uma maneira melhor que não exija que eu trave B por tanto tempo? Ou algo que é mais facilmente automatizado?

Alex Recarey
fonte

Respostas:

20

Ei, eu conheço um método louco para criar um escravo sem aumentar nenhuma operação do master (ServerA) ou slave (ServerB)

Etapa 1) Configurar um novo servidor (ServerC)

Etapa 2) No ServerC, instale o MySQL (mesma versão do ServerB)

Etapa 3) No ServerC, serviço mysql stop

Etapa 4) Copie /etc/my.cnf do ServerB para o ServerC

Etapa 5) No ServerC, altere server_id para um valor diferente de ServerA e ServerB

Etapa 6) rsync / var / lib / mysql no ServerB para ServerC

Etapa 7) Quando o rsync estiver concluído, execute "STOP SLAVE;" no ServerB

Etapa 8) rsync / var / lib / mysql no ServerB para ServerC

Etapa 9) No ServerB, execute "START SLAVE;"

Etapa 10) No ServerC, serviço mysql start

Etapa 11) No ServerC, execute "START SLAVE;" (Faça isso se skip-slave-start estiver em /etc/my.cnf)

De uma chance !!!

BTW, tenho a máxima confiança de que isso funcionará porque fiz isso para o cliente nos últimos 2 dias. O cliente tinha 2,7 TB de dados em um escravo. Rsyncd para outro servidor enquanto o escravo ainda estava ativo. O rsync levou cerca de 11 horas. Então eu corri STOP SLAVE; no primeiro escravo e correu o rsync novamente. Isso levou mais uma hora. Eu então executei a etapa acima e tudo está feito.

RolandoMySQLDBA
fonte
RI MUITO. Eu ia comentar o OP para usar sua sugestão, e baixo e eis o Sr. Rolando, o DBA "Fridge". Rolando bateu na unha na cabeça e este é o método preferido sem ter que parar nenhum Mestre e sem parar seu escravo B por um período muito longo.
coderwhiz
2
Eu sei que este é um post bastante antigo, mas alguém me perguntou sobre esse método. Isso funciona bem, supondo que o novo escravo e o velho escravo sejam EXATAMENTE iguais. Se o novo escravo for um arco diferente, ele não funcionará (IIRC). E tenho quase certeza de que, se você estiver usando espaços de tabela innodb por arquivo, não funcionará. A solução mais segura é fazer um backup completo do mestre, se houver alguma dúvida.
lusis 12/09
@lusis - Seu comentário é muito verdadeiro. Em um mundo perfeito, que a maioria dos clientes mysql imagina ter, eles querem que isso seja feito, pois todas as especificações de hardware são idênticas. Nas configurações em que o hardware difere, o mysqldumps e o reload são os mais seguros. Você deve enviar seu comentário como resposta. Eu iria votar. Vamos ver se os outros querem !!!
RolandoMySQLDBA
Eu segui o procedimento. Após iniciar o mysql novamente no SlaveC, recebo um erro dizendo "Seu banco de dados pode estar corrompido ou você pode ter copiado o espaço de tabela do InnoDB, mas não os arquivos de log do InnoDB". E no start slave(SlaveC) eu recebo "Falha ao abrir o log de retransmissão '/var/log/mysql/mysql-relay-bin.001603"
Hussain Tamboli 11/15/15
Dessa forma, você pode facilmente perder dados no ServerC.
akuzminsky
3

Quando adicionamos um escravo ao nosso mix, fazemos o seguinte:

  • colocar um escravo offline
  • copie o diretório de dados do banco de dados para o novo escravo (as configurações do escravo -binlog position, master host etc - estarão corretas desde que copiamos de um escravo)
  • iniciar o escravo original
  • modifique a identificação do servidor em my.cnf para o novo escravo
  • iniciar novo escravo
sreimer
fonte
Eu apenas tive que fazer isso mesmo esta tarde
sreimer
1

Fiz o que o @RolandoMySQLDBA sugere, mas também adicionei etapas de 6 ' e 8' (isso resolve o que os comentários de @Hussain Tamboli .):

Etapa 1) Configurar um novo servidor (ServerC)

Etapa 2) No ServerC, instale o MySQL (mesma versão do ServerB)

Etapa 3) No ServerC, serviço mysql stop

Etapa 4) Copie /etc/my.cnf do ServerB para o ServerC

Etapa 5) No ServerC, altere server_id para um valor diferente de ServerA e ServerB

Etapa 6) rsync / var / lib / mysql no ServerB para ServerC

Etapa 6 ') rsync / var / log / mysql no ServerB para ServerC

Etapa 7) Quando o rsync estiver concluído, execute "STOP SLAVE;" no ServerB

Etapa 8) rsync / var / lib / mysql no ServerB para ServerC

Etapa 8 ') rsync / var / log / mysql no ServerB para ServerC

Etapa 9) No ServerB, execute "START SLAVE;"

Etapa 10) No ServerC, serviço mysql start

Etapa 11) No ServerC, execute "START SLAVE;" (Faça isso se skip-slave-start estiver em /etc/my.cnf)

Pere Barceló
fonte
sua resposta não está completa e faz referência a outras coisas. não é um fórum, melhore sua resposta para ser completo por si só.
Asdmin
0

Você tem a opção "LOAD DATA FROM MASTER", mas isso é altamente desencorajado.

Você faz backups noturnos / semanais no seu sistema? Nesse caso, observe também a posição do seu backup, então você pode usá-lo para configurar um novo escravo. Apenas deixe como está e deixe-o atualizado por algum tempo.

jishi
fonte
0

Tentei as respostas do Rolando e funcionou bem, mas ele começou a ser reproduzido desde o início e tive que adicionar mais código de erro para pular (sei que não é recomendado, mas sei o que estava fazendo).

Uma vez feito o passo 7, verifiquei o log do mysql e anotei o nome e a posição do log do bin e continuei até o 9º passo. Antes da 10ª etapa, acabei de executar o change masterarquivo de log e a posição do log. E continuou a partir do passo 11. Tudo parece bem para mim.

Espinho
fonte
-2

Você precisa alterar o uuid do escravo no auto.cnf para que o mestre possa diferenciar os dois escravos.

Nazgul
fonte