Мастер-слейв репликация: как убрать узкое горло СУБД
Ваше веб-приложение тормозит на страницах с отчётами? База данных не справляется с наплывом пользователей, а единственный сервер — точка отказа. Мы сталкивались с этим десятки раз: SELECT-запросы блокируют INSERT, аналитические отчёты «роняют» production, а бэкапы на живой базе приводят к простою. Каждая такая проблема стоит времени и денег. Решение — настройка мастер-слейв репликации под ключ. Мы гарантируем отказоустойчивость и разгрузку основного сервера, проверенные на 100+ проектах.
Репликация Master-Slave (Primary-Replica в новой терминологии) — асинхронная или синхронная доставка данных с основного сервера на один или несколько реплик. Она позволяет масштабировать чтение: до 80% запросов можно направлять на реплики, оставляя мастер только для записи. Это снижает latency и исключает конкуренцию за ресурсы. С нашим опытом настройки более 50 проектов мы реализуем такую архитектуру за 1–3 дня.
Почему Master-Slave репликация критична для вашего приложения?
Без репликации вы рискуете:
- Отказом — при сбое мастера данные недоступны до восстановления. Среднее время простоя вручную — 2–4 часа.
- Деградацией — аналитические запросы блокируют запись, увеличивая TTFB в 3–5 раз.
- Дорогими бэкапами — снятие дампа на мастере блокирует таблицы, вызывая простои.
По сравнению с единой базой, архитектура с одной репликой обрабатывает до 5 раз больше читающих запросов, а с ProxySQL — до 10 раз. Например, проект интернет-магазина после настройки репликации снизил время ответа на запросы отчётов с 12 до 0.8 секунды — в 15 раз быстрее.
Когда нужна синхронная репликация?
Синхронная репликация гарантирует нулевую потерю данных при сбое мастера. Она незаменима для финансовых транзакций или критичных к целостности данных. Однако цена — увеличение latency записи на 30–50% и снижение пропускной способности. Мы рекомендуем синхронный режим для ядра приложения, асинхронный — для аналитики.
Как мы настраиваем репликацию в PostgreSQL и MySQL?
Мы используем только проверенные подходы: streaming replication для PostgreSQL и GTID-репликацию для MySQL. В таблице — ключевые различия:
| Параметр | PostgreSQL | MySQL |
|---|---|---|
| Режим по умолчанию | Асинхронный | Асинхронный |
| Синхронный режим | synchronous_standby_names | rpl_semi_sync_master |
| Инструмент инициализации | pg_basebackup | mysqldump + позиция / AUTO_POSITION |
| Маршрутизация | pgBouncer / Pgpool-II | ProxySQL / MySQL Router |
| Failover автоматический | Patroni / repmgr | Orchestrator / MHA |
Типичные ошибки при настройке: некорректный wal_level (должен быть replica или logical), нехватка max_wal_senders для нескольких реплик, игнорирование replication lag (отсутствие мониторинга). Запись на реплику в read-only режиме приводит к рассинхронизации — это одна из частых причин отказа.
Пример конфигурации PostgreSQL мастера:
# postgresql.conf wal_level = replica max_wal_senders = 10 wal_keep_size = 1GB synchronous_commit = on synchronous_standby_names = 'replica1' Инициализация реплики:
pg_basebackup -h master -U replication -D /var/lib/postgresql/14/main -P -Xs -R Пример конфигурации MySQL мастера:
[mysqld] server-id = 1 log_bin = /var/log/mysql/mysql-bin.log binlog_format = ROW gtid_mode = ON enforce_gtid_consistency = ON Запуск реплики MySQL с GTID:
CHANGE MASTER TO MASTER_HOST='192.168.1.10', MASTER_USER='replication', MASTER_PASSWORD='xxx', MASTER_AUTO_POSITION=1; START SLAVE; Маршрутизация через ProxySQL:
INSERT INTO mysql_servers(hostgroup_id, hostname, port) VALUES (10, 'master', 3306); INSERT INTO mysql_servers(hostgroup_id, hostname, port) VALUES (20, 'replica', 3306); INSERT INTO mysql_query_rules(rule_id, active, match_pattern, destination_hostgroup) VALUES (1, 1, '^SELECT', 20), (2, 1, '.*', 10); LOAD MYSQL SERVERS TO RUNTIME; LOAD MYSQL QUERY RULES TO RUNTIME; Типичные ошибки при настройке
-
wal_levelне установлен вreplica— потоковая репликация не работает. -
max_wal_sendersслишком мал для числа реплик — реплики не могут подключиться. - Отсутствие мониторинга replication lag — лаг незаметен до критического момента.
- Попытка записать данные на реплику в read-only — рассинхронизация.
Какие этапы включает настройка репликации?
Процесс включает следующие шаги:
- Аудит текущей нагрузки и архитектуры: измеряем пиковые RPS, latency, размер базы.
- Выбор топологии: одна реплика или несколько, асинхронная или синхронная.
- Конфигурация мастера:
wal_level,max_wal_senders,gtid_mode. - Инициализация реплик через
pg_basebackupилиmysqldump. - Настройка маршрутизации (ProxySQL / pgBouncer) и разделения запросов на чтение/запись.
- Мониторинг лага: Prometheus + Grafana с алертами при лаге >60 секунд.
- Документация и обучение команды, передача скриптов failover.
Сравнение асинхронной и синхронной репликации
| Параметр | Асинхронная | Синхронная |
|---|---|---|
| Latency записи | Низкая (0.1–1 мс) | Высокая (2–10 мс) |
| Потеря данных при сбое | Возможна (до нескольких секунд) | Нулевая |
| Пропускная способность | Высокая | Ниже на 30–50% |
| Нагрузка на мастер | Минимальная | Умеренная |
Что входит в работу
- Полная документация по конфигурации и процедуре failover.
- Дампы и скрипты для быстрого восстановления.
- Доступы к мониторингу (Grafana, алерты в Telegram).
- Обучение команды: как проверять статус репликации и выполнять переключение.
Сколько это стоит и когда окупается?
Сроки зависят от сложности:
- Одна реплика + базовый мониторинг — 1 день.
- Репликация с ProxySQL и failover — 2–3 дня.
Стоимость рассчитывается индивидуально. Но инвестиции окупаются быстро: экономия на инфраструктуре за счёт реплик для чтения может достигать 40%, а время восстановления при сбое сокращается с часов до минут. Типовой проект окупается за 2–3 месяца. Если у вас уже есть проект — свяжитесь с нами для бесплатной оценки. Закажите настройку репликации и получите отказоустойчивую архитектуру.
PostgreSQL Documentation on Streaming Replication — подробности протокола репликации. MySQL GTID Replication — официальный мануал по настройке.







