Репликация в PostgreSQL — это не просто резервное копирование, а мощный механизм построения отказоустойчивых, масштабируемых систем. Правильная настройка репликации позволяет распределить нагрузку, обеспечить непрерывность бизнеса и создать географически распределённую инфраструктуру. В этом руководстве мы разберём все аспекты настройки — от базовых принципов до тонкой оптимизации.
Что такое репликация и зачем она нужна?
Репликация — это процесс постоянного копирования данных с одного сервера PostgreSQL (мастера) на один или несколько других серверов (реплик). Реплики получают изменения в реальном времени через механизм WAL (Write-Ahead Logging).
Основные цели репликации: повышение доступности (HA), горизонтальное масштабирование чтения, географическое распределение данных и создание «горячего» резерва для быстрого восстановления.
Типы репликации в PostgreSQL
Физическая репликация (streaming replication)
Самый распространённый метод, при котором репликация происходит на уровне WAL-записей. Реплика является бинарно идентичной копией мастера.
- Синхронная — мастер ждёт подтверждения от реплики перед фиксацией транзакции. Гарантирует отсутствие потерь данных, но снижает производительность.
- Асинхронная — мастер не ждёт подтверждения. Высокая производительность, но возможна небольшая задержка и теоретическая потеря данных при сбое.
Логическая репликация
Появилась в версии 10+. Реплицируются не WAL-записи, а логические изменения на уровне таблиц (INSERT, UPDATE, DELETE). Позволяет реплицировать отдельные таблицы и даже выполнять селективную репликацию.
Пошаговая настройка физической репликации
1. Подготовка мастера
В файле postgresql.conf на мастере:
- Установите
wal_level = replica(илиlogicalдля логической репликации) - Задайте
max_wal_senders = 5(количество одновременно подключаемых реплик + резерв) - Включите
hot_standby = on - При необходимости настройте
wal_keep_segmentsилиwal_keep_size
Для синхронной репликации добавьте в postgresql.conf параметр synchronous_standby_names = 'FIRST 1 (replica1)' и создайте соответствующую запись в pg_hba.conf.
2. Настройка аутентификации
В pg_hba.conf добавьте строку для репликации:
host replication replica_user IP_реплики/32 md5
Создайте пользователя для репликации: CREATE USER replica_user WITH REPLICATION ENCRYPTED PASSWORD 'strong_password';
3. Создание базовой резервной копии на реплике
Остановите PostgreSQL на будущей реплике (если он был запущен) и выполните:
pg_basebackup -h IP_мастера -D /var/lib/postgresql/data -U replica_user -P -v -R -X stream
Ключ -R автоматически создаст файл standby.signal и настроит primary_conninfo в postgresql.conf.
4. Запуск и проверка
Запустите PostgreSQL на реплике. Проверьте статус на мастере:
SELECT client_addr, state, sync_state FROM pg_stat_replication;
Мониторинг и управление
Ключевые представления для мониторинга:
pg_stat_replication— информация о подключённых репликахpg_stat_wal_receiver— статистика получения WAL на репликеpg_wal_lsn_diff()— вычисление лага репликации
Продвинутые сценарии
Каскадная репликация
Реплика может сама быть мастером для других реплик. Полезно для географического распределения и снижения нагрузки на основной мастер.
Автоматическое переключение (failover)
Используйте Patroni, repmgr или PgBouncer для автоматического переключения при отказе мастера. Эти инструменты отслеживают состояние и переключают роли.
FAQ — Часто задаваемые вопросы
Как проверить лаг репликации?
На мастере выполните: SELECT pg_wal_lsn_diff(pg_current_wal_lsn(), replay_lsn) AS lag_bytes FROM pg_stat_replication;
Можно ли писать на реплику?
В режиме физической репликации — нет, реплика доступна только для чтения. Для записи нужно перевести её в режим мастера (promote).
Как выбрать между синхронной и асинхронной репликацией?
Синхронная — для критичных к потере данных систем (финансы). Асинхронная — для большинства веб-приложений, где важнее производительность.
Что делать, если реплика отстаёт?
1. Проверьте сетевую задержку. 2. Увеличьте wal_keep_size. 3. Проверьте нагрузку на реплике. 4. Рассмотрите увеличение ресурсов (CPU, диск).
Поддерживает ли PostgreSQL мультимастер репликацию?
Нативно — нет. Для этого нужны сторонние решения типа BDR (Bi-Directional Replication) или логическая репликация с кастомными конфликт-менеджерами.