Репликация PostgreSQL: Полное руководство по настройке от А до Я

Репликация PostgreSQL: Полное руководство по настройке от А до Я

Репликация в PostgreSQL — это не просто резервное копирование, а мощный механизм построения отказоустойчивых, масштабируемых систем. Правильная настройка репликации позволяет распределить нагрузку, обеспечить непрерывность бизнеса и создать географически распределённую инфраструктуру. В этом руководстве мы разберём все аспекты настройки — от базовых принципов до тонкой оптимизации.

Что такое репликация и зачем она нужна?

Репликация — это процесс постоянного копирования данных с одного сервера PostgreSQL (мастера) на один или несколько других серверов (реплик). Реплики получают изменения в реальном времени через механизм WAL (Write-Ahead Logging).

Основные цели репликации: повышение доступности (HA), горизонтальное масштабирование чтения, географическое распределение данных и создание «горячего» резерва для быстрого восстановления.

Типы репликации в PostgreSQL

Физическая репликация (streaming replication)

Самый распространённый метод, при котором репликация происходит на уровне WAL-записей. Реплика является бинарно идентичной копией мастера.

  • Синхронная — мастер ждёт подтверждения от реплики перед фиксацией транзакции. Гарантирует отсутствие потерь данных, но снижает производительность.
  • Асинхронная — мастер не ждёт подтверждения. Высокая производительность, но возможна небольшая задержка и теоретическая потеря данных при сбое.

Логическая репликация

Появилась в версии 10+. Реплицируются не WAL-записи, а логические изменения на уровне таблиц (INSERT, UPDATE, DELETE). Позволяет реплицировать отдельные таблицы и даже выполнять селективную репликацию.

Пошаговая настройка физической репликации

1. Подготовка мастера

В файле postgresql.conf на мастере:

  1. Установите wal_level = replica (или logical для логической репликации)
  2. Задайте max_wal_senders = 5 (количество одновременно подключаемых реплик + резерв)
  3. Включите hot_standby = on
  4. При необходимости настройте 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) или логическая репликация с кастомными конфликт-менеджерами.