Настройка репликации Master-Slave для базы данных веб-приложения

Наша компания занимается разработкой, поддержкой и обслуживанием сайтов любой сложности. От простых одностраничных сайтов до масштабных кластерных систем построенных на микро сервисах. Опыт разработчиков подтвержден сертификатами от вендоров.

Разработка и обслуживание любых видов сайтов:

Информационные сайты или веб-приложения
Сайты визитки, landing page, корпоративные сайты, онлайн каталоги, квиз, промо-сайты, блоги, новостные ресурсы, информационные порталы, форумы, агрегаторы
Сайты или веб-приложения электронной коммерции
Интернет-магазины, B2B-порталы, маркетплейсы, онлайн-обменники, кэшбэк-сайты, биржи, дропшиппинг-платформы, парсеры товаров
Веб-приложения для управления бизнес-процессами
CRM-системы, ERP-системы, корпоративные порталы, системы управления производством, парсеры информации
Сайты или веб-приложения электронных услуг
Доски объявлений, онлайн-школы, онлайн-кинотеатры, конструкторы сайтов, порталы предоставления электронных услуг, видеохостинги, тематические порталы

Это лишь некоторые из технических типов сайтов, с которыми мы работаем, и каждый из них может иметь свои специфические особенности и функциональность, а также быть адаптированным под конкретные потребности и цели клиента

Предлагаемые услуги
Показано 1 из 1 услугВсе 2065 услуг
Настройка репликации Master-Slave для базы данных веб-приложения
Сложная
~3-5 рабочих дней
Часто задаваемые вопросы

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

Этапы разработки

Последние работы

  • image_website-b2b-advance_0.png
    Разработка сайта компании B2B ADVANCE
    1262
  • image_web-applications_feedme_466_0.webp
    Разработка веб-приложения для компании FEEDME
    1171
  • image_websites_belfingroup_462_0.webp
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    874
  • image_ecommerce_furnoro_435_0.webp
    Разработка интернет магазина для компании FURNORO
    1094
  • image_crm_enviok_479_0.webp
    Разработка веб-приложения для компании Enviok
    831
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Разработка веб-сайта для компании ФИКСПЕР
    851

Настройка репликации Master-Slave для базы данных веб-приложения

Репликация Master-Slave (Primary-Replica в современной терминологии) — асинхронная или синхронная доставка данных с основного сервера на один или несколько реплик. Используется для масштабирования чтения, снижения нагрузки на мастер и создания hot-standby для быстрого failover.

Когда нужна Master-Slave репликация

  • Запросы на чтение составляют более 60–70% нагрузки
  • Необходим hot-standby для быстрого восстановления при сбое мастера
  • Аналитические запросы нагружают production-базу
  • Бэкапы должны сниматься без нагрузки на мастер

PostgreSQL: Streaming Replication

Настройка на мастере

# postgresql.conf
wal_level = replica
max_wal_senders = 10
wal_keep_size = 1GB
synchronous_commit = on  # для синхронной репликации
# synchronous_standby_names = 'replica1'  # если нужна синхронная

Создание пользователя репликации:

CREATE USER replication_user REPLICATION LOGIN ENCRYPTED PASSWORD 'strong_password';

Разрешение подключения реплики в pg_hba.conf:

host replication replication_user 192.168.1.0/24 md5

Инициализация реплики через pg_basebackup

# На сервере реплики
pg_basebackup -h master-db-host -U replication_user \
  -D /var/lib/postgresql/14/main \
  -P -Xs -R

# -R создаёт файл standby.signal и postgresql.auto.conf с параметрами

Содержимое автоматически созданного postgresql.auto.conf на реплике:

primary_conninfo = 'host=master-db-host port=5432 user=replication_user password=strong_password'

Запуск реплики:

systemctl start postgresql
# Реплика автоматически входит в режим hot-standby

Проверка репликации

На мастере:

SELECT client_addr, state, sent_lsn, write_lsn, flush_lsn, replay_lsn,
       (sent_lsn - replay_lsn) AS replication_lag_bytes
FROM pg_stat_replication;

На реплике:

SELECT now() - pg_last_xact_replay_timestamp() AS replication_lag;
SELECT pg_is_in_recovery(); -- должно вернуть true

MySQL/MariaDB репликация

Конфигурация мастера

# /etc/mysql/mysql.conf.d/mysqld.cnf
server-id = 1
log_bin = /var/log/mysql/mysql-bin.log
binlog_format = ROW
binlog_row_image = FULL
sync_binlog = 1
innodb_flush_log_at_trx_commit = 1

Создание пользователя репликации:

CREATE USER 'replication'@'192.168.1.%'
  IDENTIFIED WITH mysql_native_password BY 'strong_password';
GRANT REPLICATION SLAVE ON *.* TO 'replication'@'192.168.1.%';
FLUSH PRIVILEGES;

Получение позиции для инициализации реплики:

FLUSH TABLES WITH READ LOCK;
SHOW MASTER STATUS;
-- Записать: File и Position
UNLOCK TABLES;

Конфигурация реплики

# /etc/mysql/mysql.conf.d/mysqld.cnf
server-id = 2
relay_log = /var/log/mysql/mysql-relay-bin.log
read_only = ON
super_read_only = ON  # запрет записи даже для SUPER

Запуск репликации:

CHANGE MASTER TO
  MASTER_HOST='192.168.1.10',
  MASTER_USER='replication',
  MASTER_PASSWORD='strong_password',
  MASTER_LOG_FILE='mysql-bin.000001',
  MASTER_LOG_POS=4;

START SLAVE;
SHOW SLAVE STATUS\G

GTID-репликация (предпочтительно для MySQL 5.7+):

CHANGE MASTER TO
  MASTER_HOST='192.168.1.10',
  MASTER_USER='replication',
  MASTER_PASSWORD='strong_password',
  MASTER_AUTO_POSITION=1;

Маршрутизация запросов в приложении

PostgreSQL: pgBouncer + read/write split

# pgbouncer.ini
[databases]
myapp_write = host=master-db port=5432 dbname=myapp
myapp_read  = host=replica-db port=5432 dbname=myapp

В приложении использовать разные DSN для чтения и записи:

// Laravel: config/database.php
'pgsql' => [
    'read' => ['host' => 'replica-db'],
    'write' => ['host' => 'master-db'],
    ...
]

MySQL: ProxySQL

-- ProxySQL: добавление серверов
INSERT INTO mysql_servers(hostgroup_id, hostname, port) VALUES (10, 'master-db', 3306);
INSERT INTO mysql_servers(hostgroup_id, hostname, port) VALUES (20, 'replica-db', 3306);

-- Правила маршрутизации
INSERT INTO mysql_query_rules(rule_id, active, match_pattern, destination_hostgroup)
VALUES (1, 1, '^SELECT', 20),  -- SELECT → реплики
       (2, 1, '.*', 10);       -- остальное → мастер

Мониторинг лага репликации

Критическая метрика — replication lag. При лаге более 30 секунд реплика не должна обслуживать читающие запросы, требующие свежих данных.

Метрика в Prometheus через postgres_exporter:

# Алерт при лаге более 60 секунд
- alert: PostgresReplicationLag
  expr: pg_replication_lag_seconds > 60
  annotations:
    summary: "Replication lag {{ $value }}s on {{ $labels.instance }}"

Срок выполнения

Настройка PostgreSQL streaming replication с одной репликой — 1 день. С ProxySQL/pgBouncer и read/write split в приложении — 2–3 дня.