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

7

Problema

Eu tenho a configuração de replicação do MySQL entre dois servidores, mestre ( A ) e escravo ( B ). Eu preciso adicionar um novo escravo ao mix ( C ). Eu quero que este escravo obtenha atualizações diretamente do mestre, eu não quero a replicação em cadeia do escravo. No entanto, o master é "hot", eu costumo usar o Xtrabackup para criar um backup completo do master, mas isso irá bloqueá-lo por uns bons 10 minutos, já que o banco de dados tem cerca de 20GB de tamanho.

Solução possível

FLUSH TABLES COM READ LOCK no slave B , use SHOW SLAVE STATUS em B , anote o log binário e a posição. 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 log binário que acabei de anotar.

Pergunta

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

    
por Alex Recarey 08.04.2011 / 16:55

6 respostas

18

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

Etapa 1) Configurar um novo servidor (ServerC)

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

Passo 3) No ServerC, service mysql stop

Passo 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

Passo 6) rsync / var / lib / mysql no ServerB para o ServerC

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

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

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

Passo 10) No ServerC, service mysql start

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

Experimente!

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

    
por 08.04.2011 / 18:12
3

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

  • tire um escravo offline
  • copiar o diretório de dados do banco de dados para o novo escravo (configurações escravo - posição do registro, host mestre, etc. - estará correto, pois copiámos de um escravo)
  • inicie o escravo original
  • modifique server-id em my.cnf para o novo escravo
  • inicie um novo escravo
por 08.04.2011 / 17:18
1

Eu fiz o que @RolandoMySQLDBA sugere, mas também adicionando um 6 ' e um > 8 ' passos (isto resolve o que @ Hussain Tamboli comments.):

Etapa 1) Configurar um novo servidor (ServerC)

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

Passo 3) No ServerC, service mysql stop

Passo 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

Passo 6) rsync / var / lib / mysql no ServerB para o ServerC

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

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

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

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

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

Passo 10) No ServerC, service mysql start

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

    
por 13.06.2016 / 23:35
0

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

Você faz backups noturnos / semanais em seu sistema? Em caso afirmativo, observe também a posição com o seu backup, então você pode usar esse backup para configurar um novo escravo. Basta deixar e permitir que ele fique atualizado por algum tempo.

    
por 08.04.2011 / 17:20
0

Eu tentei respostas de Rolando e funcionou bem, mas foi iniciado repetindo desde o início e eu tive que adicionar mais código de erro para pular (eu sei que não é recomendado, mas eu sei o que estava fazendo).

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

    
por 30.08.2018 / 19:00
-2

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

    
por 26.10.2016 / 23:48