Spec-Zone.ru › MySQL 8.4

20.5.3.2 Настройка гарантий согласованности транзакций

Хотя в разделе Точки синхронизации транзакций объясняется, что концептуально существуют две точки синхронизации, из которых вы можете выбрать: при чтении или при записи, эти термины были упрощением, и в Group Replication используются следующие термины: перед и после выполнения транзакции. Уровень согласованности может оказывать различное влияние на только-чтение и чтение/запись транзакций, обрабатываемые группой, как показано в этом разделе.

  • Как выбрать уровень согласованности

  • Влияние уровней согласованности

  • Влияние согласованности на выбор первичного узла

  • Разрешенные запросы в соответствии с правилами согласованности

В следующем списке показаны возможные уровни согласованности, которые вы можете настроить в Group Replication, используя переменную group_replication_consistency, в порядке возрастания гарантии согласованности транзакций:

  • EVENTUAL

    Ни только-чтение, ни чтение/запись транзакции не ожидают, чтобы предыдущие транзакции были применены перед выполнением. Это было поведение Group Replication до добавления переменной group_replication_consistency. Транзакция чтения/записи не ждет, пока другие члены применят транзакцию. Это означает, что транзакция может быть экспортирована на одном узле до того, как другие узлы применят ее. Это также означает, что в случае переключения первичного узла новый первичный узел может принимать новые транзакции чтения/записи до того, как все транзакции предыдущего первичного узла будут применены. Транзакции чтения могут привести к устаревшим значениям, транзакции чтения/записи — к откату из-за конфликтов.

  • BEFORE_ON_PRIMARY_FAILOVER

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

  • BEFORE

    Транзакция чтения/записи ожидает завершения всех предыдущих транзакций перед применением. Транзакция чтения ожидает завершения всех предыдущих транзакций перед выполнением. Это гарантирует, что эта транзакция читает последнее значение, влияя только на задержку транзакции. Это уменьшает нагрузку синхронизации при каждой транзакции чтения/записи, гарантируя, что синхронизация используется только для транзакций чтения. Этот уровень согласованности также включает гарантии согласованности, предоставляемые BEFORE_ON_PRIMARY_FAILOVER.

  • AFTER

    Транзакция чтения/записи ожидает, пока ее изменения не будут применены ко всем другим членам. Это значение не влияет на транзакции чтения. Этот режим гарантирует, что при подтверждении транзакции на локальном узле любые последующие транзакции чтения получат написанное значение или более новое значение на любом узле группы. Используйте этот режим с группой, используемой в основном для операций только чтения, чтобы гарантировать, что применённые транзакции чтения/записи применяются везде после их подтверждения. Это можно использовать в вашем приложении, чтобы гарантировать, что последующие чтения извлекают самые последние данные, включая самые последние записи. Это уменьшает нагрузку синхронизации при каждой транзакции чтения, гарантируя, что синхронизация используется только для транзакций чтения/записи. Этот уровень согласованности также включает гарантии согласованности, предоставляемые BEFORE_ON_PRIMARY_FAILOVER.

  • BEFORE_AND_AFTER

    Транзакция чтения/записи ожидает 1) завершения всех предыдущих транзакций перед применением и 2) пока ее изменения не будут применены на других узлах. Транзакция чтения ожидает завершения всех предыдущих транзакций перед выполнением. Этот уровень согласованности также включает гарантии согласованности, предоставляемые BEFORE_ON_PRIMARY_FAILOVER.

Уровни согласованности BEFORE и BEFORE_AND_AFTER могут использоваться как для транзакций чтения, так и для транзакций чтения/записи. Уровень согласованности AFTER не влияет на транзакции чтения, поскольку они не генерируют изменений.

Как выбрать уровень согласованности

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

  • Сценарий 1: Вы хотите сбалансировать чтения, не беспокоясь о устаревших чтениях, и групповые операции записи значительно меньше, чем групповые операции чтения. В этом случае вы должны выбрать AFTER.

  • Сценарий 2: Для набора данных, к которому применяются многочисленные записи, вы хотите выполнять периодические чтения, не беспокоясь о чтении устаревших данных. В этом случае вы должны выбрать BEFORE.

  • Сценарий 3: Вы хотите, чтобы конкретные транзакции читали только актуальные данные из группы, поэтому, когда обновляются такие чувствительные данные, как учетные данные файла, чтения всегда используют самое последнее значение. В этом случае вы должны выбрать BEFORE.

  • Сценарий 4: Для группы, которая в основном содержит данные только для чтения, вы хотите, чтобы транзакции чтения/записи применялись повсюду после подтверждения, чтобы последующие чтения выполнялись с данными, включающими ваши последние записи, и вы не несете затраты на синхронизацию для каждой транзакции чтения, а только для транзакций чтения/записи. В этом случае вы должны выбрать AFTER.

  • Сценарий 5: Для группы, которая в основном работает с данными только для чтения, вы хотите, чтобы транзакции чтения/записи читали актуальные данные из группы и применялись повсюду после подтверждения, чтобы последующие чтения выполнялись с данными, включающими последнюю запись, и вы не несете затраты на синхронизацию для каждой транзакции чтения, а только для транзакций чтения/записи. В этом случае вы должны выбрать BEFORE_AND_AFTER.

