19.4.11 Отложенная репликация
MySQL поддерживает отложенную репликацию, при которой сервер реплики намеренно выполняет транзакции позже, чем источник, по крайней мере, на заданный период времени. В этом разделе описывается, как настроить задержку репликации на реплике и как отслеживать задержку репликации.
В MySQL 8.4 метод отложенной репликации зависит от двух временных меток, immediate_commit_timestamp и original_commit_timestamp (см. Временные метки задержки репликации); отложенная репликация измеряется с помощью этих временных меток. Если ни непосредственный источник, ни реплика не используют эти временные метки, используется реализация отложенной репликации из MySQL 5.7 (см. ). В этом разделе описывается отложенная репликация между серверами, которые все используют эти временные метки.
По умолчанию задержка репликации составляет 0 секунд. Используйте оператор CHANGE
REPLICATION SOURCE TO
SOURCE_DELAY=, чтобы установить задержку на NN секунд. Транзакция, полученная от источника, не выполняется до тех пор, пока не пройдёт по крайней мере N секунд с момента её подтверждения на непосредственном источнике. Задержка происходит по каждой транзакции (а не по событию, как в предыдущих версиях MySQL), и фактическая задержка накладывается только на gtid_log_event или anonymous_gtid_log_event. Другие события в транзакции всегда следуют за этими событиями без какой-либо наложенной задержки.
START REPLICA и STOP REPLICA вступают в силу немедленно и игнорируют любую задержку. RESET
REPLICA сбрасывает задержку до 0.
Таблица Performance Schema replication_applier_configuration содержит столбец DESIRED_DELAY, который показывает настроенную задержку с использованием параметра SOURCE_DELAY. Таблица Performance Schema replication_applier_status содержит столбец REMAINING_DELAY, который показывает оставшееся количество секунд задержки.
Отложенная репликация может использоваться для нескольких целей:
Для защиты от ошибок пользователя в источнике. С задержкой вы можете откатить отложенную реплику к моменту непосредственно перед ошибкой.
Для тестирования поведения системы при наличии задержки. Например, в приложении задержка может быть вызвана большой нагрузкой на реплику. Однако сложно смоделировать такой уровень нагрузки. Отложенная репликация может моделировать задержку без необходимости моделирования нагрузки. Она также может быть использована для отладки проблем, связанных с отстающей репликой.
Для проверки того, как выглядела база данных в прошлом, без необходимости повторной загрузки резервной копии. Например, настроив реплику с задержкой в одну неделю, если вам нужно увидеть, как выглядела база данных несколько дней назад до последнего этапа разработки, можно проверить отложенную реплику.
Временные метки задержки репликации
MySQL 8.4 предоставляет новый метод измерения задержки (также называемой задержкой репликации) в топологиях репликации, который зависит от следующих временных меток, связанных с идентификатором транзакции GTID каждого события, записываемого в бинарный журнал (вместо каждого события).
original_commit_timestamp: количество микросекунд с эпохи, когда транзакция была записана (подтверждена) в бинарный журнал исходного источника.immediate_commit_timestamp: количество микросекунд с эпохи, когда транзакция была записана (подтверждена) в бинарный журнал непосредственного источника.
Вывод mysqlbinlog отображает эти временные метки в двух форматах: микросекунды с эпохи и также TIMESTAMP формате, основанном на пользовательской часовой зоне для лучшей читабельности. Например:
#170404 10:48:05 server id 1 end_log_pos 233 CRC32 0x016ce647 GTID last_committed=0
\ sequence_number=1 original_committed_timestamp=1491299285661130 immediate_commit_timestamp=1491299285843771
# original_commit_timestamp=1491299285661130 (2017-04-04 10:48:05.661130 WEST)
# immediate_commit_timestamp=1491299285843771 (2017-04-04 10:48:05.843771 WEST)
/*!80001 SET @@SESSION.original_commit_timestamp=1491299285661130*//*!*/;
SET @@SESSION.GTID_NEXT= 'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa:1'/*!*/;
# at 233
Как правило, original_commit_timestamp всегда одинакова на всех репликах, где применяется транзакция. В репликации источник-реплика original_commit_timestamp транзакции в бинарном журнале (оригинального) источника всегда совпадает с её immediate_commit_timestamp. В журнале репликации реплики original_commit_timestamp и immediate_commit_timestamp транзакции совпадают с соответствующими значениями в бинарном журнале источника; в то время как в собственном бинарном журнале, immediate_commit_timestamp транзакции соответствует момент, когда реплика подтвердила транзакцию.
В настройке Group Replication, когда исходный источник является членом группы, original_commit_timestamp генерируется, когда транзакция готова к подтверждению. Другими словами, когда она завершила выполнение на исходном источнике и её набор записей готов быть отправлен всем членам группы для сертификации. Когда исходный источник является сервером вне группы, original_commit_timestamp сохраняется. Та же самая original_commit_timestamp для конкретной транзакции реплицируется на все серверы в группе и на любые реплики за пределами группы, которые осуществляют репликацию с члена. Каждый получатель транзакции также сохраняет локальное время подтверждения в своём бинарном журнале с помощью immediate_commit_timestamp.
События изменения состояния, которые являются исключительными для Group Replication, являются особым случаем. Транзакции, содержащие эти события, генерируются каждым членом группы, но используют один и тот же идентификатор GTID (следовательно, они не выполняются сначала в источнике, а затем реплицируются в группе, но все члены группы выполняют и применяют ту же самую транзакцию). Члены группы устанавливают локальные значения временных меток для транзакций, связанных с событиями изменения состояния.
Отслеживание задержки репликации
Одним из самых распространённых способов мониторинга задержки репликации (отставания) в предыдущих версиях MySQL было использование поля Seconds_Behind_Master в выводе оператора SHOW REPLICA STATUS. Однако эта метрика не подходит, когда используется топология репликации, более сложная, чем традиционная настройка источник-реплика, например, Group Replication. Добавление immediate_commit_timestamp и original_commit_timestamp в MySQL 8 обеспечивает более подробную информацию о задержке репликации. Рекомендуемый метод отслеживания задержки репликации в топологии, поддерживающей эти временные метки, заключается в использовании следующих таблиц Performance Schema.
replication_connection_status: текущее состояние подключения к источнику, предоставляет информацию о последней и текущей транзакции, помещённой потоком подключения в журнал репликации.replication_applier_status_by_coordinator: текущее состояние координационного потока, отображающего информацию только при использовании многопоточной реплики, предоставляет информацию о последней транзакции, буферизованной координационным потоком в очередь потока, а также о транзакции, которую он в данный момент буферизует.replication_applier_status_by_worker: текущее состояние потока(ов), применяющих транзакции, полученные от источника, предоставляет информацию о транзакциях, применяемых потоком SQL репликации или каждым потоком-рабочим, при использовании многопоточной реплики.
Используя эти таблицы, вы можете отслеживать информацию о последней обработанной транзакции соответствующим потоком и о транзакции, которую этот поток обрабатывает в данный момент. Эта информация включает:
идентификатор GTID транзакции
original_commit_timestampиimmediate_commit_timestampтранзакции, извлечённые из журнала репликации репликивремя, когда поток начал обработку транзакции
для последней обработанной транзакции, время, когда поток завершил её обработку
В дополнение к таблицам Performance Schema, вывод оператора SHOW REPLICA STATUS имеет три поля, которые отображают:
SQL_Delay: Неотрицательное целое число, указывающее на конфигурируемую задержку репликации с помощьюCHANGE REPLICATION SOURCE TO SOURCE_DELAY=, гдеNNизмеряется в секундах.SQL_Remaining_Delay: КогдаReplica_SQL_Running_StateравняетсяWaiting until SOURCE_DELAY seconds after master executed event, это поле содержит целое число, указывающее на количество оставшихся секунд задержки. В других случаях это поле содержитNULL.Replica_SQL_Running_State: Строка, указывающая состояние потока SQL (аналогичноReplica_IO_State). Значение идентично значениюStateпотока SQL, отображаемому операторомSHOW PROCESSLIST.
Когда поток SQL репликации ожидает истечения задержки перед выполнением события, оператор SHOW
PROCESSLIST отображает его значение State как Waiting until SOURCE_DELAY seconds after
master executed event.
© 2025 Oracle
Licensed under the GPLv2 License.