Репликация PostgreSQL, Hot Standby и PgBouncer
Раздел 8.11, шаг 6 из 12. Дальше — PostgreSQL в Docker.
Зачем репликация
| Задача | Механизм |
|---|---|
| Отказоустойчивость | Standby + автоматический failover (Patroni — шаг 9) |
| Масштабирование чтения | Hot Standby, read replicas |
| Миграция / upgrade | Logical replication на новую major-версию |
| Интеграция, CDC | Logical replication, pgoutput |
Streaming replication (физическая)
Primary пишет WAL; standby получает WAL по сети и проигрывает изменения byte-level. Standby — бинарная копия той же major-версии и layout.
Настройка primary (упрощённо):
wal_level = replica
max_wal_senders = 10
wal_keep_size = 1GB
CREATE ROLE replicator WITH REPLICATION LOGIN PASSWORD '…';
pg_hba.conf — разрешить replication с IP standby.
На standby — pg_basebackup:
pg_basebackup -h primary-host -D /var/lib/postgresql/data -U replicator -Fp -Xs -P -R
Флаг -R создаёт standby.signal и primary_conninfo (PostgreSQL 12+).
Проверка:
-- на primary
SELECT client_addr, state, sent_lsn, replay_lsn
FROM pg_stat_replication;
Replication lag — разница sent_lsn и replay_lsn; мониторьте в Prometheus/Grafana (шаг 11).
Hot Standby — чтение с реплики
Standby в режиме hot standby принимает read-only запросы, пока apply WAL продолжается.
hot_standby = on
max_standby_streaming_delay = 30s
Конфликты: д long query на replica может блокировать apply WAL (canceling statement due to conflict with recovery). Решения — routing только «быстрых» запросов на replica, hot_standby_feedback = on (trade-off с bloat на primary).
Приложение:
primary → все INSERT/UPDATE/DELETE
replica → SELECT отчёты, дашборды
ORM и connection string должны явно разделять write/read endpoints.
Logical replication
Logical — репликация изменений таблиц (INSERT/UPDATE/DELETE) в формате logical decoding. Позволяет:
- реплицировать подмножество таблиц;
- разные версии Postgres (с ограничениями);
- fan-out в несколько подписчиков.
Primary:
wal_level = logical
max_replication_slots = 4
CREATE PUBLICATION app_pub FOR TABLE orders, order_items;
-- на subscriber
CREATE SUBSCRIPTION app_sub
CONNECTION 'host=primary dbname=app user=…'
PUBLICATION app_pub;
Ограничения — нет DDL, sequence реплицируются отдельно, initial sync может быть тяжёлым.
Failover
Ручной promote standby:
pg_ctl promote -D /var/lib/postgresql/data
В production — Patroni, repmgr, операторы Kubernetes (шаг 9) с consensus (etcd, DCS) для автоматического выбора нового primary и обновления VIP/DNS.
Два узла, считающие себя primary, приводят к порче данных. Нужен quorum и fencing старого primary.
PgBouncer — пулинг соединений
Каждый PostgreSQL backend — отдельный процесс. При 500 микросервисных pod × 10 conn = 5000 backend — крах.
PgBouncer — лёгкий прокси между приложением и Postgres.
| Режим | Поведение | Когда |
|---|---|---|
| Session pooling | Соединение клиента = один backend на всю сессию | Temp tables, prepared statements, LISTEN |
| Transaction pooling | Backend возвращается в пул после COMMIT | Default для stateless API |
| Statement pooling | После каждого statement | Редко, ломает транзакции |
Пример pgbouncer.ini:
[databases]
app = host=127.0.0.1 port=5432 dbname=app
[pgbouncer]
listen_port = 6432
listen_addr = *
auth_type = scram-sha-256
auth_file = /etc/pgbouncer/userlist.txt
pool_mode = transaction
default_pool_size = 50
max_client_conn = 1000
Приложение подключается к 6432, Postgres видит ~50 backend.
Ограничения transaction mode:
- нельзя полагаться на session-level
SET, temp tables, advisory locks между запросами; - prepared statements — используйте
DEALLOCATE ALLили disable prepare в драйвере.
Managed-альтернативы — RDS Proxy, PgBouncer sidecar в Kubernetes.
Сравнение с другими СУБД
Общая теория репликации и кластеров — 3.08 итоги. PostgreSQL streaming ≈ MySQL replication, logical ≈ частично Debezium/CDC.
Практика
- Lab — primary + standby в Docker Compose,
pg_basebackup, проверкаpg_stat_replication. - Направьте read-only отчёт на standby, primary под нагрузкой записи.
- PgBouncer transaction mode +
pgbench -c 200через порт 6432 vs прямой 5432.
Связанные материалы
См. также
Другие статьи этого же раздела в боковом меню (как на странице "О разделе"). MVCC, XID, снимки данных, системные поля xmin/xmax, VACUUM и autovacuum, bloat, wraparound, процессы postmaster, Shared Buffers и WAL. pg_dump, pg_basebackup, PITR, pg_probackup, Wal-G, стратегия 3-2-1, восстановление в Kubernetes и после failover. pg_stat_statements, pg_stat_activity, auto_explain, pgBadger, Prometheus postgres_exporter, типовые метрики SLA и алерты. Ansible role для установки Postgres, шаблоны postgresql.conf, Terraform для RDS и managed PostgreSQL, GitOps паттерны для инфраструктуры БД. EXPLAIN и EXPLAIN ANALYZE, B-tree, GiST, SP-GiST, GIN, BRIN, частичные и составные индексы, типовые ошибки планировщика. Тонкая настройка памяти (shared_buffers, work_mem, maintenance_work_mem), I/O (effective_cache_size, random_page_cost), WAL, checkpoint и autovacuum. Документная модель в Postgres, операторы и индексы JSONB, declarative partitioning по range/list/hash, связь с оконными функциями и CTE. Хранимые функции и процедуры PL/pgSQL, row-level и statement triggers, event triggers, асинхронные события через NOTIFY и LISTEN без polling. Официальный образ postgres, volumes для PGDATA, переменные окружения, docker-compose с healthcheck, типовые ошибки контейнеризации СУБД. Managed PostgreSQL (RDS, Cloud SQL, Yandex Managed), StatefulSet, PersistentVolume, секреты, операторы Crunchy/Zalando, anti-patterns stateful в K8s. Patroni и DCS, сравнение с Greenplum и CockroachDB, когда нужен sharding, Citus, выбор архитектуры под OLTP и аналитику. Краткое резюме раздела 8.11 — архитектура, оптимизация, эксплуатация в контейнерах и Kubernetes, HA, бэкапы и автоматизация.Архитектура PostgreSQL и внутреннее устройство
Бэкапы PostgreSQL и восстановление
Профилирование и мониторинг PostgreSQL
Автоматизация PostgreSQL — Ansible и Terraform
Продвинутая оптимизация PostgreSQL и индексы
Конфигурация PostgreSQL — postgresql.conf
JSONB, партиционирование и расширения SQL в PostgreSQL
PL/pgSQL, триггеры и NOTIFY/LISTEN в PostgreSQL
PostgreSQL в Docker
PostgreSQL в облаке и Kubernetes
HA-кластеры PostgreSQL и распределённые СУБД
Практикум PostgreSQL — итоги