Базы данных

MySQL Group Replication в 2026 году: построение кластера с автоматическим failover без внешних инструментов

Ruslan Ismailov Опубликовано 12 мин чтения
M

Введение: почему master-slave репликация перестаёт устраивать

Классическая master-slave репликация в MySQL решала задачу горизонтального масштабирования чтения, но никогда не была рассчитана на автоматическое восстановление после сбоя. При падении мастера инженер вручную переключал реплику, обновлял строку подключения в приложении, проверял позицию бинлога — и всё это в ночь с пятницы на субботу под звон алертов.

Проблемы классической репликации хорошо известны: асинхронность (реплика может отставать), отсутствие автоматического failover на уровне самого MySQL, риск потери транзакций при переключении и необходимость внешних инструментов вроде MHA или Orchestrator для автоматизации. В 2026 году, когда требования к SLA у большинства продуктов составляют 99,9% и выше, такой подход неприемлем для критических систем.

MySQL Group Replication — это встроенный механизм кластеризации, появившийся в MySQL 5.7.17 и значительно усиленный в версиях 8.0 и 8.4. Он обеспечивает синхронный консенсус на уровне транзакций, автоматический failover и возможность работы в нескольких режимах без единой строки внешнего кода. Если вы управляете MySQL в продакшене самостоятельно и не хотите переходить на облачные managed-решения, Group Replication — наиболее зрелый выбор для построения высокой доступности MySQL.

Архитектура MySQL Group Replication

Два режима работы: single-primary и multi-primary

Group Replication поддерживает два режима. В single-primary mode одна нода является первичной (primary) и принимает все операции записи, остальные — вторичные (secondary) и доступны только для чтения. Это самый безопасный и рекомендуемый режим: он исключает конфликты записи между нодами и соответствует привычной семантике «один мастер».

В multi-primary mode все ноды принимают записи одновременно. Это повышает пропускную способность записи, но требует тщательной работы с конфликтами: два одновременных UPDATE одной строки на разных нодах приведут к откату одной из транзакций. Этот режим подходит для специфических сценариев с шардированием по нодам или очень редкими конфликтами.

Paxos-консенсус и кворум

Под капотом Group Replication использует адаптированный алгоритм консенсуса Paxos (конкретно — реализацию XCom). Перед тем как транзакция фиксируется, группа должна достичь консенсуса: большинство нод (кворум) должны подтвердить получение события. Для кластера из трёх нод кворум — это две ноды. Это означает:

  • При падении одной ноды кластер продолжает работу.
  • При падении двух нод из трёх кластер теряет кворум и останавливает запись (защита от split-brain).
  • Минимально рекомендуемое число нод — три; для повышенной отказоустойчивости — пять.

Каждая транзакция получает глобальный идентификатор (GTID) и атомарно доставляется всем членам группы. Только после подтверждения кворумом транзакция считается зафиксированной — это принципиальное отличие от асинхронной репликации, где мастер не ждёт реплик.

Требования к инфраструктуре

Для развёртывания кластера Group Replication необходимо соблюсти ряд условий:

  • Версия MySQL: 8.0.27+ или 8.4.x (LTS-ветка, рекомендована в 2026 году). MySQL 8.4 принёс улучшения в процессе автоматического восстановления участников и упрощённый синтаксис ряда команд.
  • Движок хранилища: только InnoDB. Таблицы на MyISAM или другие движки не поддерживаются группой.
  • Первичные ключи: каждая таблица обязана иметь первичный ключ — без него Group Replication откажется фиксировать изменения.
  • Сеть: низкая задержка между нодами (желательно до 5 мс RTT). Группа использует отдельный порт для внутренней коммуникации (по умолчанию 33061). Все ноды должны видеть друг друга по этому порту.
  • Хосты: уникальный server_id, уникальный server_uuid, синхронизированное время (NTP/chrony обязателен).
  • GTID: должен быть включён на всех нодах (gtid_mode=ON, enforce_gtid_consistency=ON).

