Um escravo, vários mestres MySql


9

É possível configurar o MySql Replication para que um escravo escute dois mestres diferentes?

Respostas:


3

Por design, um processo mysqld não pode ouvir simultaneamente dois mestres diferentes.

O comando CHANGE MASTER TO permite apenas definir um mestre como fonte para leitura.

Para imitar isso, você teria que alternar entre os dois mestres programaticamente. Como você faz isso ?

Descrevi no StackOverflow como conectar um escravo manualmente a diferentes mestres, onde cada mestre era um laptop e o escravo era um computador central.

Aqui está a ideia básica

  • Master M1
  • Master M2
  • Escravo S1

Replicação de instalação de M1 para S1 e M2 para S1 como este

  • 1) Faça com que S1 execute CHANGE MASTER TO com M1 como a Origem
  • 2) ESCRAVO DE INÍCIO;
  • 3) Execute a replicação por um tempo
  • 4) PARE DE ESCRAVO;
  • 5) Faça com que S1 execute CHANGE MASTER TO com M2 como a Origem
  • 6) ESCRAVO DE INÍCIO;
  • 7) Execute a replicação por um tempo
  • 8) PARE DE ESCRAVO;
  • 9) Volte ao passo 1

Cada vez que você alterna de um mestre para outro, é necessário registrar dois valores de SHOW SLAVE STATUS\G

  1. Relay_Master_Log_file
  2. Exec_Master_Log_Pos

Esses dois valores representam a última instrução SQL que veio do mestre e foi a próxima a ser executada no escravo.

Há um grande cuidado: enquanto M1 e M2 estão atualizando bancos de dados mutuamente exclusivos, esse algoritmo deve estar bem.

Acredite ou não, eu resolvi uma pergunta como essa no ServerFault em maio de 2011. Na verdade, eu expliquei como emular verdadeiro escravo multimaster / único usando o BLACKHOLE Storage Engine baseado no livro "High Performance MySQL".


Embora eu ainda não precisei realmente disso, estive pensando sobre esse problema anteriormente. Não seria possível canalizar basicamente o binlog do segundo mestre no escravo do mysql? Eu acho que a melhor coisa seria ter uma ferramenta que também fique de olho nos resultados de cada consulta e pare em um erro, como faz o thread escravo de replicação normal. Mas, em essência, um tubo simples também deve funcionar. É claro que ambos os mestres que escrevem no mesmo banco de dados / tabela se tornariam complicados rapidamente. Algo para você refletir sobre gurus?
Janes

11
Acho que vale a pena acrescentar à sua resposta que, embora o MySQL 5.6 não faça isso, o 5.7 suportará vários mestres.
Phil Sumner

4

A solução da Rolando tem muitas ressalvas. O primeiro é que um fluxo de réplica não está necessariamente replicando enquanto o outro funciona. Isso lhe dará períodos de tempo em que seu escravo está fora de sincronia. Agora você precisa executar um ato delicado de equilíbrio para garantir que cada um tenha tempo suficiente para recuperar o atraso quando tiver sua "vez".

Conforme descrito, você também deve desempenhar o papel de guarda-livros das posições dos registros para retornar. Isso realmente parece com erros, abrir a janela para dados ausentes ou inconsistentes ou até interromper a replicação quando ocorrer um erro (causado por um erro apenas 'desligado por um' na posição do log)

Eu recomendaria apenas executar várias instâncias mysql. Não há nada que o impeça de executar dois ou mais mysql na mesma máquina. Ambos não podem operar na mesma porta, é claro. Eu realmente não vejo isso como um problema, pois cada cliente e biblioteca permite que você especifique algo diferente de 3306.

Basta especificar a porta = 3307 (ou qualquer outro dos arquivos .cnf).

Você também deve tomar cuidado para garantir que os buffer pools configurados individualmente e outras configurações de memória não estejam em desacordo. Isso é realmente um benefício, pois você pode ajustar essas configurações com mais precisão aos requisitos específicos dos bancos de dados individuais que estão sendo replicados.

Dessa forma, você apenas tem dois fluxos de replicação em execução no mesmo servidor; nunca atrasado, não é necessário manter livros, não é necessário script de "troca".


Fico feliz que alguém entenda a loucura da contabilidade. Boa resposta também. +1 !!!
RolandoMySQLDBA


Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.