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/Репликация/streaming-replication

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

Физическая (потоковая) репликация

Standby проигрывает у себя тот же WAL, что пишет primary, и получается побайтовая копия кластера. Primary отдаёт журнал процессом walsender, standby принимает walreceiver'ом и применяет startup-процессом. Лаг меряется в LSN: насколько replay на standby отстал от записи на primary.

view as markdownaka: physical-replication, streaming

Идея в одну строку

Primary уже пишет всё, что меняет данные, в журнал предзаписи (WAL, см. wal). Раз журнала достаточно, чтобы поднять кластер после сбоя, его достаточно и чтобы держать вторую копию в актуальном состоянии. Standby просто не прекращает recovery: он бесконечно проигрывает приходящий WAL.

Поэтому физическая репликация - это не «копирование строк», а «проигрывание журнала на втором сервере». Копия получается побайтовая: те же файлы, те же relfilenode, тот же системный идентификатор кластера.

Кто что делает

primary                          standby
┌──────────────┐                 ┌──────────────┐
│ backends     │  пишут WAL      │ walreceiver  │ принимает поток
│   ↓          │                 │   ↓          │
│ wal на диск  │ ──walsender──▶  │ wal на диск  │
│              │   (по TCP)      │   ↓          │
└──────────────┘                 │ startup      │ проигрывает (replay)
                                 └──────────────┘
  • walsender на primary читает WAL и шлёт его по сети.
  • walreceiver на standby принимает поток и сохраняет на диск.
  • startup на standby проигрывает записи в том же порядке.

Standby при этом доступен на чтение (hot_standby = on), но любая попытка записи отвергается: кластер в режиме recovery.

Три LSN и лаг

LSN (Log Sequence Number) - это позиция в журнале, монотонно растущее число. Лаг репликации - это разница LSN между тем, что primary уже записал, и тем, на какой позиции standby. pg_stat_replication на primary показывает по каждому standby три рубежа:

  • sent_lsn - досюда primary отправил;
  • flush_lsn - досюда standby сбросил на диск;
  • replay_lsn - досюда standby реально проиграл (и видно на чтении).

Разрыв между flush_lsn и replay_lsn - это «WAL принят, но ещё не применён». Под нагрузкой replay отстаёт первым: запись на диск дёшева, а проигрывание конкурирует с читающими запросами.

sql
SELECT application_name, state,
       pg_wal_lsn_diff(sent_lsn, replay_lsn) AS replay_bytes_behind,
       replay_lag
FROM pg_stat_replication;

Слоты репликации

Без слота primary не знает, докуда standby дочитал, и удаляет старый WAL по своим правилам (max_wal_size, checkpoint, см. checkpoint). Если standby отстал больше, чем primary хранил, нужного сегмента уже нет - репликация рвётся с «requested WAL segment has already been removed».

Слот (pg_create_physical_replication_slot) чинит это: primary держит WAL ровно до restart_lsn слота и не удаляет раньше. Цена - обратная: забытый неактивный слот удержит WAL навсегда и забьёт диск primary. Поэтому слоты надо мониторить через pg_replication_slots.active.

Синхронность

По умолчанию репликация асинхронная: COMMIT на primary возвращается, не дожидаясь standby. Это быстро, но при падении primary последние транзакции могут не успеть уехать. synchronous_standby_names + synchronous_commit = on заставят COMMIT ждать подтверждения standby - ноль потерь ценой задержки каждого COMMIT.

Связано с hot-standby-feedback (как чтение на standby влияет на vacuum мастера) и logical-replication (репликация по строкам, а не по байтам журнала).

§ команды

bash
SELECT * FROM pg_stat_replication;

Состояние всех подключённых standby с primary: state, lsn'ы, лаг

bash
SELECT pg_create_physical_replication_slot('standby1');

Создать физический слот - primary будет держать WAL до restart_lsn

bash
SELECT slot_name, active, restart_lsn, wal_status FROM pg_replication_slots;

Слоты и докуда каждый держит WAL; неактивный слот опасен для диска

bash
SELECT pg_current_wal_lsn();

Текущая позиция записи WAL на primary - точка отсчёта для лага

§ см. также

  • hot-standby-feedbackhot_standby_feedback и vacuum мастераДлинный запрос на standby читает старые версии строк. Если primary их уже почистил vacuum'ом, standby обязан либо отменить запрос (конфликт восстановления), либо отстать. hot_standby_feedback = on говорит primary не удалять то, что ещё нужно standby - ценой роста мусора на primary.
  • logical-replicationЛогическая репликация (publication/subscription)Логическая репликация шлёт не байты WAL, а декодированные изменения строк: INSERT/UPDATE/DELETE по конкретным таблицам. Источник объявляет PUBLICATION, приёмник создаёт SUBSCRIPTION. Требует wal_level = logical. Можно реплицировать часть таблиц между разными версиями и схемами.
  • distributed-pitfallsРаспределённые ловушки: 2PC, multi-master, CAPКак только данные живут на нескольких серверах, появляются проблемы, которых не было на одном. 2PC даёт атомарность поверх узлов, но повисший prepared-транзакшн держит блокировки и горизонт. Самодельный multi-master ловит конфликты записи, которые некому разрешить. CAP/PACELC объясняют, чем именно приходится жертвовать.
  • walWAL: принцип write-ahead и LSNWAL - последовательный журнал изменений. Правило write-ahead: запись об изменении попадает на диск раньше самой страницы данных, поэтому сбой не теряет подтверждённые данные. LSN - смещение в потоке журнала. COMMIT при synchronous_commit=on ждёт сброса журнала на диск.
  • wal-levelУровни журнала: minimal, replica, logicalwal_level задаёт детальность журнала: minimal (только crash recovery), replica (по умолчанию: репликация, архивация, PITR), logical (плюс логическое декодирование). Уровни вложены, смена требует перезапуска. Заглянуть в WAL можно через pg_walinspect и pg_waldump.
Footer
linuxlab-
Copyright © 2026 LinuxLab. Все права защищены.
Учебники
Цены
О платформе
Конфиденциальность и куки