· 18 мин чтения

MySQL InnoDB Cluster с Group Replication: отказоустойчивая БД для бизнеса

Семёнов Евгений Сергеевич, директор АйТи Фреш. 15+ лет работаю с базами данных в корпоративных инфраструктурах, из них последние 8 лет плотно с MySQL Group Replication. Я всегда выбираю InnoDB Cluster, когда заказчику нужна отказоустойчивая MySQL без покупки коммерческих решений: он нативен, прост в управлении через MySQL Shell и даёт автоматический failover за секунды. В этой статье разберу полный цикл — от выбора железа до продакшена с мониторингом и бэкапами.

Зачем InnoDB Cluster и чем он лучше master-slave

Классическая асинхронная репликация MySQL из нулевых — это слабое звено. При падении мастера вы теряете последние транзакции, failover делается руками, promotion нового мастера требует аккуратности и ошибки часто стоят данных. Group Replication решает эти проблемы на корню.

Требования к серверам

Группа должна иметь нечётное число узлов — 3, 5, 7. Я всегда беру 3 узла: этого хватает для защиты от падения одного сервера, а больше при корпоративных нагрузках не нужно.

НагрузкаCPURAMДискСеть
До 100 TPS4 ядра16 ГБ500 ГБ NVMe1G
До 1000 TPS8 ядер64 ГБ2 ТБ NVMe10G
10000+ TPSXeon Platinum 8280256 ГБNVMe RAID-1040G Mellanox

Сеть — критично. Group Replication чувствителен к задержкам: до 2 мс между узлами — норма, выше 10 мс — деградация. У нас на практике клиенты иногда ставили узлы в разные регионы и получали медленный кластер, который лучше было бы заменить на асинхронную репликацию.

Подготовка узлов

Ubuntu 22.04 LTS или RHEL 9. На каждом узле ставим MySQL 8.0 из официального репозитория, правим конфиг под требования Group Replication.

# /etc/mysql/mysql.conf.d/mysqld.cnf — на всех 3 узлах
[mysqld]
server_id = 1  # 1, 2, 3 соответственно
bind_address = 0.0.0.0
port = 3306
log_bin = mysql-bin
gtid_mode = ON
enforce_gtid_consistency = ON
binlog_format = ROW
binlog_checksum = NONE
transaction_write_set_extraction = XXHASH64
relay_log_info_repository = TABLE
master_info_repository = TABLE
innodb_buffer_pool_size = 48G
innodb_log_file_size = 2G
innodb_flush_log_at_trx_commit = 1
sync_binlog = 1
performance_schema = ON
report_host = db01.corp.local  # db02, db03

Файрвол: открываем порт 3306 (SQL) и 33061 (Group Replication transport) между узлами, остальное — только для приложений.

Инициализация кластера через MySQL Shell

MySQL Shell — современный способ управлять InnoDB Cluster. Ставим его на отдельной админской машине или на одном из узлов.

mysqlsh --uri root@db01.corp.local:3306

# Проверка готовности узла
dba.configureInstance('root@db01.corp.local')
dba.checkInstanceConfiguration('root@db01.corp.local')

# Создание кластера на первом узле
var cluster = dba.createCluster('ProdCluster', {
  memberSslMode: 'REQUIRED',
  ipAllowlist: '192.168.10.0/24',
  localAddress: 'db01.corp.local:33061'
});

# Добавление второго и третьего узла
cluster.addInstance('root@db02.corp.local:3306', {
  recoveryMethod: 'clone',
  localAddress: 'db02.corp.local:33061'
});
cluster.addInstance('root@db03.corp.local:3306', {
  recoveryMethod: 'clone',
  localAddress: 'db03.corp.local:33061'
});

# Статус
cluster.status();

Метод clone копирует начальный дамп с primary за пару минут на SSD. Без него узел будет догонять через binlog — это долго, если база большая.

MySQL Router: прокси для приложений

