20.1.3.1 Режим с одним первичным сервером
В режиме с одним первичным сервером (group_replication_single_primary_mode=ON) группа содержит один первичный сервер, настроенный на чтение и запись. Все остальные члены группы настроены на чтение (с super_read_only=ON). Первичный сервер обычно инициализирует всю группу. Все другие серверы, присоединяющиеся к группе, узнают о первичном сервере и автоматически переключаются в режим только для чтения.
В режиме с одним первичным сервером Group Replication гарантирует, что только один сервер производит запись в группу, поэтому, по сравнению с режимом с несколькими первичными серверами, проверка согласованности может быть менее строгой, а операторы DDL не требуют дополнительного внимания. Параметр group_replication_enforce_update_everywhere_checks включает или отключает строгие проверки согласованности для группы. При развертывании в режиме с одним первичным сервером или изменении режима группы на режим с одним первичным сервером эта системная переменная должна быть установлена в значение OFF.
Член, назначенный первичным сервером, может измениться следующим образом:
Если существующий первичный сервер покидает группу (добровольно или неожиданно), новый первичный сервер выбирается автоматически.
Вы можете назначить конкретного члена новым первичным сервером, используя функцию
group_replication_set_as_primary().Если вы используете функцию
group_replication_switch_to_single_primary_mode()для изменения группы, работающей в режиме с несколькими первичными серверами, на режим с одним первичным сервером, новый первичный сервер выбирается автоматически или вы можете назначить нового первичного сервера, указав его в функции.
Когда выбирается новый первичный сервер (автоматически или вручную), он автоматически переключается в режим чтения и записи, а другие члены группы остаются вторичными и работают только в режиме чтения. На следующей диаграмме показан этот процесс:
Рисунок 20.4 Выбор нового первичного сервера
Когда выбирается новый первичный сервер, он может иметь накопленные изменения, которые были применены на старом первичном сервере, но еще не применены на новом. В этом случае, до тех пор, пока новый первичный сервер не догонит старый, транзакции чтения/записи могут привести к конфликтам и быть отменены, а транзакции только для чтения — к устаревшим данным. Механизм управления потоком Group Replication минимизирует разницу между быстрыми и медленными членами, а, следовательно, уменьшает вероятность этого, если он активирован и правильно настроен. Более подробную информацию см. в Разделе 20.7.2, «Управление потоком». Вы также можете использовать системную переменную group_replication_consistency для установки уровня согласованности транзакций в группе, чтобы предотвратить эту проблему. Установка этой переменной в значение BEFORE_ON_PRIMARY_FAILOVER (по умолчанию) или любой более высокий уровень согласованности удерживает новые транзакции на только что избранном первичном сервере, пока не будет обработана вся очередь.
Более подробную информацию о согласованности транзакций см. в Разделе 20.5.3, «Гарантии согласованности транзакций». Если управление потоком и гарантии согласованности транзакций не используются для группы, рекомендуется подождать, пока новый первичный сервер применит свой релейный журнал, связанный с репликацией, прежде чем перенаправлять к нему клиентские приложения.
20.1.3.1.1 Алгоритм выбора первичного сервера
Автоматический процесс выбора первичного члена включает в себя проверку каждым членом нового представления группы, упорядочивание потенциальных новых первичных членов и выбор члена, который подходит лучше всего. Каждый член принимает собственное решение локально, следуя алгоритму выбора первичного сервера, используемому в его релизе MySQL Server. Поскольку все члены должны прийти к одному решению, члены адаптируют свой алгоритм выбора первичного сервера, если другие члены группы используют более старые версии MySQL Server, чтобы обеспечить такое же поведение, как у члена с самой низкой версией MySQL Server в группе.
Факторы, учитываемые членами при выборе первичного сервера, упорядочены следующим образом:
Первым фактором является член или члены, использующие самую старую версию MySQL Server. Все члены группы сначала упорядочиваются по номеру патча их релиза.
-
Если несколько членов используют самую низкую версию MySQL Server, вторым фактором является вес каждого из этих членов, как указано в системной переменной
group_replication_member_weightна члене.Системная переменная
group_replication_member_weightопределяет число в диапазоне от 0 до 100. Все члены по умолчанию имеют вес 50, поэтому установите вес ниже этого значения, чтобы снизить их позицию в упорядочении, и выше этого значения, чтобы увеличить ее. Вы можете использовать эту функцию взвешивания, чтобы отдать приоритет использованию лучшего оборудования или гарантировать переход к определенному члену во время запланированного технического обслуживания первичного сервера. Если несколько членов используют самую низкую версию MySQL Server и несколько из этих членов имеют наибольший вес члена (или взвешивание членов игнорируется), третьим фактором является лексикографический порядок сгенерированных UUID серверов каждого члена, как указано в системной переменной
server_uuid. В качестве первичного выбирается член с наименьшим UUID сервера. Этот фактор служит гарантированным и предсказуемым развязывающим условием, чтобы все члены группы пришли к одному решению, если это невозможно определить по важным факторам.
20.1.3.1.2 Поиск первичного сервера
Чтобы узнать, какой сервер в данный момент является первичным при развертывании в режиме с одним первичным сервером, используйте столбец MEMBER_ROLE в таблице performance_schema.replication_group_members. Например:
mysql> SELECT MEMBER_HOST, MEMBER_ROLE FROM performance_schema.replication_group_members;
+-------------------------+-------------+
| MEMBER_HOST | MEMBER_ROLE |
+-------------------------+-------------+
| remote1.example.com | PRIMARY |
| remote2.example.com | SECONDARY |
| remote3.example.com | SECONDARY |
+-------------------------+-------------+
© 2025 Oracle
Licensed under the GPLv2 License.