Стратегия восстановления репликации Мастер-Мастер

8

Я реализовал решение высокой доступности для MySQL на основе репликации мастер-мастер. В интерфейсной части есть механизм, который гарантирует, что только один дБ будет считан / записан в определенный момент времени (т.е. мы используем только репликацию для HA).

Я подтвердил, что репликация работает, как и ожидалось, но меня интересует сценарий сбоя и восстановления. В частности, я беспокоюсь о том, что происходит, когда один мастер выходит из строя в неисправимом состоянии, и его необходимо воссоздать с другого мастера:

  • Поскольку другой мастер работает и, скорее всего, используется, я не могу заблокировать его и создать дампы mysqldump(наши базы данных достаточно велики и mysqldumpмогут легко занять часы после нескольких месяцев использования).
  • Даже если предположить, что у меня есть дамп, очень важно, чтобы положение binlog, как показано в SHOW MASTER STATUS, соответствовало дампу, который выполняется после блокировки базы данных.

Простое решение первой проблемы - использовать третью базу данных в качестве резервной копии, из которой я могу сделать mysqldump. Но как тогда убедиться, что воссозданный мастер может начать репликацию с работающего мастера согласованным образом?

Дэвид Курнапо
источник
Подумайте о добавлении ведомого к одному из мастеров, чтобы вы могли выполнять свои дампы из этого. Это также поможет для резервного копирования.
Джон Гарденерс

Ответы:

2

Есть два основных подхода к этой проблеме, о которых я знаю. Во-первых, если вы используете InnoDB вместо Myisam, то вы можете выполнить резервное копирование в транзакции (--single -action --lock-tables = FALSE), которая в сочетании с --flush-logs (не требуется, но приятно) и --master-data предоставит вам согласованную резервную копию с информацией о положении репликации. Сброс журналов сбросит журналы до создания дампа, что означает, что позиция всегда будет 106, а --master-data поместит имя и позицию файла журнала прямо в файл дампа. Конечно, вы должны запустить это на мастере, чтобы --master-data работал.

Второй способ, который вы упомянули, - использовать третий хост для создания резервных копий. В этом случае вам необходимо остановить репликацию, убедиться, что БД доступна только для чтения (хотя на самом деле все ваши реплики должны быть только для чтения, поскольку это не влияет на запись из репликации), а затем создать резервную копию и записать позицию репликации. Вы не можете использовать --master-data в этом случае. Вместо этого вы можете сделать что-то вроде этого:

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

Если вам когда-либо понадобится восстановить из этой резервной копии, вы должны запустить восстановление и затем настроить репликацию, где два параметра master_log_file и master_log_pos берутся из файла DB.replication:

master_log_file = value of Master_Log_File
master_log_pos = value of Exec_Master_Log_Pos

Примечание: вы можете И ДОЛЖНЫ проверить это из другой реплики.

Дополнительное примечание: если у вас есть пул реплик (например, если вы разделили операции чтения и записи для веб-приложения), реплики могут быть не синхронизированы с новым мастером; это может произойти, если переход на другой ресурс происходит в период интенсивного ввода-вывода при записи, поскольку реплики передаются асинхронно, и нет никакой гарантии, что ваш резервный ресурс находится в том же положении, что и другие реплики, при переключении. Однако со мной этого еще не произошло ...

Grep
источник
большое спасибо. Все это фактически задокументировано в mysqldump. Почему это происходит не в главном тузд док за меня ...
Дэвид Cournapeau