Пошаговая настройка кластера из трёх нод

Конфигурация my.cnf

Пример конфигурации для первой ноды (node1). Для node2 и node3 измените server_id, report_host и loose-group_replication_local_address:

# /etc/mysql/mysql.conf.d/mysqld.cnf — node1

[mysqld]
# Основные параметры
server_id = 1
bind-address = 0.0.0.0
report_host = node1.example.com

# GTID
gtid_mode = ON
enforce_gtid_consistency = ON

# Бинлог
log_bin = mysql-bin
binlog_format = ROW
binlog_checksum = NONE          # обязательно для GR
log_slave_updates = ON

# Group Replication — плагин
plugin_load_add = group_replication.so

# Имя группы — UUID, одинаковый для всех нод
loose-group_replication_group_name = "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee"

# Локальный адрес ноды для внутренней коммуникации GR
loose-group_replication_local_address = "node1.example.com:33061"

# Список всех нод группы
loose-group_replication_group_seeds = \
  "node1.example.com:33061,node2.example.com:33061,node3.example.com:33061"

# Не запускать GR автоматически при старте MySQL
loose-group_replication_start_on_boot = OFF

# Режим single-primary (рекомендован)
loose-group_replication_single_primary_mode = ON
loose-group_replication_enforce_update_everywhere_checks = OFF

# Восстановление через клонирование (MySQL 8.0.17+)
loose-group_replication_recovery_use_ssl = OFF

Инициализация группы на первой ноде

После запуска MySQL на всех трёх нодах выполните следующие шаги на node1:

-- 1. Создаём пользователя для репликации внутри группы
CREATE USER 'repl'@'%' IDENTIFIED BY 'StrongPassword123!';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
GRANT CONNECTION_ADMIN ON *.* TO 'repl'@'%';
GRANT BACKUP_ADMIN ON *.* TO 'repl'@'%';   -- нужен для клонирования
FLUSH PRIVILEGES;

-- 2. Настраиваем канал восстановления
CHANGE MASTER TO
  MASTER_USER='repl',
  MASTER_PASSWORD='StrongPassword123!'
  FOR CHANNEL 'group_replication_recovery';

-- 3. Инициализируем группу (только на bootstrap-ноде!)
SET GLOBAL group_replication_bootstrap_group = ON;
START GROUP_REPLICATION;
SET GLOBAL group_replication_bootstrap_group = OFF;

-- 4. Проверяем статус
SELECT * FROM performance_schema.replication_group_members;

Добавление node2 и node3

На каждой из оставшихся нод выполните (без bootstrap):

-- На node2 и node3 (одинаково)
CREATE USER 'repl'@'%' IDENTIFIED BY 'StrongPassword123!';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
GRANT CONNECTION_ADMIN ON *.* TO 'repl'@'%';
GRANT BACKUP_ADMIN ON *.* TO 'repl'@'%';
FLUSH PRIVILEGES;

CHANGE MASTER TO
  MASTER_USER='repl',
  MASTER_PASSWORD='StrongPassword123!'
  FOR CHANNEL 'group_replication_recovery';

-- Просто стартуем — нода сама найдёт группу через seeds
START GROUP_REPLICATION;

-- Убеждаемся, что нода вошла в группу
SELECT MEMBER_HOST, MEMBER_STATE, MEMBER_ROLE
FROM performance_schema.replication_group_members;

После успешного добавления всех трёх нод таблица replication_group_members покажет три строки со статусом ONLINE: одна с ролью PRIMARY, две с ролью SECONDARY.

Автоматический failover: как кластер выбирает нового лидера

Это ключевое преимущество MySQL Group Replication перед классической репликацией. При недоступности primary-ноды группа инициирует выборы автоматически:

  1. Оставшиеся ноды обнаруживают потерю связи с primary через механизм failure detection (таймаут задаётся параметром group_replication_member_expel_timeout, по умолчанию 5 секунд).
  2. Группа проверяет наличие кворума. Если две из трёх нод доступны — кворум есть.
  3. Из secondary-нод выбирается новая primary по весу: учитываются group_replication_member_weight (приоритет, по умолчанию 50) и версия MySQL. Нода с более высоким весом становится primary.
  4. Новая primary переходит в режим чтения-записи, secondary остаются read-only.
  5. Всё это происходит без участия администратора, обычно в течение 10–30 секунд.

