16.3.2 Обработка непредвиденной остановки реплики
Для того, чтобы репликация была устойчивой к непредвиденным остановкам сервера (иногда описываемым как безопасная при сбоях), необходимо, чтобы реплика могла восстановить своё состояние перед остановкой. В этом разделе описывается влияние непредвиденной остановки реплики во время репликации и способы конфигурации реплики для наилучшего шанса на восстановление и продолжение репликации.
После непредвиденной остановки реплики при перезапуске поток SQL репликации должен восстановить информацию о том, какие транзакции уже были выполнены. Требуемая для восстановления информация хранится в репозитории метаданных применяющего модуля реплики. В более старых версиях MySQL Server этот репозиторий мог создаваться только как файл в каталоге данных, обновляемый после применения транзакции. В MySQL 5.7 вы можете вместо этого использовать таблицу InnoDB с именем mysql.slave_relay_log_info для хранения репозитория метаданных применяющего модуля. В качестве таблицы, обновления репозитория метаданных применяющего модуля выполняются вместе с транзакциями, что означает, что информация о прогрессе реплики, записанная в этом репозитории, всегда согласована с тем, что было применено к базе данных, даже в случае непредвиденной остановки сервера. Чтобы настроить MySQL 5.7 на хранение репозитория метаданных применяющего модуля в виде таблицы InnoDB, установите системную переменную relay_log_info_repository в значение TABLE. Более подробная информация о репозитории метаданных применяющего модуля приведена в разделе 16.2.4, «Журнал ретрансляции и репозитории метаданных репликации».
Процесс восстановления реплики после непредвиденной остановки зависит от конфигурации реплики. Подробности процесса восстановления зависят от выбранного метода репликации, является ли реплика однопоточной или многопоточной, и от настройки соответствующих системных переменных. Основной целью процесса восстановления является определение транзакций, которые уже были применены к базе данных реплики до момента непредвиденной остановки, а также извлечение и применение транзакций, которые реплика пропустила после непредвиденной остановки.
Для репликации на основе GTID процесс восстановления требует GTID транзакций, которые уже были получены или завершены репликой. Пропущенные транзакции могут быть извлечены из источника с помощью автоматической позиционирования по GTID, которая автоматически сравнивает транзакции источника с транзакциями реплики и определяет пропущенные транзакции.
Для репликации на основе позиции файла процесс восстановления требует точной позиции потока SQL репликации (применителя), показывающей последнюю применённую транзакцию на реплике. На основании этой позиции поток ввода-вывода репликации (приёмник) извлекает из бинарного журнала источника все транзакции, которые должны быть применены к реплике от этого момента.
Использование репликации на основе GTID упрощает настройку репликации, устойчивой к непредвиденным остановкам. Автоматическое позиционирование по GTID означает, что реплика может надёжно идентифицировать и извлечь пропущенные транзакции, даже если в последовательности применённых транзакций есть пробелы.
Следующая информация предоставляет сочетания настроек, подходящих для разных типов реплик, чтобы гарантировать восстановление, насколько это контролируется репликацией.
Некоторые факторы, не подконтрольные репликации, могут повлиять на процесс восстановления репликации и общее состояние репликации после процесса восстановления. В частности, настройки, влияющие на процесс восстановления отдельных двигателей хранилища, могут привести к потере транзакций в случае непредвиденной остановки реплики, и, следовательно, к их недоступности для процесса восстановления репликации. Настройка innodb_flush_log_at_trx_commit=1, упомянутая в списке ниже, является ключевой настройкой для конфигурации репликации, использующей InnoDB с транзакциями. Однако другие настройки, специфичные для InnoDB или для других двигателей хранилища, особенно те, которые относятся к сбросу или синхронизации, также могут повлиять. Всегда проверяйте и применяйте рекомендации, предоставляемые выбранными вами двигателями хранилища, относительно настроек безопасной работы при сбоях.
Следующее сочетание настроек реплики наиболее устойчиво к непредвиденным остановкам:
При использовании репликации на основе GTID (
gtid_mode=ON), установитеMASTER_AUTO_POSITION=1, что активирует автоматическое позиционирование по GTID для подключения к источнику, чтобы автоматически идентифицировать и извлечь пропущенные транзакции. Этот параметр устанавливается с помощью оператораCHANGE MASTER TO. Если у реплики есть несколько каналов репликации, необходимо установить этот параметр для каждого канала индивидуально. Подробнее о работе автоматического позиционирования по GTID см. раздел 16.1.3.3, «Автоматическое позиционирование по GTID». При использовании репликации на основе позиции файлаMASTER_AUTO_POSITION=1не используется, а вместо этого используется позиция бинарного журнала или журнала ретрансляции для управления началом репликации.Установите
sync_relay_log=1, что инструктирует поток ввода-вывода репликации синхронизировать журнал ретрансляции на диск после записи каждой полученной транзакции в него. Это означает, что запись реплики о текущей позиции, считанной из бинарного журнала источника (в репозитории метаданных источника), никогда не будет опережать запись о сохранённых в журнале ретрансляции транзакциях. Обратите внимание, что, хотя эта настройка наиболее безопасна, она также является самой медленной из-за большого количества операций записи на диск. Сsync_relay_log > 1илиsync_relay_log=0(где синхронизация выполняется операционной системой) в случае непредвиденной остановки реплики могут быть подтверждённые транзакции, которые ещё не были синхронизированы на диск. Такие транзакции могут привести к сбоям в процессе восстановления, если восстанавливающая реплика, исходя из информации, имеющейся в журнале ретрансляции, как последней синхронизированной на диск, попытается извлечь и применить транзакции снова вместо пропуска их. Настройкаsync_relay_log=1особенно важна для многопоточной реплики, где процесс восстановления терпит неудачу, если пробелы в последовательности транзакций не могут быть заполнены информацией в журнале ретрансляции. Для однопоточной реплики процесс восстановления использует журнал ретрансляции только в том случае, если соответствующая информация недоступна в репозитории метаданных применяющего модуля.Установите
innodb_flush_log_at_trx_commit=1, что синхронизирует журналыInnoDBна диск перед подтверждением каждой транзакции. Эта настройка, которая является значением по умолчанию, гарантирует, что таблицыInnoDBи журналыInnoDBсохраняются на диске, так что информация в журнале ретрансляции о транзакции больше не требуется. В сочетании с настройкойsync_relay_log=1эта настройка дополнительно гарантирует, что содержимое таблицInnoDBи журналовInnoDBвсегда соответствует содержимому журнала ретрансляции, чтобы удаление файлов журнала ретрансляции не могло привести к незаполненным пробелам в истории транзакций реплики в случае непредвиденной остановки.Установите
relay_log_info_repository = TABLE, которое хранит позицию потока SQL репликации в таблицеInnoDBmysql.slave_relay_log_infoи обновляет её вместе с подтверждением транзакции, чтобы гарантировать точность записи. Эта настройка не является значением по умолчанию в MySQL 5.7. Если используется значение по умолчаниюFILE, информация хранится в файле в каталоге данных, который обновляется после применения транзакции. Это создаёт риск потери синхронизации с источником в зависимости от стадии обработки транзакции, на которой произошла остановка реплики, или даже повреждения файла самого файла. С настройкойrelay_log_info_repository = FILEвосстановление не гарантируется.Установите
relay_log_recovery = ON, что включает автоматическое восстановление журнала ретрансляции сразу после запуска сервера. Эта глобальная переменная по умолчанию имеет значениеOFFи является только для чтения во время выполнения, но вы можете установить её вONс помощью опции--relay-log-recoveryпри запуске реплики после непредвиденной остановки реплики. Обратите внимание, что эта настройка игнорирует существующие файлы журнала ретрансляции, если они повреждены или несогласованы. Процесс восстановления журнала ретрансляции запускает новый файл журнала ретрансляции и извлекает транзакции из источника, начиная с позиции потока SQL репликации, записанной в репозитории метаданных применяющего модуля. Предыдущие файлы журнала ретрансляции удаляются со временем механизмом очистки реплики.
Для многопоточной реплики, начиная с MySQL 5.7.13, установка параметра relay_log_recovery = ON автоматически обрабатывает любые несоответствия и пробелы в последовательности транзакций, выполненных из релейного журнала. Эти пробелы могут возникнуть при использовании репликации на основе позиции файла. (Дополнительные сведения см. в разделе 16.4.1.32 «Репликация и несоответствия транзакций».) Процесс восстановления релейного журнала обрабатывает пробелы тем же методом, что и команда START
SLAVE UNTIL SQL_AFTER_MTS_GAPS. Когда реплика достигает согласованного состояния без пробелов, процесс восстановления релейного журнала переходит к извлечению дополнительных транзакций из источника, начиная с позиции репликации SQL-потока. В версиях MySQL до MySQL 5.7.13 этот процесс не был автоматическим и требовал запуска сервера с параметром relay_log_recovery = OFF, запуска реплики с помощью START SLAVE UNTIL
SQL_AFTER_MTS_GAPS для исправления любых несоответствий в транзакциях и последующего перезапуска реплики с параметром relay_log_recovery = ON. При использовании репликации на основе GTID, начиная с MySQL 5.7.28, многопоточная реплика сначала проверяет, установлено ли значение MASTER_AUTO_POSITION в ON, и если это так, пропускает этап расчета транзакций, которые следует пропустить или не пропустить, чтобы старые релейные журналы не потребовались для процесса восстановления.
© 2025 Oracle
Licensed under the GPLv2 License.