Гид по технологиям

Настройка PostgreSQL (hot standby) репликации на Ubuntu

• 7 min read • Базы данных • Обновлено 20 Nov 2025
PostgreSQL hot standby: настройка репликации на Ubuntu
PostgreSQL hot standby: настройка репликации на Ubuntu

Важно: инструкция сохраняет команды и пути без изменений — выполняйте их с правами администратора и резервной копией данных.

Краткое описание и варианты использования

PostgreSQL (или Postgres) — свободная объектно-реляционная СУБД (ORDBMS) с долгой историей разработки. Репликация master→slave (основной→резервный) копирует данные с главного сервера на один или несколько ведомых. Основные преимущества:

  • Высокая доступность: при сбое основного — резервный сервер может обслуживать запросы.
  • Резервное копирование в реальном времени.
  • Распределение нагрузки на чтение (если слейвы разрешены для чтения).

В этом руководстве реализуется режим hot standby (горячая резервная копия): слейв может принимать только операции чтения, а при необходимости может быть переведён в мастер.

Предварительные требования

  • Два сервера Ubuntu: один — master, другой — slave.
  • Root-доступ (или доступ к sudo) на обоих машинах.
  • Базовые знания командной строки Ubuntu и работы с apt.
  • Сеть между хостами, прямая маршрутизация по IP (в примерах: 192.168.1.249 — мастер, 192.168.1.248 — слейв).

Краткое определение: replication — режим, при котором WAL (Write Ahead Log) передаётся от мастера к слейвам для синхронизации данных.

Структура этого руководства

  1. Настройка имён хостов
  2. Установка PostgreSQL на обоих серверах
  3. Конфигурация мастера (создание пользователя репликации, правки postgresql.conf и pg_hba.conf)
  4. Конфигурация слейва (параметры для hot_standby)
  5. Синхронизация данных с помощью pg_basebackup и создание recovery.conf
  6. Тестирование репликации
  7. Контрольные списки, отладка и рекомендации по безопасности

Шаг 1 — Установка имён хостов

Войти на оба сервера по SSH:

ssh user@masterip  
ssh user@slaveip

Установите hostname на мастере и слейве:

На мастер-сервере:

sudo hostnamectl set-hostname master-server

На слейв-сервере:

sudo hostnamectl set-hostname slave-server

Отредактируйте /etc/hosts, чтобы сопоставить IP и имена хостов (например через vim):

sudo vim /etc/hosts

Добавьте на мастер-сервере:

192.168.1.249   master-server

Добавьте на слейв-сервере:

192.168.1.248   slave-server

Сохраните и выйдите.

Шаг 2 — Установка PostgreSQL на мастер и слейв

Обновите пакеты и установите PostgreSQL:

sudo apt-get update
sudo apt-get install postgresql postgresql-client postgresql-contrib

После установки задайте пароль для системного пользователя postgres:

passwd postgres

Проверка запуска и подключения к psql:

su - postgres  
psql  
\conninfo

Если psql открывается и отображает подключение — установка успешно завершена.

Шаг 3 — Конфигурация мастера (192.168.1.249)

  1. Переключитесь на системного пользователя postgres:
su - postgres
  1. В оболочке psql создайте роль для репликации (replica), с правом REPLICATION и логином:
psql  
CREATE USER replica REPLICATION LOGIN ENCRYPTED PASSWORD 'replicauser@';

Проверьте список ролей:

\du

Добавление пользователя репликации в PostgreSQL

  1. Перейдите в каталог конфигурации PostgreSQL. В примере используется путь для версии 9.4:
cd /etc/postgresql/9.4/main/
vim postgresql.conf

В файле postgresql.conf выполните изменения (расположения строк указаны в оригинальном примере, действуйте по содержимому файла):

  • listen_addresses: разрешите подключения с нужного IP
listen_addresses = 'localhost,192.168.1.249'
  • wal_level: включите режим, подходящий для репликации (hot_standby)
wal_level = hot_standby
  • checkpoint_segments: увеличьте для уменьшения частоты чекпойнтов
checkpoint_segments = 8
  • Архивирование WAL: включите и укажите команду архивации
archive_mode = on  
archive_command = 'cp -i %p /var/lib/postgresql/9.4/main/archive/%f'
  • Настройки отправки WAL
max_wal_senders = 3  
wal_keep_segments = 8

Сохраните файл.

  1. Создайте папку для архива WAL как пользователь postgres (если её нет):
