Прежде чем настраивать Patroni, важно понимать, что происходит под капотом. Streaming replication в PostgreSQL передаёт WAL (Write-Ahead Log) записи с primary на standby в реальном времени.
Конфигурация primary-сервера:
# postgresql.conf на primary (pg-node1)
# Репликация
wal_level = replica
max_wal_senders = 10
max_replication_slots = 10
synchronous_commit = on
synchronous_standby_names = 'FIRST 1 (pg_node2, pg_node3)'
# WAL
wal_keep_size = 4GB
archive_mode = on
archive_command = 'pgbackrest --stanza=ticketpro archive-push %p'
# Мониторинг
track_commit_timestamp = on
log_replication_commands = on
Настройка аутентификации для репликации:
# pg_hba.conf — разрешаем подключение реплик
# TYPE DATABASE USER ADDRESS METHOD
host replication replicator 10.10.1.0/24 scram-sha-256
host all all 10.10.1.0/24 scram-sha-256
Создание пользователя для репликации и replication slot:
-- На primary
CREATE ROLE replicator WITH REPLICATION LOGIN PASSWORD 'strong_password_here';
-- Создаём physical replication slot (предотвращает удаление WAL до получения репликой)
SELECT pg_create_physical_replication_slot('pg_node2_slot');
SELECT pg_create_physical_replication_slot('pg_node3_slot');
Инициализация standby через pg_basebackup:
# На standby-сервере (pg-node2)
# Останавливаем PostgreSQL если запущен
sudo systemctl stop postgresql
# Очищаем data directory
sudo rm -rf /var/lib/postgresql/16/main/*
# Клонируем primary
sudo -u postgres pg_basebackup \
--host=10.10.1.1 \
--port=5432 \
--username=replicator \
--pgdata=/var/lib/postgresql/16/main \
--wal-method=stream \
--checkpoint=fast \
--write-recovery-conf \
--slot=pg_node2_slot \
--progress \
--verbose
# pg_basebackup автоматически создаёт standby.signal
# и добавляет в postgresql.auto.conf:
# primary_conninfo = 'host=10.10.1.1 port=5432 user=replicator ...'
# primary_slot_name = 'pg_node2_slot'
sudo systemctl start postgresql
После запуска standby начинает получать WAL-записи в реальном времени. Проверяем состояние репликации на primary:
-- Мониторинг репликации на primary
SELECT
client_addr,
state,
sync_state,
sent_lsn,
write_lsn,
flush_lsn,
replay_lsn,
pg_wal_lsn_diff(sent_lsn, replay_lsn) AS replay_lag_bytes,
write_lag,
flush_lag,
replay_lag
FROM pg_stat_replication;
-- Результат:
-- client_addr | state | sync_state | replay_lag_bytes | replay_lag
-- 10.10.1.2 | streaming | sync | 0 | 00:00:00.001
-- 10.10.1.3 | streaming | async | 16384 | 00:00:00.089
Оставить комментарий