Приложения не должны напрямую коннектиться в MySQL — иначе при failover они не перехватят смену primary. Ставим MySQL Router на те же хосты, что и приложения, либо отдельно.

apt install -y mysql-router

mysqlrouter --bootstrap root@db01.corp.local:3306 \
  --directory /etc/mysqlrouter \
  --conf-use-sockets \
  --account router_user

systemctl enable --now mysqlrouter

После bootstrap Router слушает два порта: 6446 для чтения-записи (идёт на primary) и 6447 для read-only (round-robin по secondary). Приложение коннектится как обычно, Router сам разруливает.

Тюнинг под production

Дефолтные настройки MySQL 8 далеки от оптимума. Я всегда правлю:

Кейс: 1С + Битрикс24 на кластере

В сентябре 2025 клиент — ритейлер обуви с 120 магазинами — попросил убрать SPOF из MySQL. Раньше была одна база на Dell R640 — падение вечером пятницы стоило им 4 часов простоя и полумиллиона рублей. Мы собрали 3 узла Dell PowerEdge R750xa (Xeon Platinum 8280, 256 ГБ RAM, 4 × 2 ТБ NVMe RAID-10, 40G Mellanox), поставили в дата-центр МТС в Москве в одной стойке с клиентским приложением. InnoDB Cluster single-primary, MySQL Router на 4 фронтах. Время failover по наблюдениям — 8–14 секунд. За 6 месяцев с момента запуска — 2 автоматических failover при плановых обновлениях, 0 ручных вмешательств, ноль простоев. База — 380 ГБ, пиковая нагрузка 3400 TPS.

Мониторинг и обслуживание

# Состояние кластера
cluster.status();
cluster.describe();

# Быстрая проверка из SQL
SELECT * FROM performance_schema.replication_group_members;
SELECT * FROM performance_schema.replication_group_member_stats;

Prometheus-экспортер mysqld_exporter + дашборд Percona PMM дают полный обзор: репликация, InnoDB buffer pool, slow queries. Алерты — на любой сбой кворума, на рост lag на secondary, на свободное место.

Развернём отказоустойчивый MySQL-кластер

Проектируем и внедряем InnoDB Cluster под 1С, Bitrix, CRM, самописные CRM. Подбор железа, установка, MySQL Router, мониторинг в Grafana, обучение вашей команды. Объекты от 50 до 10000 TPS.

Телефон: +7 903 729-62-41
Telegram: @ITfresh_Boss
Семёнов Евгений Сергеевич, директор АйТи Фреш

FAQ — MySQL InnoDB Cluster

Чем InnoDB Cluster отличается от классической репликации?
InnoDB Cluster использует Group Replication — синхронную репликацию с кворумом и автоматическим выбором мастера. Классическая async-репликация требует ручного failover и не гарантирует консистентность при падении мастера.
Сколько узлов нужно минимум?
Три узла — минимум для кворума. Допускается до 9 узлов в группе. Для большинства корпоративных задач оптимум — 3 узла.
Что делает MySQL Router?
MySQL Router — прокси-слой между приложением и кластером. Он знает топологию, направляет запись на primary, чтение — на secondary, и автоматически переключается при failover.
Single-primary или multi-primary?
Для корпоративных баз 1С, Bitrix, CRM я всегда выбираю single-primary: меньше конфликтов, проще отладка.
Как делается бэкап?
Штатно — MySQL Enterprise Backup или Percona XtraBackup с secondary-узла. Это не нагружает primary и даёт горячий бэкап без блокировок.

Подпишитесь на рассылку ITfresh

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

Реквизиты оператора персональных данных

ООО «АЙТИ-ФРЕШ», ИНН 7719418495, КПП 771901001. Юридический адрес: 105523, г. Москва, Щёлковское шоссе, д. 92, корп. 7. Контакт: info@itfresh.ru, +7 903 729-62-41. Оператор обрабатывает e-mail подписчика в целях рассылки информационных и рекламных материалов до момента отзыва согласия.