Spec-Zone.ru › MySQL 9.2

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 9.2 и о результате этого поведения для репликации определённых операторов см. в Разделе 15.1.1, «Поддержка атомарных операторов определения данных».

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

  • Для репликации на основе GTID процесс восстановления требует GTID транзакций, которые уже были получены или подтверждены репликой. Пропущенные транзакции можно получить от источника с помощью автоматического позиционирования GTID, которое автоматически сравнивает транзакции источника с транзакциями реплики и определяет пропущенные транзакции.

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

Использование репликации на основе 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, что заставляет реплику использовать только GTID в процессе восстановления и прекращает сохранение имен и позиций файлов бинарного журнала и журнала ретрансляции в хранилищах метаданных репликации. Этот параметр устанавливается с помощью инструкции 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 репликации в таблице InnoDB mysql.slave_relay_log_info и обновляет ее вместе с подтверждением транзакции, чтобы гарантировать точность записи. Эта настройка является значением по умолчанию; FILE устарела. Сам системный параметр также устарел, поэтому его следует опустить и разрешить значение по умолчанию. Если FILE используется, информация хранится в файле в каталоге данных, который обновляется после применения транзакции. Это создает риск потери синхронизации с источником в зависимости от стадии обработки транзакции, на которой реплика остановилась, или даже повреждения самого файла. При использовании восстановление не гарантируется.

  • Установите relay_log_recovery = ON, что включает автоматическое восстановление журнала ретрансляции сразу после запуска сервера. Эта глобальная переменная по умолчанию равна OFF и является только для чтения во время выполнения, но вы можете установить ее в ON с помощью параметра --relay-log-recovery при запуске реплики после неожиданной остановки реплики. Обратите внимание, что эта настройка игнорирует существующие файлы журнала ретрансляции, в случае их повреждения или несоответствия. Процесс восстановления журнала ретрансляции запускает новый файл журнала ретрансляции и извлекает транзакции из источника, начиная с позиции потока SQL репликации, записанной в хранилище метаданных приложения. Предыдущие файлы журнала ретрансляции удаляются со временем механизмом обычной очистки реплики.

Для многопоточной реплики установка relay_log_recovery = ON автоматически обрабатывает любые несоответствия и пробелы в последовательности транзакций, которые были выполнены из журнала ретрансляции. Эти пробелы могут возникать при использовании репликации на основе позиции файла. (Подробнее см. Раздел 19.5.1.35, «Несоответствия репликации и транзакций».) Процесс восстановления журнала ретрансляции обрабатывает пробелы с помощью того же метода, что и инструкция START REPLICA UNTIL SQL_AFTER_MTS_GAPS. Когда реплика достигает согласованного состояния без пробелов, процесс восстановления журнала ретрансляции продолжает извлекать дополнительные транзакции из источника, начиная с позиции потока SQL репликации. При использовании репликации на основе GTID многопоточная реплика сначала проверяет, установлено ли SOURCE_AUTO_POSITION в ON, и если это так, пропускает этап расчета транзакций, которые следует пропустить или не пропустить, чтобы старые журналы ретрансляции не потребовались для процесса восстановления.

© 2025 Oracle
Licensed under the GPLv2 License.
https://docs.oracle.com/cd/E17952_01/mysql-9.2-en/replication-solutions-unexpected-replica-halt.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API