Я реализовал решение высокой доступности для MySQL на основе репликации мастер-мастер. В интерфейсной части есть механизм, который гарантирует, что только один дБ будет считан / записан в определенный момент времени (т.е. мы используем только репликацию для HA).
Я подтвердил, что репликация работает, как и ожидалось, но меня интересует сценарий сбоя и восстановления. В частности, я беспокоюсь о том, что происходит, когда один мастер выходит из строя в неисправимом состоянии, и его необходимо воссоздать с другого мастера:
- Поскольку другой мастер работает и, скорее всего, используется, я не могу заблокировать его и создать дампы
mysqldump
(наши базы данных достаточно велики иmysqldump
могут легко занять часы после нескольких месяцев использования). - Даже если предположить, что у меня есть дамп, очень важно, чтобы положение binlog, как показано в SHOW MASTER STATUS, соответствовало дампу, который выполняется после блокировки базы данных.
Простое решение первой проблемы - использовать третью базу данных в качестве резервной копии, из которой я могу сделать mysqldump
. Но как тогда убедиться, что воссозданный мастер может начать репликацию с работающего мастера согласованным образом?
источник
Ответы:
Есть два основных подхода к этой проблеме, о которых я знаю. Во-первых, если вы используете InnoDB вместо Myisam, то вы можете выполнить резервное копирование в транзакции (--single -action --lock-tables = FALSE), которая в сочетании с --flush-logs (не требуется, но приятно) и --master-data предоставит вам согласованную резервную копию с информацией о положении репликации. Сброс журналов сбросит журналы до создания дампа, что означает, что позиция всегда будет 106, а --master-data поместит имя и позицию файла журнала прямо в файл дампа. Конечно, вы должны запустить это на мастере, чтобы --master-data работал.
Второй способ, который вы упомянули, - использовать третий хост для создания резервных копий. В этом случае вам необходимо остановить репликацию, убедиться, что БД доступна только для чтения (хотя на самом деле все ваши реплики должны быть только для чтения, поскольку это не влияет на запись из репликации), а затем создать резервную копию и записать позицию репликации. Вы не можете использовать --master-data в этом случае. Вместо этого вы можете сделать что-то вроде этого:
Если вам когда-либо понадобится восстановить из этой резервной копии, вы должны запустить восстановление и затем настроить репликацию, где два параметра master_log_file и master_log_pos берутся из файла DB.replication:
Примечание: вы можете И ДОЛЖНЫ проверить это из другой реплики.
Дополнительное примечание: если у вас есть пул реплик (например, если вы разделили операции чтения и записи для веб-приложения), реплики могут быть не синхронизированы с новым мастером; это может произойти, если переход на другой ресурс происходит в период интенсивного ввода-вывода при записи, поскольку реплики передаются асинхронно, и нет никакой гарантии, что ваш резервный ресурс находится в том же положении, что и другие реплики, при переключении. Однако со мной этого еще не произошло ...
источник