Вы можете выбрать область, для которой применяется уровень согласованности, задав group_replication_consistency с областью сеанса или глобальной областью. Это важно, потому что уровни согласованности могут негативно влиять на производительность группы, если они применяются глобально.

Чтобы применить уровень согласованности для текущего сеанса, используйте область сеанса, например:

> SET @@SESSION.group_replication_consistency= 'BEFORE';

Чтобы применить уровень согласованности ко всем сеансам, используйте глобальную область, как показано здесь:

> SET @@GLOBAL.group_replication_consistency= 'BEFORE';

Возможность настройки уровня согласованности для определенных сеансов позволяет использовать такие сценарии, как перечисленные здесь:

  • Сценарий 6: Данная система обрабатывает несколько инструкций, которые не требуют высокого уровня согласованности, но один тип инструкции требует высокой согласованности: управление разрешениями доступа к документам;. В этом сценарии система изменяет разрешения доступа, и она хочет быть уверенной, что все клиенты видят правильные разрешения. Вам нужно только SET @@SESSION.group_replication_consistency= ‘AFTER’, для этих инструкций и оставить другие инструкции работать с EVENTUAL установленным на уровне глобальной области.

  • Сценарий 7: В той же системе, что и в Сценарии 6, команде, выполняющей аналитику, нужно выполняться ежедневно, используя самые свежие данные. Для этого нужно выполнить SQL-запрос SET @@SESSION.group_replication_consistency= ‘BEFORE’ перед выполнением команды.

Подводя итог, вам не нужно выполнять все транзакции с одним и тем же уровнем согласованности, особенно если только некоторые транзакции на самом деле требуют этого.

Следует помнить, что все транзакции чтения/записи всегда упорядочены в Group Replication, поэтому даже когда вы устанавливаете уровень согласованности на AFTER для текущего сеанса, эта транзакция ожидает, пока ее изменения не будут применены ко всем членам, что означает ожидание этой и всех предыдущих транзакций, которые могут быть в очередях вторичных узлов. Другими словами, уровень согласованности AFTER ожидает всех транзакций до и включая эту.

Влияние уровней согласованности

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

Уровень согласованности BEFORE, помимо упорядочения в потоке транзакций, влияет только на локального участника. То есть, он не требует координации с другими участниками и не оказывает последствий на их транзакции. Другими словами, BEFORE влияет только на транзакции, для которых он используется.

Уровни согласованности AFTER и BEFORE_AND_AFTER оказывают побочные эффекты на параллельные транзакции, выполняемые на других участниках. Эти уровни согласованности заставляют транзакции других участников ожидать, если транзакции с уровнем согласованности EVENTUAL начинаются, в то время как транзакция с уровнем AFTER или BEFORE_AND_AFTER уже выполняется. Другие участники ожидают, пока транзакция AFTER не будет подтверждена на этом участнике, даже если транзакции других участников имеют уровень согласованности EVENTUAL. Другими словами, AFTER и BEFORE_AND_AFTER влияют на все ONLINE участники группы.

Для дальнейшей иллюстрации представьте группу из 3 участников, M1, M2 и M3. На участнике M1 клиент выполняет:

> SET @@SESSION.group_replication_consistency= AFTER;
> BEGIN;
> INSERT INTO t1 VALUES (1);
> COMMIT;

Затем, пока вышеупомянутая транзакция применяется, на участнике M2 клиент выполняет:

> SET SESSION group_replication_consistency= EVENTUAL;

В этой ситуации, даже несмотря на то, что уровень согласованности второй транзакции является EVENTUAL, поскольку она начинает выполняться, в то время как первая транзакция уже находится на стадии подтверждения на M2, вторая транзакция должна дождаться завершения подтверждения первой транзакции и только после этого может быть выполнена.

Вы можете использовать уровни согласованности BEFORE, AFTER и BEFORE_AND_AFTER только на ONLINE участниках. Попытка использовать их на участниках в других состояниях приводит к ошибке сеанса.

Транзакции, уровень согласованности которых не является EVENTUAL, приостанавливают выполнение до истечения таймаута, настроенного переменной wait_timeout, которая по умолчанию составляет 8 часов. Если таймаут истекает, генерируется ошибка.

Влияние согласованности на выборы первичного сервера

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

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

