Estratégia de recuperação para replicação Master-Master


8

Eu implementei uma solução HA para mysql com base na replicação master-master. Existe um mecanismo na parte frontal que garante que apenas um banco de dados seja lido / gravado em um determinado momento (ou seja, usamos apenas replicação para HA).

Confirmei que a replicação funciona conforme o esperado, mas estou me perguntando sobre o cenário de falha e a recuperação. Em particular, me preocupo com o que acontece quando um mestre falha em um estado irrecuperável e precisa ser recriado do outro mestre:

  • Como o outro mestre está ativo e provavelmente usado, não posso bloqueá-lo e criar despejos mysqldump(nossos bancos de dados são moderadamente grandes e mysqldumppodem levar horas após alguns meses de uso).
  • Mesmo assumindo que eu tenho um despejo, é crucial que a posição do binlog, conforme mostrado por SHOW MASTER STATUS, corresponda ao despejo que está sendo feito após o bloqueio do banco de dados.

A solução simples para o primeiro problema é usar um terceiro banco de dados que funcione como um backup, do qual eu posso fazer o mysqldump. Mas como garantir que o mestre recriado possa iniciar a replicação do mestre em execução de maneira consistente?


Considere adicionar um escravo a um dos mestres para que você possa executar seus despejos a partir disso. Também ajudará nos backups.
— John Gardeniers

Respostas:


2

Existem duas abordagens básicas para esse problema que eu conheço. Primeiro, se você estiver executando o InnoDB em vez do Myisam, poderá fazer o backup em uma transação (- única transação - lock-tables = FALSE), combinada com - flush-logs (não obrigatório, mas agradável) e --master-data fornecerá um backup consistente com informações de posição de replicação. Os logs de liberação redefinirão os logs antes da criação do dump, o que significa que a posição sempre será 106 e --master-data colocará o nome e a posição do arquivo de log no arquivo de dump. Obviamente, você deve executar isso no mestre para que o --master-data funcione.

A segunda maneira, que você mencionou, é usar um terceiro host para criar os backups. Nesse caso, você precisa interromper a replicação, verifique se o banco de dados é apenas leitura (embora, na verdade, todas as suas réplicas devam ser lidas somente, pois isso não afeta as gravações da replicação) e crie seu backup E registre a posição de replicação. Você não pode usar --master-data neste caso. Em vez disso, você pode fazer algo assim:

echo 'stop slave' | mysql {options)
mysqldump {your options} > DB.sql
echo 'show slave status\G' > DB.replication
echo 'start slave' | mysql {options)

Se você precisar restaurar a partir desse backup, execute a restauração e configure a replicação em que os dois parâmetros master_log_file e master_log_pos vêm do arquivo DB.replication:

master_log_file = value of Master_Log_File
master_log_pos = value of Exec_Master_Log_Pos

Nota: você pode E DEVE testar isso de outra réplica.

Nota adicional: se você tiver um conjunto de réplicas (por exemplo, se você separou as leituras das gravações de um aplicativo Web), é possível que as réplicas estejam fora de sincronia com o novo mestre; isso pode acontecer se o failover ocorrer durante um período de E / S de gravação pesada, pois as réplicas são transmitidas de forma assíncrona e não há garantia de que seu modo de espera esteja na mesma posição que as outras réplicas quando você realizar o failover. No entanto, isso ainda não aconteceu comigo ...


ótimo obrigado Tudo isso está realmente documentado no mysqldump. Por que não existe no principal doc mysql está além de mim ...
— David Cournapeau
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.