PostgreSQL 9.6 Master‑Slave репликация на CentOS 7 — настройка Hot standby
Краткий обзор
PostgreSQL (Postgres) — это свободная объектно-реляционная система управления базами данных с долгой историей активной разработки. В этой инструкции показано, как настроить master‑slave (Primary‑Standby) репликацию версии 9.6 на двух серверах CentOS 7 в режиме Hot standby (физическая стриминговая репликация). Цель — обеспечить доступность чтения с резервного сервера и непрерывность обслуживания при отказе мастера.
ВАЖНО: приведённые конфигурации ориентированы на учебную/операционную установку; в продакшене дополнительно необходима настройка мониторинга, резервного копирования, тестирования отказа и шифрования каналов.
Основные понятия (в одну строку)
- WAL: журнал предзаписей (Write-Ahead Log) — последовательность изменений, которую реплика применяет для синхронизации.
- Hot standby: режим на слейве, позволяющий только чтение из базы во время репликации.
- pg_basebackup: утилита для физического бэкапа/клонирования данных мастера.
Что мы сделаем
- Установим PostgreSQL 9.6.
- Инициализируем и запустим сервис.
- Настроим firewalld.
- Сконфигурируем Master (Primary).
- Сконфигурируем Slave (Standby).
- Протестируем репликацию.
Предварительные требования
- 1 сервер CentOS 7 — Master — права чтения/записи — IP: 10.0.15.10
- 1 сервер CentOS 7 — Slave — только чтение — IP: 10.0.15.11
- root (или sudo) доступ на обоих серверах
- Открытые порты 5432 между хостами (или соответствующий маршрут/маршрутизация)
Шаг 1 — Установка PostgreSQL 9.6
Репозиторий CentOS по умолчанию может содержать устаревшую версию. Подключите официальный RPM-репозиторий PostgreSQL 9.6 и установите пакеты.
yum -y install https://yum.postgresql.org/9.6/redhat/rhel-7-x86_64/pgdg-centos96-9.6-3.noarch.rpmyum -y install postgresql96-server postgresql96-contribТеперь PostgreSQL 9.6 установлен.
Шаг 2 — Инициализация, запуск и начальная настройка
Инициализируйте кластер и запустите сервис.
cd /usr/pgsql-9.6/bin
./postgresql96-setup initdbsystemctl start postgresql-9.6
systemctl enable postgresql-9.6По умолчанию PostgreSQL слушает порт 5432. Убедитесь, что порт слушается:
netstat -plntu
Если netstat недоступен, установите net-tools:
yum -y install net-toolsЗатем задайте пароль для системного пользователя postgres и его учётной записи в psql:
su - postgres
psql
\password postgres
Enter new password:
Шаг 3 — Конфигурация firewalld
Запустите и включите firewalld, откройте сервис PostgreSQL:
systemctl start firewalld
systemctl enable firewalldfirewall-cmd --add-service=postgresql --permanent
firewall-cmd --reloadПроверьте правила:
firewall-cmd --list-all
ПРИМЕЧАНИЕ: шаги 1–3 выполните на обоих серверах (Master и Slave).
Шаг 4 — Настройка Master сервера
На мастере мы включим отправку WAL, включим архивацию и разрешим коннекты репликации с конкретных IP.
Откройте каталог данных и отредактируйте postgresql.conf:
cd /var/lib/pgsql/9.6/data
vim postgresql.confВнесите (раскомментируйте/измените) следующие параметры:
listen_addresses = '10.0.15.10'
wal_level = hot_standby
synchronous_commit = local
archive_mode = on
archive_command = 'cp %p /var/lib/pgsql/9.6/archive/%f'
max_wal_senders = 2
wal_keep_segments = 10
synchronous_standby_names = 'pgslave01'Пояснения:
- listen_addresses: ограничивает интерфейс приёма подключений.
- wal_level = hot_standby: нужен для стриминговой репликации и восстановления.
- synchronous_commit = local: синхронизация на локальной стороне; баланс между производительностью и устойчивостью.
- archive_mode и archive_command: включают архивацию WAL-файлов (на случай восстановления).
Создайте каталог архива и установите права:
mkdir -p /var/lib/pgsql/9.6/archive/
chmod 700 /var/lib/pgsql/9.6/archive/
chown -R postgres:postgres /var/lib/pgsql/9.6/archive/Отредактируйте pg_hba.conf и добавьте строки для репликации (в конец файла):
# Localhost
host replication replica 127.0.0.1/32 md5
# PostgreSQL Master IP address
host replication replica 10.0.15.10/32 md5
# PostgreSQL Slave IP address
host replication replica 10.0.15.11/32 md5Сохраните изменения и перезапустите сервис:
systemctl restart postgresql-9.6
Создайте пользователя для репликации (replica):
su - postgres
createuser --replication -P replica
Enter New Password:Задайте пароль (в примере: aqwe123@). Права пользователя replica ограничены опцией –replication.
Шаг 5 — Настройка Slave сервера
На слейве мы заменим каталог data копией с мастера и настроим hot_standby.
Остановите PostgreSQL на слейве:
systemctl stop postgresql-9.6Сделайте резервную копию текущего data и подготовьте пустой каталог:
cd /var/lib/pgsql/9.6/
mv data data-backup
mkdir -p data/
chmod 700 data/
chown -R postgres:postgres data/Сделайте физическую базовую копию с мастера от имени postgres:
su - postgres
pg_basebackup -h 10.0.15.10 -U replica -D /var/lib/pgsql/9.6/data -P --xlog
Password:Подождите окончания передачи. На выходе получится точная копия данных мастера.

