Мастерская надёжности: Полное руководство по настройке репликации PostgreSQL

Мастерская надёжности: Полное руководство по настройке репликации PostgreSQL

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

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

Репликация — это процесс постоянного копирования данных с одного сервера PostgreSQL (мастера) на один или несколько других серверов (реплик). Основные цели:

  • Высокая доступность (High Availability): При падении мастера реплика мгновенно может стать новым основным сервером.
  • Балансировка нагрузки (Load Balancing): Реплики могут обслуживать запросы на чтение, разгружая мастер для операций записи.
  • Резервное копирование и восстановление: «Горячая» копия данных всегда готова.
  • Геораспределение: Размещение реплик ближе к пользователям в разных регионах.

Основные методы репликации в PostgreSQL

1. Физическая репликация (Streaming Replication)

Самый популярный и надёжный метод. Репликация происходит на уровне файлов WAL (Write-Ahead Log). Реплика получает поток изменений (WAL-записи) от мастера и применяет их, поддерживая бинарно идентичную копию данных. Это синхронный или асинхронный процесс.

Важно: Физическая репликация реплицирует ВСЕ данные в кластере, включая все базы данных. Выборочную репликацию отдельных таблиц она не поддерживает.

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

Появилась в PostgreSQL 10. Реплицирует не файлы, а логические изменения (INSERT, UPDATE, DELETE) на уровне таблиц. Это позволяет:

  1. Реплицировать отдельные таблицы или даже части таблиц.
  2. Иметь разные версии PostgreSQL на мастере и реплике (с ограничениями).
  3. Отправлять данные из нескольких источников в одну таблицу (консолидация).

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

Рассмотрим базовый сценарий «мастер-реплика» с асинхронной репликацией.

Шаг 1: Подготовка мастера (Primary)

В файле postgresql.conf на мастере необходимо установить:

  • wal_level = replica (или logical для логической репликации).
  • max_wal_senders = 5 (количество одновременных подключений от реплик).
  • wal_keep_size = 1GB (сколько WAL-файлов хранить для отстающих реплик).
  • listen_addresses = '*' или указать конкретный IP для подключения реплик.

Шаг 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 /путь/к/data -U replica_user -P -v -R -W

Ключ -R автоматически создаст файл standby.signal и настроит postgresql.auto.conf.

Совет: Для больших баз используйте флаг --wal-method=stream для параллельного копирования данных и WAL-файлов.

Шаг 4: Запуск и проверка

Запустите PostgreSQL на реплике. Проверьте статус репликации на мастере запросом:

SELECT client_addr, state, sync_state, replay_lag FROM pg_stat_replication;

Если вы видите строку с IP вашей реплики и состоянием streaming — поздравляем, репликация работает!

Синхронная vs Асинхронная репликация

  • Асинхронная (по умолчанию): Мастер подтверждает запись клиенту ДО того, как изменение будет получено репликой. Выше производительность, но есть риск потери данных при аварии мастера.
  • Синхронная: Мастер ждёт подтверждения от одной или нескольких реплик, прежде чем подтвердить запись клиенту. Гарантия сохранности данных, но снижение производительности записи. Настраивается через параметр synchronous_standby_names.

Мониторинг и устранение неполадок

Ключевые метрики:

  1. Replay Lag: Задержка применения WAL на реплике. Запрос: SELECT pg_last_wal_replay_lsn(), pg_last_wal_receive_lsn();
  2. Статус реплики: Файл pg_wal/recovery.signal на реплике означает, что она работает в режиме восстановления (репликации).
  3. Логи: Всегда проверяйте логи PostgreSQL на обеих нодах (log_directory).

Продвинутые сценарии: Каскадная репликация и HA-кластеры

PostgreSQL позволяет строить сложные топологии: реплика может, в свою очередь, быть мастером для других реплик (каскад). Для промышленного использования рассмотрите использование менеджеров кластеров (Patroni, repmgr), которые автоматизируют переключение при сбоях (failover) и мониторинг.

FAQ: Часто задаваемые вопросы

Можно ли писать на реплику?

Нет, физическая реплика по умолчанию доступна только для чтения. Для записи в несколько узлов нужны логическая репликация или сторонние решения (например, на основе BDR).

Что делать, если реплика отстала и не может догнать?

Если реплика отстала слишком сильно и мастер уже удалил необходимые WAL-файлы (контролируется wal_keep_size), репликацию придётся пересоздавать заново командой pg_basebackup.

Как выполнить переключение (failover) на реплику вручную?

1. Остановите мастер (или убедитесь, что он недоступен).
2. На реплике выполните: pg_ctl promote.
3. Файл standby.signal удалится, реплика станет самостоятельным мастером, готовым к записи.

Логическая или физическая репликация — что выбрать?

Физическая — для целостного резервирования всей БД и высокой доступности. Логическая — для выборочной репликации, обновления мажорных версий «на лету» или консолидации данных.