Для управления приоритетом выборов задайте вес явно:

-- На node2: повышаем приоритет для предпочтительного primary
SET GLOBAL group_replication_member_weight = 70;

-- На node3: оставляем стандартный приоритет
SET GLOBAL group_replication_member_weight = 50;

Мониторинг состояния группы

MySQL Group Replication глубоко интегрирован с performance_schema. Основные таблицы для мониторинга:

  • performance_schema.replication_group_members — состояние и роль каждой ноды.
  • performance_schema.replication_group_member_stats — статистика транзакций: очередь сертификации, конфликты, задержки.
  • performance_schema.replication_connection_status — статус канала восстановления.
-- Общее состояние группы
SELECT
  MEMBER_HOST,
  MEMBER_PORT,
  MEMBER_STATE,
  MEMBER_ROLE,
  MEMBER_VERSION
FROM performance_schema.replication_group_members
ORDER BY MEMBER_ROLE;

-- Статистика сертификации и очередь конфликтов
SELECT
  MEMBER_ID,
  COUNT_TRANSACTIONS_IN_QUEUE,
  COUNT_TRANSACTIONS_CHECKED,
  COUNT_CONFLICTS_DETECTED,
  COUNT_TRANSACTIONS_ROWS_VALIDATING
FROM performance_schema.replication_group_member_stats;

Для автоматических алертов интегрируйте эти запросы в Prometheus через mysqld_exporter или настройте периодические проверки через собственные скрипты мониторинга. Критичные метрики для алертов: MEMBER_STATE != 'ONLINE' и рост COUNT_CONFLICTS_DETECTED.

Типичные проблемы и их решение

Split-brain и сетевое разделение

Если сеть между нодами разделяется таким образом, что ни одна подгруппа не имеет кворума, Group Replication переводит все ноды в режим ERROR и отказывается принимать записи. Это корректное поведение — лучше остановить запись, чем допустить расхождение данных. После восстановления сети ноды необходимо перезапустить:

STOP GROUP_REPLICATION;
START GROUP_REPLICATION;

Конфликты транзакций в multi-primary режиме

В multi-primary mode Group Replication использует оптимистичный механизм сертификации: транзакция откатывается, если другая нода зафиксировала изменение той же строки раньше. Приложение должно обрабатывать ошибку ERROR 1180 (HY000): Got error 149 и повторять транзакцию. Минимизируйте конфликты через шардирование запросов по нодам или переходом на single-primary mode.

Нода не может войти в группу

Частая причина — расхождение GTID-множеств. Если нода долго была недоступна, при старте Group Replication активирует механизm distributed recovery: нода копирует недостающие данные с donor-ноды через клонирование (если установлен плагин mysql_clone.so) или через бинлоги. Убедитесь, что плагин клонирования установлен на всех нодах:

INSTALL PLUGIN clone SONAME 'mysql_clone.so';
GRANT CLONE_ADMIN ON *.* TO 'repl'@'%';

Интеграция с MySQL Router

Приложение не должно знать, какая нода сейчас является primary. MySQL Router — лёгкий прокси от Oracle, который автоматически маршрутизирует запросы: операции записи направляются на primary, чтение — на secondary. Он входит в состав MySQL Shell и распространяется бесплатно.

Минимальная конфигурация MySQL Router для кластера Group Replication:

# /etc/mysqlrouter/mysqlrouter.conf

[DEFAULT]
logging_folder = /var/log/mysqlrouter
runtime_folder = /run/mysqlrouter

[logger]
level = INFO

# Порт для записи — маршрутизирует только на PRIMARY
[routing:gr_rw]
bind_address = 0.0.0.0
bind_port = 6446
destinations = metadata-cache://mycluster/?role=PRIMARY
routing_strategy = first-available
protocol = classic