Отредактируйте postgresql.conf на слейве:
cd /var/lib/pgsql/9.6/data/
vim postgresql.confИзмените listen_addresses и включите hot_standby:
listen_addresses = '10.0.15.11'
hot_standby = onСоздайте файл recovery.conf в каталоге data с такими параметрами:
vim recovery.confВставьте:
standby_mode = 'on'
primary_conninfo = 'host=10.0.15.10 port=5432 user=replica password=aqwe123@ application_name=pgslave01'
trigger_file = '/tmp/postgresql.trigger.5432'ПРИМЕЧАНИЕ: в primary_conninfo замените пароль и другие параметры на значения вашей среды.
Защитите recovery.conf и установите владельца:
chmod 600 recovery.conf
chown postgres:postgres recovery.confЗапустите PostgreSQL на слейве:
systemctl start postgresql-9.6Проверьте, что слушает адрес 10.0.15.11:
netstat -plntu
Шаг 6 — Тестирование репликации
На мастере проверьте состояние репликации:
su - postgres
psql -c "select application_name, state, sync_priority, sync_state from pg_stat_replication;"
psql -x -c "select * from pg_stat_replication;"Ожидаемое состояние: state = streaming, sync_state = sync (если синхронная репликация) или async для асинхронной.

Создайте тестовую таблицу на мастере и добавьте строки:
su - postgres
psql
CREATE TABLE replica_test (test varchar(100));
INSERT INTO replica_test VALUES ('howtoforge.com');
INSERT INTO replica_test VALUES ('This is from Master');
INSERT INTO replica_test VALUES ('pg replication by hakase-labs');
На слейве подключитесь к psql и проверьте данные:
su - postgres
psql
select * from replica_test;
Вы увидите, что записи реплицировались.
Дополнительный тест: попытка записи на слейве должна завершиться ошибкой:
INSERT INTO replica_test VALUES ('this is SLAVE');Ожидаемый результат: нельзя выполнить INSERT (слейв в режиме только для чтения).
Если всё успешно — настройка репликации завершена.
Дополнительные тесты и валидация
- Проверка задержки репликации: используйте функции pg_stat_replication и сравнивайте текущую позицию WAL (pg_current_wal_lsn()) с позиции на слейве.
- Проверка архивации WAL: убедитесь, что файлы появляются в /var/lib/pgsql/9.6/archive/.
- Тест отказа: смоделируйте остановку мастера и выполните failover с помощью создания trigger_file или ручного промоушена.
Процедура планового переключения и отката (SOP)
- Подготовка: убедитесь, что слейв в состоянии streaming и актуален.
- Остановите прием новых записей на мастере (режим maintenance).
- На слейве создайте файл trigger_file (или выполните pg_ctl promote):
touch /tmp/postgresql.trigger.5432- После промоушена слейв станет мастером — переключите приложение на новый мастер.
- Откат: восстановите старый мастер из архива или создайте новый слейв от текущего мастера.
Критерии приёмки: слейв должен быть в состоянии streaming, данные тестовой таблицы совпадают, клиенты могут читать с реплики.
Безопасность и hardening (рекомендуемые шаги)
- Ограничьте доступ к порту 5432 на уровне фаервола только между доверенными хостами.
- Используйте шифрование подключения (SSL) между мастером и слейвом для защиты WAL‑трафика.
- Ограничьте привилегии у пользователя replica и храните пароли в защищённых местах (Vault/Ansible Vault).
- Регулярно проверяйте целостность архивов WAL и тестируйте восстановление из архива.
Альтернативные подходы и когда этот метод не подходит
- Логическая репликация / репликация на уровне строк (logical replication) полезна для частичных реплик, фильтрации или репликации между разными версиями; в PostgreSQL 9.6 логическая встроенная репликация ограничена, существуют расширения вроде pglogical.
- Для многомастерных сценариев используйте решения типа BDR, Bucardo или сторонние кластерные решения.
- Этот метод не подходит, если вы хотите реплицировать только подмножество таблиц или выполнять трансформации в пути.
Ментальные модели и эвристики
- WAL → Передача журналов изменений; стриминг — отправка WAL в реальном времени.
- Master = источник истины; Slave = копия для чтения и резервирования.
- Архивация WAL = страховка от длительных репликационных разрывов.
Роль‑ориентированные чек‑листы
- DBA:
- Проверить параметры postgresql.conf и pg_hba.conf.
- Убедиться в наличии архивации WAL.
- Настроить мониторинг (pg_stat_replication, check replication lag).
- Системный администратор:
- Настроить сетевые правила / firewall.
- Обеспечить шифрование каналов и безопасность ОС.
- Разработчик/DevOps:
- Тестировать поведение приложения при failover.
- Подготовить сценарии переключения и отката.
Тестовые случаи и критерии приёмки
- После вставки N строк на мастере все строки появляются на слейве в течение допустимого окна задержки.
- Попытка записи на слейве завершается ошибкой.
- После перезапуска мастера/слейва репликация автоматически восстанавливается.
Совместимость и миграция
- На CentOS 7 инструкции применимы к пакетам PostgreSQL, собранным для RHEL 7.
- При миграции между мажорными версиями PostgreSQL рекомендуется делать dump/restore или использовать pg_upgrade; физическая репликация между мажорными версиями не поддерживается.
Быстрый справочник (cheat sheet)
- Инициализация: ./postgresql96-setup initdb
- Бэкап для слейва: pg_basebackup -h
-U replica -D /var/lib/pgsql/9.6/data -P –xlog - Перезапуск: systemctl restart postgresql-9.6
- Проверка реплики: psql -c “select * from pg_stat_replication;”
Краткое резюме
- Мы установили PostgreSQL 9.6 на CentOS 7, включили стриминговую репликацию в режиме Hot standby и проверили репликацию данных.
- Настройка включает изменение postgresql.conf, добавление правил в pg_hba.conf, создание пользователя репликации и использование pg_basebackup для клонирования.
- Для продакшена добавьте SSL, мониторинг, тесты failover и продумайте политику архивирования WAL.
КОНЕЦ СТАТЬИ.
References
Похожие материалы
Несколько аккаунтов Skype: Multi Skype Launcher
Журнал для работы: повысить продуктивность
Персональные звуки уведомлений на Android
Скачивание шоу Hulu для офлайн‑просмотра
Microsoft Start: персонализированная новостная лента