Spec-Zone.ru › MariaDB

MASTER_GTID_WAIT

Синтаксис

MASTER_GTID_WAIT(gtid-list[, timeout)

Описание

Эта функция принимает строку, содержащую список глобальных идентификаторов транзакций (global transaction id's) через запятую (аналогично значению, например, global transaction id's). Она ожидает, пока значение gtid_slave_pos не будет иметь такое же или большее значение seq_no во всех областях репликации, указанных в списке gtid; другими словами, она ожидает, пока раб не достигнет указанной позиции GTID.

Необязательный второй аргумент задаёт таймаут в секундах. Если таймаут истечёт до достижения указанной позиции GTID, функция вернёт -1. Передача NULL или отрицательного числа для таймаута означает отсутствие таймаута, и функция будет ждать неопределённо долго.

Если ожидание завершится без таймаута, возвращается 0. Передача NULL для списка gtid заставит функцию вернуть NULL сразу же, не дожидаясь.

Список gtid может быть пустой строкой, в этом случае MASTER_GTID_WAIT() вернётся сразу. Если список gtid содержит меньше областей, чем gtid_slave_pos, то ожидание будет выполнено только для этих областей. Если список gtid содержит область, отсутствующую в @@gtid_slave_pos, MASTER_GTID_WAIT() будет ждать, пока на рабе не придёт событие, содержащее такой domain_id (или пока не истечёт таймаут или не будет прервано).

MASTER_GTID_WAIT() может быть полезной для обеспечения того, что раб догнал мастер. Просто возьмите значение gtid_binlog_pos на мастере и используйте его в вызове MASTER_GTID_WAIT() на рабе; после завершения вызова раб догонит позицию мастера.

MASTER_GTID_WAIT() также может использоваться в приложениях-клиентах вместе с переменной сессии last_gtid. Это полезно в конфигурации масштабирования чтения репликации, где приложение записывает в один мастер, но распределяет чтения по нескольким рабам для распределения нагрузки. В такой конфигурации существует риск, что приложение сначала выполнит обновление на мастере, а затем немного позже выполнит чтение на рабе, и если раб не достаточно быстр, прочитанные данные с раба могут не включать только что сделанное обновление, что может сбить с толку приложение и/или конечного пользователя. Один из способов избежать этого — запросить значение last_gtid на мастере сразу после обновления. Затем перед выполнением чтения на рабе выполните MASTER_GTID_WAIT() со значением, полученным с мастера; это гарантирует, что чтение не будет выполнено, пока раб не реплицирует достаточно далеко, чтобы обновление стало видимым.

Обратите внимание, что MASTER_GTID_WAIT() может использоваться даже если раб настроен не использовать GTID для подключений (CHANGE MASTER TO master_use_gtid=no). Это связано с тем, что начиная с MariaDB 10, GTID всегда регистрируются на сервере-мастере и всегда записываются на серверах-рабах.

Отличия от MASTER_POS_WAIT()

  • MASTER_GTID_WAIT() является глобальной; она ожидает, что любое подключение мастера достигнет указанной позиции GTID. MASTER_POS_WAIT() работает только с определённым подключением. Это также означает, что в то время как MASTER_POS_WAIT() прерывается, если подключение мастера завершается с помощью STOP SLAVE или из-за ошибки, MASTER_GTID_WAIT() продолжает ждать, пока рабы остановлены.
  • MASTER_GTID_WAIT() может принимать таймаут как число с плавающей точкой, поэтому поддерживается таймаут в долях секунды, например, MASTER_GTID_WAIT("0-1-100", 0.5). (Минимальное ожидание составляет одну микросекунду, 0.000001 секунды).
  • MASTER_GTID_WAIT() позволяет указать таймаут нулём, чтобы выполнить проверку без блокировки, чтобы увидеть, продвинулись ли рабы до определённой позиции GTID (MASTER_POS_WAIT() принимает нулевой таймаут как означающий бесконечное ожидание). Чтобы выполнить бесконечное MASTER_GTID_WAIT(), укажите отрицательный таймаут или опустите аргумент таймаута.
  • MASTER_GTID_WAIT() не возвращает количество обработанных событий с момента начала ожидания, а также не возвращает NULL, если поток раба остановлен. Он всегда возвращает либо 0 для успешного завершения ожидания, либо -1 для достижения таймаута (или NULL, если указанная позиция gtid-pos является NULL).

Поскольку MASTER_GTID_WAIT() рассматривает только часть seq_no GTID, а не server_id, необходимо быть осторожным, если раб становится разошедшимся с другим сервером, так что два разных GTID с одинаковым seq_no (в одной и той же области) приходят на тот же сервер. В любом случае лучше избегать этой ситуации; рекомендуется установить gtid_strict_mode, так как это предотвратит репликацию любых таких некорректных порядковых номеров на рабе.

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

© 2023 MariaDB
Licensed under the Creative Commons Attribution 3.0 Unported License and the GNU Free Documentation License.
https://mariadb.com/kb/en/master_gtid_wait/

Spec-Zone.ru

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