19.4.2 Обработка непредвиденной остановки реплики
Для того, чтобы репликация была устойчивой к непредвиденным остановкам сервера (иногда описываемым как безопасная при сбое), реплике необходимо иметь возможность восстановить свое состояние перед остановкой. В этом разделе описывается влияние непредвиденной остановки реплики во время репликации и как настроить реплику для наилучшей возможности продолжить репликацию после восстановления.
После непредвиденной остановки реплики при перезапуске поток SQL репликации должен восстановить информацию о том, какие транзакции уже были выполнены. Требуемая для восстановления информация хранится в репозитории метаданных применителя реплики. Этот репозиторий создается по умолчанию как таблица InnoDB с именем mysql.slave_relay_log_info. Используя этот транзакционный движок хранения, информация всегда может быть восстановлена при перезапуске. Обновления репозитория метаданных применителя фиксируются вместе с транзакциями, что означает, что информация о прогрессе реплики, записанная в этом репозитории, всегда согласована с тем, что было применено к базе данных, даже в случае непредвиденной остановки сервера. Дополнительную информацию о репозитории метаданных применителя см. в разделе 19.2.4, «Журналы ретрансляции и репозитории метаданных репликации».
Транзакции DML, а также атомарные обновления DDL обновляют позиции репликации в репозитории метаданных применителя реплики в таблице mysql.slave_relay_log_info вместе с применением изменений в базе данных как атомарной операции. Во всех остальных случаях, включая инструкции DDL, которые не являются полностью атомарными, и исключенные движки хранения, не поддерживающие атомарные DDL, в таблице mysql.slave_relay_log_info могут отсутствовать обновления, связанные с реплицированными данными, если сервер неожиданно остановится. Восстановление обновлений в этом случае является ручным процессом. Подробности об атомарной поддержке DDL в MySQL 8.4 и соответствующем поведении для репликации некоторых инструкций см. в разделе 15.1.1, «Поддержка атомарных инструкций определения данных».
Процесс восстановления реплики после непредвиденной остановки зависит от конфигурации реплики. Подробности процесса восстановления зависят от выбранного метода репликации, является ли реплика однопоточной или многопоточной, и от настроек соответствующих системных переменных. Основная цель процесса восстановления — определить, какие транзакции уже были применены к базе данных реплики до непредвиденной остановки, и извлечь и применить транзакции, которые реплика пропустила после непредвиденной остановки.
Для репликации на основе GTID процесс восстановления требует GTID транзакций, которые уже были получены или подтверждены репликой. Пропущенные транзакции можно извлечь из источника с помощью автоматического позиционирования GTID, которое автоматически сравнивает транзакции источника с транзакциями реплики и определяет пропущенные транзакции.
Для репликации на основе позиции файла процесс восстановления требует точной позиции потока SQL репликации (применителя), показывающей последнюю транзакцию, которая была применена к реплике. На основе этой позиции поток репликации I/O (получатель) извлекает из двоичного журнала источника все транзакции, которые должны быть применены к реплике с этого момента.
Использование репликации на основе GTID упрощает настройку репликации для устойчивости к непредвиденным остановкам. Автоматическое позиционирование GTID означает, что реплика может надежно идентифицировать и извлечь пропущенные транзакции, даже если есть разрывы в последовательности примененных транзакций.
Следующая информация предоставляет комбинации настроек, которые подходят для различных типов реплики, чтобы гарантировать восстановление в той мере, в какой это находится под контролем репликации.
Некоторые факторы, которые находятся вне контроля репликации, могут повлиять на процесс восстановления репликации и общее состояние репликации после процесса восстановления. В частности, настройки, которые влияют на процесс восстановления для отдельных движков хранения, могут привести к потере транзакций в случае непредвиденной остановки реплики, и, следовательно, они будут недоступны для процесса восстановления репликации. Настройка innodb_flush_log_at_trx_commit=1, упомянутая в списке ниже, является ключевой настройкой для конфигурации репликации, которая использует InnoDB с транзакциями. Однако другие настройки, специфичные для InnoDB или для других движков хранения, особенно те, которые относятся к сбросу или синхронизации, также могут повлиять. Всегда проверяйте и применяйте рекомендации, предоставленные выбранными вами движками хранения, относительно настроек для устойчивости при сбоях.
Следующая комбинация настроек реплики обеспечивает наибольшую устойчивость к непредвиденным остановкам:
При использовании репликации на основе GTID (
gtid_mode=ON), установитеSOURCE_AUTO_POSITION=1, что активирует автоматическое позиционирование GTID для подключения к источнику, чтобы автоматически определить и получить недостающие транзакции. Этот параметр устанавливается с помощью инструкцииCHANGE REPLICATION SOURCE TO. Если у реплики несколько каналов репликации, вам необходимо установить этот параметр для каждого канала индивидуально. Подробности о работе автоматического позиционирования GTID см. в разделе 19.1.3.3 «Автоматическое позиционирование GTID». При использовании репликации на основе позиции файлаSOURCE_AUTO_POSITION=1не используется, а вместо этого используется позиция в двоичном журнале или журнале ретрансляции для управления началом репликации.При использовании репликации на основе GTID (
gtid_mode=ON), установитеGTID_ONLY=1, чтобы реплика использовала только GTIDs в процессе восстановления и перестала сохранять имена и позиции файлов двоичного и ретрансляционного журналов в репозиториях метаданных репликации. Этот параметр устанавливается с помощью инструкцииCHANGE REPLICATION SOURCE TO. СGTID_ONLY=1, во время восстановления информация о позиции файла игнорируется, и используется автоматическое пропускание GTID для пропуска транзакций, которые уже были предоставлены, вместо определения правильной позиции файла. Эта стратегия более эффективна при условии, что вы очищаете журналы ретрансляции, используя значение по умолчанию дляrelay_log_purge, что означает, что необходимо проверить только один файл журнала ретрансляции.Установите
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всегда соответствует содержимому журнала ретрансляции, чтобы очистка файлов журнала ретрансляции не могла вызвать незаполненные пробелы в истории транзакций реплики в случае неожиданной остановки.Установите , что хранит позицию потока SQL репликации в таблице
InnoDBmysql.slave_relay_log_infoи обновляет её вместе с подтверждением транзакции, чтобы гарантировать всегда точную запись. Этот параметр по умолчанию;FILEустарел. Сам системный параметр также устарел, поэтому проигнорируйте его и позвольте принять значение по умолчанию. Если используетсяFILE, информация сохраняется в файле в каталоге данных, который обновляется после применения транзакции. Это создает риск потери синхронизации с источником в зависимости от того, на какой стадии обработки транзакции реплика остановится, или даже повреждение самого файла. С , восстановление не гарантируется.Установите
relay_log_recovery = ON, что включает автоматическое восстановление журнала ретрансляции сразу после запуска сервера. Эта глобальная переменная по умолчанию равнаOFFи является только для чтения во время выполнения, но вы можете установить её вONс помощью параметра--relay-log-recoveryпри запуске реплики после неожиданной остановки. Обратите внимание, что этот параметр игнорирует существующие файлы журнала ретрансляции в случае их повреждения или несоответствия. Процесс восстановления журнала ретрансляции начинает новый файл журнала ретрансляции и получает транзакции из источника, начиная с позиции потока SQL репликации, записанной в репозитории метаданных приложения. Предыдущие файлы журнала ретрансляции удаляются со временем обычным механизмом очистки реплики.
Для многопоточной реплики установка relay_log_recovery = ON автоматически обрабатывает любые несоответствия и пробелы в последовательности транзакций, выполненных из журнала ретрансляции. Эти пробелы могут возникать при использовании репликации на основе позиции файла. (Дополнительные сведения см. в разделе 19.5.1.34 «Репликация и несоответствия транзакций».) Процесс восстановления журнала ретрансляции обрабатывает пробелы тем же методом, что и инструкция START
REPLICA UNTIL SQL_AFTER_MTS_GAPS. Когда реплика достигает согласованного состояния без пробелов, процесс восстановления журнала ретрансляции продолжает получать дальнейшие транзакции из источника, начиная с позиции потока SQL репликации. При использовании репликации на основе GTID многопоточная реплика сначала проверяет, установлено ли SOURCE_AUTO_POSITION в значение ON, и если да, пропускает этап вычисления транзакций, которые следует пропустить или нет, чтобы старые журналы ретрансляции не были необходимы для процесса восстановления.
© 2025 Oracle
Licensed under the GPLv2 License.