Spec-Zone.ru › MySQL 9.2

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-9.2-en/group-replication-configuring-consistency-guarantees.html

Spec-Zone.ru

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