mkdir -p /var/lib/9.4/main/archive/
  1. Разрешите подключения для репликации в pg_hba.conf — добавьте запись, чтобы пользователь replica мог подключаться с IP слейва:
vim pg_hba.conf

В конец файла добавьте:

host    replication     replica      192.168.1.248/24            md5  
#192.168.1.248 is slave-server ip address

Сохраните и выйдите.

  1. Перезапустите PostgreSQL или примените конфигурацию (на мастере):
sudo systemctl restart postgresql

Проверьте журналы на предмет ошибок: sudo journalctl -u postgresql — если ошибок нет, мастер готов.

Шаг 4 — Конфигурация слейва (192.168.1.248)

  1. На слейв-сервере переключитесь на postgres и перейдите в каталог конфигурации:
su - postgres  
cd /etc/postgresql/9.4/main/
vim postgresql.conf
  1. Примените изменения в postgresql.conf, соответствующие слейву:
listen_addresses = 'localhost,192.168.1.248'
wal_level = hot_standby
checkpoint_segments = 8
max_wal_senders = 3
wal_keep_segments = 8
hot_standby = on
  1. Сохраните файл и выйдите. Перезапуск на данном этапе не требуется — сначала нужно синхронизировать данные.

Шаг 5 — Синхронизация данных с мастера на слейв

Все команды в этом шаге выполняются на слейв-сервере.

  1. Остановите PostgreSQL на слейве:
systemctl stop postgresql
  1. Войдите под postgres и переименуйте текущую директорию данных, чтобы сохранить резервную копию:
su - postgres  
mv 9.4/main 9.4/main_original
  1. Запустите pg_basebackup, чтобы скопировать актуальные данные с мастера. Команда создаст новую директорию /var/lib/postgresql/9.4/main с корректными правами:
pg_basebackup -h 192.168.1.249 -D /var/lib/postgresql/9.4/main -U replica -v -P

Примечание: будет запрошен пароль пользователя replica.

  1. Создайте файл recovery.conf в новой директории данных и укажите параметры подключения к мастеру и команду для восстановления архива WAL:
cd /var/lib/postgresql/9.4/main/  
vim recovery.conf

Вставьте:

standby_mode = 'on'  
primary_conninfo = 'host=192.168.1.249 port=5432 user=replica password=replicauser@'  
restore_command = 'cp //var/lib/postgresql/9.4/main/archive/%f %p'  
trigger_file = '/tmp/postgresql.trigger.5432'

Сохраните и выйдите.

  1. Вернитесь к root (exit) и запустите PostgreSQL на слейве:
exit  
systemctl start postgresql

Убедитесь, что при запуске нет ошибок: sudo journalctl -u postgresql.

Important: путь в restore_command использует абсолютный путь до архива на слейве — убедитесь, что архив доступен и права корректны.

Шаг 6 — Тестирование репликации

На мастере выполните команду для просмотра состояния репликации:

su - postgres  
psql -x -c "select * from pg_stat_replication;"

Вы увидите строки с состоянием слейва и показателями подключения.

Тест практической репликации: создайте новую базу на мастере:

su - postgres  
psql  
create database howtoforge;

Затем на слейве проверьте список баз:

su - postgres  
psql  
\list

Проверка репликации на слейве

База howtoforge должна появиться на слейве автоматически.

Контрольные списки и роль-ориентированные чеклисты

Чеклист администратора перед включением репликации:

  • Резервная копия текущей директории данных master и слейв (если есть данные)
  • Доступ по сети между хостами (порты 5432 открыты)
  • Пароль пользователя replica установлен и работает
  • Параметры postgresql.conf и pg_hba.conf отредактированы на мастере и слейве
  • Достаточно свободного места для pg_basebackup и архива WAL
  • Проверены права доступа к директориям данных и архива

Роль оператора (быстрое руководство):

  • Создать пользователя репликации на мастере.
  • Настроить pg_hba.conf для репликации.
  • Остановить PostgreSQL на слейве и сделать pg_basebackup.
  • Создать recovery.conf и запустить PostgreSQL на слейве.
  • Проверить pg_stat_replication на мастере.

Когда репликация может не работать — распространённые причины и отладка

  1. Неправильный пароль или отсутствие роли replica — проверьте \du и попробуйте подключиться по psql с параметром -U replica.
  2. Порт 5432 закрыт фаерволом — убедитесь, что iptables/ufw разрешают соединения.
  3. Неправильные права на директории /var/lib/postgresql — postgres должен быть владельцем.
  4. Задержка архивирования WAL или нехватка места — проверьте archive_command и свободное место.
  5. Несовместимые версии PostgreSQL между мастером и слейвом — используйте совместимые ветки (например 9.4→9.4).
  6. Ошибки в recovery.conf или некорректный путь в restore_command — проверьте абсолютные пути и права.

