Настройка 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) передаётся от мастера к слейвам для синхронизации данных.
Структура этого руководства
- Настройка имён хостов
- Установка PostgreSQL на обоих серверах
- Конфигурация мастера (создание пользователя репликации, правки postgresql.conf и pg_hba.conf)
- Конфигурация слейва (параметры для hot_standby)
- Синхронизация данных с помощью pg_basebackup и создание recovery.conf
- Тестирование репликации
- Контрольные списки, отладка и рекомендации по безопасности
Шаг 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)
- Переключитесь на системного пользователя postgres:
su - postgres- В оболочке psql создайте роль для репликации (replica), с правом REPLICATION и логином:
psql
CREATE USER replica REPLICATION LOGIN ENCRYPTED PASSWORD 'replicauser@';Проверьте список ролей:
\du
- Перейдите в каталог конфигурации 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Сохраните файл.
- Создайте папку для архива WAL как пользователь postgres (если её нет):
mkdir -p /var/lib/9.4/main/archive/- Разрешите подключения для репликации в 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Сохраните и выйдите.
- Перезапустите PostgreSQL или примените конфигурацию (на мастере):
sudo systemctl restart postgresqlПроверьте журналы на предмет ошибок: sudo journalctl -u postgresql — если ошибок нет, мастер готов.
Шаг 4 — Конфигурация слейва (192.168.1.248)
- На слейв-сервере переключитесь на postgres и перейдите в каталог конфигурации:
su - postgres
cd /etc/postgresql/9.4/main/
vim postgresql.conf- Примените изменения в 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- Сохраните файл и выйдите. Перезапуск на данном этапе не требуется — сначала нужно синхронизировать данные.
Шаг 5 — Синхронизация данных с мастера на слейв
Все команды в этом шаге выполняются на слейв-сервере.
- Остановите PostgreSQL на слейве:
systemctl stop postgresql- Войдите под postgres и переименуйте текущую директорию данных, чтобы сохранить резервную копию:
su - postgres
mv 9.4/main 9.4/main_original- Запустите 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.
- Создайте файл 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'Сохраните и выйдите.
- Вернитесь к 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 на мастере.
Когда репликация может не работать — распространённые причины и отладка
- Неправильный пароль или отсутствие роли replica — проверьте \du и попробуйте подключиться по psql с параметром -U replica.
- Порт 5432 закрыт фаерволом — убедитесь, что iptables/ufw разрешают соединения.
- Неправильные права на директории /var/lib/postgresql — postgres должен быть владельцем.
- Задержка архивирования WAL или нехватка места — проверьте archive_command и свободное место.
- Несовместимые версии PostgreSQL между мастером и слейвом — используйте совместимые ветки (например 9.4→9.4).
- Ошибки в 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 и наличие свободного места.
Критерии приёмки
- На мастере в pg_stat_replication присутствует запись для слейва с state = streaming.
- Созданные на мастере базы/данные появляются на слейве в течение ожидаемого окна задержки.
- Нет ошибок в логах PostgreSQL после перезапуска служб и при выполнении pg_basebackup.
- Архивация WAL работает и файлы попадают в указанную директорию архива.
Мини-методология развертывания (шаблон действий)
- Подготовка окружения: резервное копирование, проверка сети.
- Установка PostgreSQL одинаковой версии на обоих хостах.
- Создание роли репликации на мастере.
- Настройка конфигураций master и slave.
- Полная синхронизация данных через pg_basebackup.
- Запуск службы на слейве и контроль работоспособности.
Быстрый справочник команд (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 и мониторинг задержки репликации.
Ссылки и источники:
- http://pgpen.blogspot.com/2013/07/recoverability-of-postgresql-2-setup-of.html
- https://cloud.google.com/solutions/setup-postgres-hot-standby

Подписи к изображениям выше: первое — создание пользователя replica в psql; второе — вывод pg_stat_replication; третье — список баз на слейве после репликации.
Summary:
- Настройте имена хостов и сеть между серверами.
- Установите PostgreSQL и создайте роль replica.
- Измените postgresql.conf и pg_hba.conf на мастере и слейве.
- Выполните pg_basebackup и создайте recovery.conf на слейве.
- Проверьте статус репликации и убедитесь в отсутствии ошибок.
Notes: в примере указана версия 9.4 — при использовании других версий пути и некоторые параметры могут отличаться.
Похожие материалы
Несколько аккаунтов Skype: Multi Skype Launcher
Журнал для работы: повысить продуктивность
Персональные звуки уведомлений на Android
Скачивание шоу Hulu для офлайн‑просмотра
Microsoft Start: персонализированная новостная лента