Отметим: когда primary-сервер MySQL падает, бизнес теряет не только время, но и транзакции — восстановление из бэкапов может занять часы. На одном проекте с нагрузкой 5000 запросов в секунду простой длился 4 часа, что привело к убыткам. Репликация MySQL Master-Slave решает эту проблему: replica копирует бинарный лог с master и применяет события с лагом в миллисекунды. Профессиональная настройка репликации Master-Slave — это не только резервный сервер, но и возможность распределять запросы чтения, снижая нагрузку на primary. В этой статье — практическая конфигурация, типичные ошибки, мониторинг лага и что мы включаем в работу. Стабильная репликация с GTID сокращает время failover до минут, а при нормальной нагрузке лаг не превышает 1–2 секунд.
Что даёт репликация Master-Slave?
- Отказоустойчивость: при отказе master переключаемся на replica за минуты.
- Масштабирование чтения: отправляем SELECT на несколько реплик, оставляя master для записи.
- Бэкапы без остановок: делаем дамп с replica, не влияя на production.
Большинство проектов приходят к репликации после первого сбоя. Мы рекомендуем настраивать её на старте: это дешевле и быстрее, чем экстренно восстанавливать данные.
Пошаговая настройка репликации MySQL
Настройка Master
На master включаем бинарный лог и задаём server_id. Пример конфигурации:
# /etc/mysql/mysql.conf.d/mysqld.cnf
[mysqld]
server_id = 1
log_bin = /var/log/mysql/mysql-bin
binlog_format = ROW
binlog_row_image = MINIMAL
sync_binlog = 1
expire_logs_days = 7
Создаём пользователя с правами REPLICATION SLAVE:
CREATE USER 'repl'@'10.0.0.2' IDENTIFIED WITH caching_sha2_password BY 'repl_password';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'10.0.0.2';
FLUSH PRIVILEGES; Снятие начального дампа
Для инициализации реплики нужен дамп с позицией бинлога. Два способа:
| Метод | Команда | Блокировка | Для каких баз |
|---|---|---|---|
| mysqldump | mysqldump --all-databases --master-data=2 --single-transaction --routines --triggers --events |
Минимальная (short lock) | До 50 ГБ |
| Percona XtraBackup | xtrabackup --backup --target-dir=/backup/ |
Нет блокировок | Любые, включая 500+ ГБ |
Позиция бинлога будет в начале дамп-файла или в xtrabackup_binlog_info. На недавнем проекте с 500 ГБ данных XtraBackup сократил время дампа в 3 раза по сравнению с mysqldump.
Настройка Replica
На replica — свой server_id и режим read_only:
# /etc/mysql/mysql.conf.d/mysqld.cnf
[mysqld]
server_id = 2
relay_log = /var/log/mysql/mysql-relay
read_only = ON
log_bin = /var/log/mysql/mysql-bin
log_slave_updates = ONВосстанавливаем дамп и запускаем репликацию:
mysql -u root -p < /backup/full_dump.sql
mysql -e "CHANGE REPLICATION SOURCE TO SOURCE_HOST='10.0.0.1', SOURCE_USER='repl', SOURCE_PASSWORD='repl_password', SOURCE_LOG_FILE='mysql-bin.000042', SOURCE_LOG_POS=12345, SOURCE_SSL=1; START REPLICA; SHOW REPLICA STATUS\G"Проверяем: Replica_IO_Running: Yes, Replica_SQL_Running: Yes, Seconds_Behind_Source — лаг в секундах.
GTID или позиционная репликация?
GTID (Global Transaction ID) — глобальные идентификаторы транзакций, доступные с MySQL 5.6 и выше. Их главное преимущество — не нужно вручную указывать файл и позицию бинлога. При failover replica сама определяет, какие транзакции применить. MySQL Documentation: GTID transactions are globally unique. Благодаря GTID время failover сокращается с 10–15 минут до 2–3 минут, что снижает потери при высоконагруженных проектах. Настройка GTID:
gtid_mode = ON enforce_gtid_consistency = ON Команда CHANGE использует SOURCE_AUTO_POSITION=1 вместо указания файла и позиции. GTID также упрощает пропуск ошибочных транзакций — вместо SQL_SLAVE_SKIP_COUNTER используем SET GTID_NEXT='...'; BEGIN; COMMIT;.
Если ваша версия MySQL 5.6+ и вы планируете часто переключать мастера, выбирайте GTID. Для старых версий (5.5 и ниже) доступна только позиционная репликация. На этапе проектирования мы помогаем определить оптимальный вариант под вашу нагрузку и SLA.
Мониторинг и управление лагом репликации
Лаг — разница во времени между коммитом транзакции на master и её применением на replica. Он измеряется в секундах через Seconds_Behind_Source. При нормальной нагрузке лаг не превышает 1–2 секунд. Если лаг растёт, проверьте:
- производительность диска на replica;
- размер транзакций (большие DDL могут увеличить лаг);
- сетевые задержки.
Мониторинг лага — через mysqld_exporter метрику mysql_slave_status_seconds_behind_master. Алерт при лаге > 30 секунд и > 60 секунд.
При высоком лаге (более 30 секунд) сначала проверьте нагрузку на replica: если CPU или I/O упираются, увеличьте ресурсы или добавьте параллельных рабочих (slave_parallel_workers). Если проблема в сети (задержка >5 мс), рассмотрите переход на выделенный VLAN или географическое размещение реплик.
Для ускорения репликации используйте binlog_format = ROW и binlog_row_image = MINIMAL — это уменьшает объём передаваемых данных. Также увеличьте slave_parallel_workers до 4-8, если версия MySQL 8.0+. На мощном сервере это даёт прирост производительности до 50%.
Типичные сценарии сбоев
Таблица сценариев сбоев и решений
| Сценарий | Причина | Решение |
|---|---|---|
| Duplicate entry | Прямая запись на replica | Включить read_only и пропустить транзакцию |
| Row not found | Удаление строки на master до применения | Синхронизировать данные с master |
| Потеря позиции бинлога | Обрыв лога на master | Переинициализация реплики из свежего бэкапа |
Если репликация остановилась, проверьте SHOW REPLICA STATUS\G — ключевые поля Slave_IO_Running и Slave_SQL_Running должны быть Yes.
Процесс работы и что входит
- Аналитика (2–4 часа): оценка текущей схемы, размера базы, сетевых задержек.
- Проектирование (1–2 дня): выбор между позиционной и GTID, планирование failover.
- Реализация (2–5 дней): конфигурация серверов, создание пользователя, снятие дампа, запуск репликации.
- Тестирование (4–8 часов): проверка скорости репликации, лага, переключение на replica.
- Документация и обучение (1 день): передача runbook, настройка алертов.
Для базы данных объемом 500 ГБ и нагрузкой 10 000 запросов в секунду репликация настраивается за 3-4 дня.
Отметим: что входит в работу:
- Конфигурация 2-4 серверов MySQL с учетом топологии (master + 1-3 replica).
- Выбор способа дампа: mysqldump для баз до 50 ГБ, Percona XtraBackup для баз до 1 ТБ и более.
- Настройка GTID и
enforce_gtid_consistency(если версия MySQL 5.6+). - Мониторинг лага через Prometheus/Grafana: метрика
mysql_slave_status_seconds_behind_master, алерты при лаге >30 и >60 секунд. - Runbook по типовым операциям: переключение мастера (manual failover), восстановление после сбоя, пропуск ошибочных транзакций.
- Консультация инженера после запуска.
Свяжитесь с нами для настройки репликации под ваш проект — мы оценим текущую инфраструктуру и предложим оптимальное решение.
Наши преимущества
Наши инженеры — сертифицированные DBA с опытом работы с MySQL на проектах с нагрузкой до 100 000 запросов в секунду. Мы гарантируем, что лаг не превысит 30 секунд при нормальной нагрузке. Более 50 успешных проектов подтверждают наш профессионализм.
Закажите профессиональную настройку репликации MySQL — наш инженер свяжется с вами в течение часа и предложит решение под ваши задачи.