При включении и правильной настройке управления потоком в группе существует лишь небольшая вероятность временного чтения устаревших данных с недавно избранного первичного сервера сразу после продвижения, поскольку задержка не должна быть существенной, или если она есть, то она должна быть небольшой. Кроме того, у вас могут быть прокси-серверы или промежуточные слои, которые управляют доступом приложения к первичному серверу после продвижения и обеспечивают соблюдение критериев согласованности на этом уровне. Вы можете указать поведение нового первичного сервера после его продвижения, используя переменную group_replication_consistency, которая управляет тем, блокирует ли недавно избранный первичный сервер чтение и запись до тех пор, пока задержка не будет полностью применена. Если переменная group_replication_consistency была установлена в значение BEFORE_ON_PRIMARY_FAILOVER на недавно избранном первичном сервере, у которого есть задержка для применения, и транзакции направляются на новый первичный сервер, в то время как он все еще применяет задержку, входящие транзакции блокируются до тех пор, пока задержка не будет полностью применена. Это предотвращает следующие аномалии:

  • Отсутствие устаревших чтений для транзакций только на чтение и на чтение/запись. Это предотвращает получение устаревших чтений приложению новым первичным сервером.

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

  • Отсутствие смещения чтения при транзакциях на чтение/запись, например, такой:

    > BEGIN;
    > SELECT x FROM t1; -- x=1 because x=2 is in the backlog;
    > INSERT x INTO t2;
    > COMMIT;
    

    Этот запрос не должен вызывать конфликт, но записывает устаревшие значения.

Подводя итог, когда group_replication_consistency установлено в значение BEFORE_ON_PRIMARY_FAILOVER, вы выбираете приоритет согласованности над доступностью, так как чтение и запись удерживаются всякий раз, когда выбирается новый первичный сервер. Это компромисс, который необходимо учитывать при настройке вашей группы. Также следует помнить, что если управление потоком работает правильно, задержка должна быть минимальной. Обратите внимание, что более высокие уровни согласованности BEFORE, AFTER и BEFORE_AND_AFTER также включают гарантии согласованности, предоставляемые BEFORE_ON_PRIMARY_FAILOVER.

Чтобы гарантировать, что группа обеспечивает один и тот же уровень согласованности независимо от того, какой участник продвинут до первичного, все участники группы должны иметь значение BEFORE_ON_PRIMARY_FAILOVER (или более высокий уровень согласованности), сохраненное в их конфигурации. Например, на каждом участнике выполните:

> SET PERSIST group_replication_consistency='BEFORE_ON_PRIMARY_FAILOVER';

Это гарантирует, что участники будут вести себя одинаково и что конфигурация сохранится после перезапуска участника.

Транзакция не может находиться в ожидании вечно, и если время ожидания превышает значение wait_timeout, возвращается ошибка ER_GR_HOLD_WAIT_TIMEOUT.

Разрешенные запросы в рамках правил согласованности

Хотя все записи удерживаются при использовании уровня согласованности BEFORE_ON_PRIMARY_FAILOVER, не все чтения блокируются, чтобы вы могли просмотреть сервер, в то время как он применяет задержку после продвижения. Это полезно для отладки, мониторинга, наблюдаемости и устранения неполадок. Некоторые запросы, не изменяющие данные, разрешены, такие как следующие:

  • Запросы SHOW: Они ограничены теми, которые не зависят от данных, а только от состояния и конфигурации.

    Разрешенные запросы SHOW включают в себя: SHOW VARIABLES, SHOW PROCESSLIST, SHOW STATUS, SHOW ENGINE INNODB LOGS, SHOW ENGINE INNODB STATUS, SHOW ENGINE INNODB MUTEX, SHOW BINARY LOG STATUS, SHOW REPLICA STATUS, SHOW CHARACTER SET, SHOW COLLATION, SHOW BINARY LOGS, SHOW OPEN TABLES, SHOW REPLICAS, SHOW BINLOG EVENTS, SHOW WARNINGS, SHOW ERRORS, SHOW ENGINES, SHOW PRIVILEGES, SHOW PROCEDURE STATUS, SHOW FUNCTION STATUS, SHOW PLUGINS, SHOW EVENTS, SHOW PROFILE, SHOW PROFILES и SHOW RELAYLOG EVENTS.

  • Запросы SET

  • Запросы DO, не использующие таблицы или загружаемые функции

  • EMPTY запросы

  • Запросы USE

  • Использование запросов SELECT к базам данных performance_schema и sys

  • Использование запросов SELECT к таблице PROCESSLIST базы данных infoschema

  • Запросы SELECT, не использующие таблицы или загружаемые функции

  • Запросы STOP GROUP_REPLICATION

  • Запросы SHUTDOWN

  • Запросы RESET PERSIST

© 2025 Oracle
Licensed under the GPLv2 License.
https://docs.oracle.com/cd/E17952_01/mysql-8.4-en/group-replication-configuring-consistency-guarantees.html

Spec-Zone.ru

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