linuxlab.io
Учебники▾
  • Линукс и сети
    Файловая система, процессы, TCP/IP, BGP и OSPF
    →
  • Terraform и IaC
    HCL, state, plan/apply на sandbox LocalStack
    →
  • Git и GitHub
    Объектная модель, plumbing, ветвление, GitHub Actions
    →
Все учебники →
ЦеныО платформеВойтиСоздать аккаунт
/
Intro
Lessons
Footer
linuxlab-УчебникиЦеныО платформеКонфиденциальность и куки
Copyright © 2026 LinuxLab. Все права защищены.
linuxlab.io
Учебники▾
  • Линукс и сети
    Файловая система, процессы, TCP/IP, BGP и OSPF
    →
  • Terraform и IaC
    HCL, state, plan/apply на sandbox LocalStack
    →
  • Git и GitHub
    Объектная модель, plumbing, ветвление, GitHub Actions
    →
Все учебники →
ЦеныО платформеВойтиСоздать аккаунт
/
  • Введение
  • Главы
  • How it worksскоро
  • Уроки
  • База знаний
  • Собеседование
home/postgres/kb/Репликация/logical-replication

kb/replication ── Репликация ── advanced

Логическая репликация (publication/subscription)

Логическая репликация шлёт не байты WAL, а декодированные изменения строк: INSERT/UPDATE/DELETE по конкретным таблицам. Источник объявляет PUBLICATION, приёмник создаёт SUBSCRIPTION. Требует wal_level = logical. Можно реплицировать часть таблиц между разными версиями и схемами.

view as markdownaka: logical-decoding, publication-subscription

Чем отличается от физической

Физическая репликация копирует кластер байт-в-байт через WAL. Всё или ничего: та же версия, та же схема, нельзя писать на копии.

Логическая работает на уровне строк. Из того же WAL процесс логического декодирования восстанавливает «в таблице X строка с ключом K стала такой-то» и шлёт это подписчику как логическую операцию. Подписчик - обычный самостоятельный кластер: у него свои индексы, он принимает запись, может быть другой мажорной версии.

publisher                              subscriber
┌────────────────────────┐            ┌──────────────────┐
│ WAL (wal_level=logical) │           │ apply worker     │
│   ↓ logical decoding    │ ──строки──▶│   ↓             │
│ PUBLICATION (набор      │           │ INSERT/UPDATE/   │
│   таблиц)               │           │   DELETE локально │
└────────────────────────┘            └──────────────────┘

Минимальная настройка

На публикующем сервере нужен wal_level = logical (см. wal-level; требует рестарта - это больше, чем replica, потому что в WAL добавляется информация для декодирования строк).

sql
-- на источнике
CREATE PUBLICATION pub_flights FOR TABLE flights;
-- на приёмнике (таблица flights должна уже существовать структурно)
CREATE SUBSCRIPTION sub_flights
  CONNECTION 'host=primary dbname=lab user=rep password=...'
  PUBLICATION pub_flights;

При создании подписки по умолчанию идёт начальная копия данных (copy_data = true), затем поток догоняющих изменений. Прогресс видно в pg_stat_subscription на приёмнике и pg_replication_slots на источнике (под каждую подписку источник держит логический слот).

Что НЕ едет автоматически

Это главный источник сюрпризов. Логическая репликация везёт DML по перечисленным таблицам - и почти ничего больше:

  • DDL не реплицируется. ALTER TABLE ... ADD COLUMN на источнике не доедет; добавить колонку нужно руками на обеих сторонах, иначе apply встанет.
  • Последовательности (sequences) не синхронизируются - значение serial/identity на приёмнике своё. После переключения легко словить конфликт первичного ключа.
  • TRUNCATE едет, только если включён в публикацию.
  • Таблице нужна replica identity (обычно первичный ключ), иначе UPDATE/DELETE по ней не реплицируются.

Конфликты

Подписчик принимает запись и от своих клиентов тоже. Если прилетит изменение строки, которой локально уже нет (или есть с другим ключом), apply-воркер падает с конфликтом и встаёт - репликация по этой подписке стоит, пока конфликт не разрешат вручную. Поэтому «писать в обе стороны» без чёткого разделения ключей - прямая дорога к остановке (см. distributed-pitfalls).

Типичные применения: миграция между мажорными версиями без даунтайма, сбор нескольких баз в одно хранилище, репликация подмножества таблиц. Про сам журнал, из которого всё декодируется - streaming-replication.

§ команды

bash
CREATE PUBLICATION pub_flights FOR TABLE flights;

Объявить набор таблиц для логической репликации на источнике

bash
SELECT * FROM pg_publication_tables;

Какие таблицы реально попали в публикации

bash
SELECT subname, received_lsn, latest_end_lsn FROM pg_stat_subscription;

На приёмнике: прогресс применения каждой подписки

bash
SHOW wal_level;

Логическая репликация требует wal_level = logical (рестарт сервера)

§ см. также

  • streaming-replicationФизическая (потоковая) репликацияStandby проигрывает у себя тот же WAL, что пишет primary, и получается побайтовая копия кластера. Primary отдаёт журнал процессом walsender, standby принимает walreceiver'ом и применяет startup-процессом. Лаг меряется в LSN: насколько replay на standby отстал от записи на primary.
  • hot-standby-feedbackhot_standby_feedback и vacuum мастераДлинный запрос на standby читает старые версии строк. Если primary их уже почистил vacuum'ом, standby обязан либо отменить запрос (конфликт восстановления), либо отстать. hot_standby_feedback = on говорит primary не удалять то, что ещё нужно standby - ценой роста мусора на primary.
  • distributed-pitfallsРаспределённые ловушки: 2PC, multi-master, CAPКак только данные живут на нескольких серверах, появляются проблемы, которых не было на одном. 2PC даёт атомарность поверх узлов, но повисший prepared-транзакшн держит блокировки и горизонт. Самодельный multi-master ловит конфликты записи, которые некому разрешить. CAP/PACELC объясняют, чем именно приходится жертвовать.
  • wal-levelУровни журнала: minimal, replica, logicalwal_level задаёт детальность журнала: minimal (только crash recovery), replica (по умолчанию: репликация, архивация, PITR), logical (плюс логическое декодирование). Уровни вложены, смена требует перезапуска. Заглянуть в WAL можно через pg_walinspect и pg_waldump.
Footer
linuxlab-
Copyright © 2026 LinuxLab. Все права защищены.
Учебники
Цены
О платформе
Конфиденциальность и куки