Налаштування реплікації MySQL Master-Slave: GTID, моніторинг, помилки

Коли основний сервер MySQL виходить з ладу, бізнес ризикує втратити не лише час, а й дані. Ми налаштовуємо реплікацію Master-Slave з GTID, створюючи надійний резервний контур і розподіляючи навантаження на читання. Наша команда реалізує проєкт під ключ — від конфігурації до моніторингу, забезпечуючи стабільну роботу та подальшу підтримку.
Часті запитання

Зазначимо: коли primary-сервер MySQL падає, бізнес втрачає не лише час, а й транзакції — відновлення з бекапів може зайняти години. На одному проєкті з навантаженням 5000 запитів на секунду простій тривав 4 години, що призвело до збитків. Реплікація MySQL Master-Slave вирішує цю проблему: replica копіює бінарний лог з master і застосовує події з лагом у мілісекунди. Професійне налаштування реплікації Master-Slave — це не лише резервний сервер, а й можливість розподіляти запити читання, знижуючи навантаження на primary. У цій статті — практична конфігурація, типові помилки, моніторинг лагу та що ми включаємо в роботу. Стабільна реплікація з GTID скорочує час failover до хвилин, а при нормальному навантаженні лаг не перевищує 1–2 секунд. GTID-реплікація працює в 3–5 разів швидше за позиційну при відмові майстра.

Що дає реплікація 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.

Процес роботи та що входить

  1. Аналітика (2–4 години): оцінка поточної схеми, розміру бази, мережевих затримок.
  2. Проєктування (1–2 дні): вибір між позиційною та GTID, планування failover.
  3. Реалізація (2–5 днів): конфігурація серверів, створення користувача, зняття дампу, запуск реплікації.
  4. Тестування (4–8 годин): перевірка швидкості реплікації, лагу, перемикання на replica.
  5. Документація та навчання (1 день): передача runbook, налаштування алертів.

Для бази даних обсягом 500 ГБ і навантаженням 10 000 запитів на секунду реплікація налаштовується за 3-4 дні. Вартість налаштування під ключ — від $500, що окупається за рахунок зменшення простоїв.

Зазначимо: що входить в роботу:

  • Конфігурація 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 з 5+ роками досвіду. Ми реалізували понад 50 проєктів, обслуговуючи системи з навантаженням до 100 000 запитів/с. Гарантуємо лаг не більше 30 секунд при нормальному навантаженні. Більше 50 успішних проєктів підтверджують наш професіоналізм. Впровадження реплікації дозволяє заощадити до $10 000 на рік на відновленні після збоїв.

Замовте професійне налаштування реплікації MySQL — наш інженер зв'яжеться з вами протягом години та запропонує рішення під ваші завдання.

Наші компетенції:

Останні роботи

  • Розробка сайту компанії B2B ADVANCE
    Розробка сайту компанії B2B ADVANCE
    1542
  • Розробка веб-додатків для компанії FEEDME
    Розробка веб-додатків для компанії FEEDME
    1393
  • Розробка веб-сайту для компанії БЕЛФІНГРУП
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    1081
  • Розробка інтернет магазину для компанії FURNORO
    Розробка інтернет магазину для компанії FURNORO
    1368
  • Розробка логотипу компанії B2B Advance
    Розробка логотипу компанії B2B Advance
    815
  • Розробка веб-додатків для компанії Enviok
    Розробка веб-додатків для компанії Enviok
    1139