PostgreSQLSeniorSystem design

Чем отличаются streaming replication и logical replication? Когда что использовать?

Streaming replication копирует WAL побайтово — точная копия всего кластера, идеальна для HA/failover. Logical replication передаёт строки и позволяет реплицировать отдельные таблицы между разными версиями PG или кластерами.

Физическая (streaming) репликация

Streaming replication — побайтовая передача WAL-сегментов с мастера на реплику. Реплика воспроизводит те же страницы данных, что и мастер. Результат — точная физическая копия всего кластера, включая системные таблицы, роли и настройки.

Ключевые характеристики:

  • Работает на уровне блоков/страниц, не строк.
  • Реплика доступна только на чтение (hot standby) или вообще недоступна (warm standby).
  • Реплицируется весь экземпляр PostgreSQL — нельзя выбрать отдельные таблицы или базы.
  • Минимальная задержка: реплика отстаёт ровно настолько, насколько сеть позволяет передать WAL.
  • Используется для аварийного переключения (failover) и read-реплик.
-- на мастере: создаём replication slot
SELECT pg_create_physical_replication_slot('replica1');

-- recovery.conf / postgresql.conf на реплике (Postgres 12+)
-- primary_conninfo = 'host=master port=5432 user=replicator password=...'
-- primary_slot_name = 'replica1'
-- hot_standby = on

Логическая репликация

Logical replication работает на уровне строк и операций (INSERT/UPDATE/DELETE). Мастер декодирует WAL через output plugin (pgoutput по умолчанию) и отправляет логический поток изменений подписчику.

Ключевые характеристики:

  • Можно реплицировать отдельные таблицы, а не весь кластер.
  • Подписчик может быть другой версии PostgreSQL (полезно при обновлениях).
  • Подписчик остаётся полноценным read-write узлом — можно писать в нереплицируемые таблицы.
  • Не реплицируются DDL-изменения, последовательности, большие объекты.
  • Требует wal_level = logical на источнике.
-- на издателе (publisher)
ALTER SYSTEM SET wal_level = logical;
-- после перезапуска:
CREATE PUBLICATION my_pub FOR TABLE orders, products;

-- на подписчике (subscriber)
CREATE SUBSCRIPTION my_sub
  CONNECTION 'host=publisher dbname=mydb user=replicator password=...'
  PUBLICATION my_pub;

-- проверка состояния
SELECT * FROM pg_stat_subscription;

Когда что выбирать

  • Streaming replication — HA/failover, read-реплики для масштабирования чтения, резервное копирование через pg_basebackup. Минимальная задержка, максимальная надёжность.
  • Logical replication — zero-downtime мажорные обновления PostgreSQL (10 -> 17), шардинг данных между кластерами, ETL без внешних инструментов, реплицирование подмножества таблиц в аналитическую БД, интеграция с Debezium/Kafka через CDC.
  • Оба режима можно сочетать: streaming для HA, logical для аналитики.

Подводные камни

  • Replication slots при streaming: если реплика надолго отключается, слот удерживает WAL-сегменты, что переполняет pg_wal и ронит мастер. Мониторьте pg_replication_slots.active и pg_wal_lsn_diff.
  • wal_level = logical требует перезапуска кластера — нельзя применить через pg_reload_conf().
  • Логическая репликация не переносит DDL: ALTER TABLE на мастере нужно вручную применять на подписчике до или одновременно с изменением схемы.
  • Sequences не реплицируются логически — после failover возможны конфликты первичных ключей, если подписчик начинает генерировать ID.
  • Большие транзакции при логической репликации буферизуются на диске подписчика (logical_decoding_work_mem), что замедляет применение.
  • Фильтрация строк в PUBLICATION (WHERE-условие) работает только с Postgres 15+ — в более старых версиях нельзя частично реплицировать таблицу.
  • hot_standby_feedback: при streaming, если не включить, долгие запросы на реплике могут получать ошибку «snapshot too old» при очистке мастером.

Common mistakes

  • Считать logical replication HA-заменой physical standby.
  • Не мониторить replication slots.
  • Забывать DDL и sequences при logical.

What the interviewer is testing

  • Просит use cases для каждого режима.
  • Проверяет WAL vs logical changes.
  • Уточняет replica identity и lag.

Sources

Related topics