# Порт для чтения — балансирует между SECONDARY
[routing:gr_ro]
bind_address = 0.0.0.0
bind_port = 6447
destinations = metadata-cache://mycluster/?role=SECONDARY
routing_strategy = round-robin-with-fallback
protocol = classic

[metadata_cache:mycluster]
cluster_type = gr
router_id = 1
user = router_user
metadata_cluster = mycluster
ttl = 0.5
auth_cache_ttl = -1

После автоматического failover MySQL Router обнаружит смену primary в течение времени, заданного параметром ttl (0.5 секунды в примере), и начнёт направлять запись на новую primary-ноду. Приложение при этом переподключается прозрачно.

Для инициализации метаданных кластера в MySQL Router используйте MySQL Shell:

mysqlsh --uri root@node1.example.com:3306 -- dba configureInstance
mysqlsh --uri root@node1.example.com:3306 -- dba createCluster mycluster
mysqlrouter --bootstrap root@node1.example.com:3306 --directory /etc/mysqlrouter --conf-use-gr-notifications

Сравнение с MySQL InnoDB Cluster и Galera Cluster

MySQL InnoDB Cluster — это надстройка над Group Replication, включающая MySQL Shell (управление кластером через JavaScript/Python API) и MySQL Router. По сути, InnoDB Cluster использует Group Replication как транспортный уровень. Если вы хотите управлять кластером через удобное API и готовы использовать MySQL Shell — выбирайте InnoDB Cluster. Если предпочитаете минимальный стек и чистый SQL — Group Replication напрямую.

Galera Cluster (Percona XtraDB Cluster / MariaDB Galera) — независимая реализация синхронной multi-primary репликации, появившаяся раньше Group Replication. Galera проверен годами, хорошо работает в multi-primary, но требует установки сторонних пакетов (Percona или MariaDB) и имеет собственную экосистему. Group Replication — официальное решение Oracle, встроенное в MySQL 8.x, что упрощает поддержку и лицензирование. В 2026 году для новых проектов на «ванильном» MySQL выбор Group Replication очевиден.

Ключевые различия кратко:

  • Group Replication: встроен в MySQL 8.x, поддерживается Oracle, single/multi-primary, Paxos-консенсус.
  • InnoDB Cluster: Group Replication + MySQL Shell + MySQL Router, проще управление.
  • Galera: сторонний пакет, зрелый multi-primary, другая экосистема.

Заключение: когда выбирать Group Replication

MySQL Group Replication — правильный выбор, если:

  • Вы используете MySQL 8.0+ и хотите автоматический failover без внешних инструментов.
  • Требования к SLA не допускают ручного вмешательства при сбое primary.
  • Вы управляете инфраструктурой самостоятельно и не хотите переходить на облачные managed-базы.
  • Нагрузка преимущественно на чтение с умеренной записью (single-primary mode).

Когда стоит рассмотреть альтернативы:

  • Нужна максимальная пропускная способность записи с минимальными конфликтами — Galera в multi-primary может быть лучше настроен для этого сценария.
  • Вы уже используете экосистему Percona или MariaDB.
  • Задержки в сети между нодами превышают 10–15 мс — синхронный консенсус начнёт заметно влиять на latency записи.

В 2026 году MySQL Group Replication в связке с MySQL Router представляет собой production-ready решение для высокой доступности MySQL, не требующее ни облачных сервисов, ни внешних инструментов типа Orchestrator. Вложите время в правильную начальную конфигурацию, настройте мониторинг через performance_schema — и ваш кластер будет самовосстанавливаться без участия дежурного инженера.

Технологии

Теги

Руслан Исмаилов

Senior Web / Backend разработчик. Senior web/backend разработчик с 9-летним опытом. Стек: PHP, Laravel, PostgreSQL, Redis, Docker, Kubernetes, REST, микросервисы, CI/CD. Подробнее обо мне →