Temos dois datacenters com uma cópia do nosso aplicativo web (plataforma de treinamento online) em cada um. O datacenter primário recebe todo o tráfego a qualquer momento e o segundo datacenter serve como failover (usando failover de DNS). Os bancos de dados são configurados em master-master com diferentes valores de auto-incremento-incremento. O servidor no datacenter 1 também possui seu próprio servidor escravo local no qual fazemos backups, dessa forma podemos pausar a replicação, fazer o backup com mysqldump e iniciar a replicação novamente.
SERVER 1 <=========> SERVER 2
|
Slave 1
Neste fim de semana, fizemos um failover no servidor 2 porque o datacenter 1 estava fazendo uma manutenção de rede planejada. Tudo correu bem e depois de algumas horas trouxemos tudo de volta para DC1. Ontem à noite, comecei a receber erros de replicação no escravo dizendo que falhou ao EXCLUIR uma entrada que não existia. Achei estranho que o Escravo 1 estivesse recebendo o erro enquanto o Servidor 2 não (já que ambos estão agindo como escravos do Servidor 1). Depois de cavar, descobri que ainda temos um usuário que está indo para o Servidor 2 .. por qualquer motivo, seu DNS não é atualizado há mais de 2 dias. Portanto, os novos dados que eles estão produzindo estão sendo replicados para o Servidor 1, mas o Escravo 1 não está recebendo essas atualizações porque não estão nos logs binários do Servidor 1.
Agora vejo que isso foi um mau planejamento da minha parte por não prever esse problema. Minha pergunta é, como posso fazer isso funcionar? Queremos manter o mestre-mestre e permitir que o Escravo 1 exista, não apenas para backups, mas para servidores adicionais de relatórios somente leitura e outros. Aqueles de vocês que dirigem o Master-Master, o que fizeram para remediar problemas semelhantes? Ou isso é apenas uma configuração ruim e eu sou SOL? O aplicativo não foi construído pensando na redundância, então tudo precisa ser feito no lado do sistema.
O que você quer é
server1
binlog não apenas suas próprias atualizações, mas também as atualizações que ele recebeu deserver2
, para queslave1
obtenha todas as atualizações.Você só precisa dizer
server1
para fazer isso, o que pode ser feito definindolog-slave-updates
como sim.Você pode querer definir esta opção
server2
também, se a topologia do servidor mudar algum dia (como Rolando gentilmente observou nos comentários abaixo).Isso não faz um loop infinito como a configuração padrão para
replicate-same-server-id
é0
(e não pode ser alterado enquantolog-slave-updates
estiver ativado). Essa configuração definida como 0 significa que o escravo ignorará as instruções que receber com seu próprio server-id.Sua decisão de infraestrutura em geral parece boa para mim.