Диагностика шагов:

  • systemctl status postgresql
  • sudo journalctl -u postgresql –since “10 minutes ago”
  • grep -i wal /var/log/postgresql/postgresql-*.log
  • psql -c “select * from pg_stat_replication;” (на мастере)

Безопасность и рекомендации

  • Не храните пароли в открытом виде в файлах конфигурации в продуктивной среде. Лучше использовать защищённые менеджеры секретов или pgpass с контролем прав доступа.
  • Ограничьте доступ по IP в pg_hba.conf только доверенным хостам.
  • Защитите канал между мастером и слейвом при наличии публичных сетей (VPN, SSH туннель или TLS).
  • Регулярно проверяйте целостность архива WAL и наличие свободного места.

Критерии приёмки

  1. На мастере в pg_stat_replication присутствует запись для слейва с state = streaming.
  2. Созданные на мастере базы/данные появляются на слейве в течение ожидаемого окна задержки.
  3. Нет ошибок в логах PostgreSQL после перезапуска служб и при выполнении pg_basebackup.
  4. Архивация WAL работает и файлы попадают в указанную директорию архива.

Мини-методология развертывания (шаблон действий)

  1. Подготовка окружения: резервное копирование, проверка сети.
  2. Установка PostgreSQL одинаковой версии на обоих хостах.
  3. Создание роли репликации на мастере.
  4. Настройка конфигураций master и slave.
  5. Полная синхронизация данных через pg_basebackup.
  6. Запуск службы на слейве и контроль работоспособности.

Быстрый справочник команд (cheat sheet)

  • Проверить статус репликации на мастере:
psql -c "select pid, state, sent_lsn, write_lsn, flush_lsn, replay_lsn from pg_stat_replication;"
  • Сделать резервную копию данных (pg_basebackup):
pg_basebackup -h MASTER_IP -D /var/lib/postgresql/9.4/main -U replica -v -P
  • Перезапустить PostgreSQL:
sudo systemctl restart postgresql

Краткая таблица зрелости (Maturity levels)

  • Начальный: однопоточная репликация без архивирования WAL, простая настройка.
  • Средний: hot standby, архивирование WAL, мониторинг задержки.
  • Продвинутый: несколько слейвов, автоматическое переключение (failover) с помощью сторонних инструментов (Patroni, repmgr), шифрование канала.

Короткая глоссарий (1 строка на термин)

  • WAL: журнал предварительной записи, необходимые для репликации и восстановления.
  • pg_basebackup: утилита для базового бэкапа и инициализации слейва.
  • recovery.conf: файл на слейве, который указывает, как подключаться к мастеру и восстанавливать WAL.

Заключение

Hot standby — надёжный и относительно простой способ организовать репликацию PostgreSQL для повышения доступности и распределения нагрузки на чтение. Следуйте чеклистам, проверяйте логи и обеспечьте безопасность канала репликации. Для продакшн‑окружения рассмотрите инструменты автоматизации failover и мониторинг задержки репликации.

Ссылки и источники:

Состояние репликации в pg_stat_replication

Подписи к изображениям выше: первое — создание пользователя replica в psql; второе — вывод pg_stat_replication; третье — список баз на слейве после репликации.

Summary:

  • Настройте имена хостов и сеть между серверами.
  • Установите PostgreSQL и создайте роль replica.
  • Измените postgresql.conf и pg_hba.conf на мастере и слейве.
  • Выполните pg_basebackup и создайте recovery.conf на слейве.
  • Проверьте статус репликации и убедитесь в отсутствии ошибок.

Notes: в примере указана версия 9.4 — при использовании других версий пути и некоторые параметры могут отличаться.

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Несколько аккаунтов Skype: Multi Skype Launcher
Программное обеспечение

Несколько аккаунтов Skype: Multi Skype Launcher

Журнал для работы: повысить продуктивность
Productivity

Журнал для работы: повысить продуктивность

Персональные звуки уведомлений на Android
Android.

Персональные звуки уведомлений на Android

Скачивание шоу Hulu для офлайн‑просмотра
Стриминг

Скачивание шоу Hulu для офлайн‑просмотра

Microsoft Start: персонализированная новостная лента
Новости

Microsoft Start: персонализированная новостная лента

Как изменить имя в Epic Games быстро
Гайды

Как изменить имя в Epic Games быстро