linuxlab.io
Учебники▾
  • Линукс и сети
    Файловая система, процессы, TCP/IP, BGP и OSPF
    →
  • Terraform и IaC
    HCL, state, plan/apply на sandbox LocalStack
    →
  • Git и GitHub
    Объектная модель, plumbing, ветвление, GitHub Actions
    →
  • PostgreSQL изнутри
    Страница и кортеж, MVCC, vacuum, WAL, планировщик и индексы
    →
Все учебники →
ЦеныО платформеВойтиСоздать аккаунт
/
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
    →
  • PostgreSQL изнутри
    Страница и кортеж, MVCC, vacuum, WAL, планировщик и индексы
    →
Все учебники →
ЦеныО платформеВойтиСоздать аккаунт
/
  • Введение
  • Главы
  • How it works
  • Уроки
  • База знаний
  • Собеседование
Cluster

← все кластеры

Потоковая и логическая репликация, отказоустойчивость

Как PostgreSQL держит копии данных и переживает отказ узла: потоковая репликация поверх WAL, синхронный и асинхронный режимы, лаг, обратная связь реплики, логическая репликация, слоты, failover и подводные камни распределённых систем. Реплика это не бэкап - и здесь это проверяют первым.

8 вопросов · ~35 мин чтения

Questions

На этой странице

  1. 01Как работает потоковая репликация? Что передаётся между узлами?
  2. 02Синхронная и асинхронная репликация: чем расплачиваешься за каждую?
  3. 03Что такое лаг репликации, как его измерять и откуда он берётся?
  4. 04Зачем нужен hot_standby_feedback и какой конфликт он решает?
  5. 05Чем логическая репликация отличается от физической и когда она нужна?
  6. 06Что такое слот репликации и чем опасен заброшенный слот?
  7. 07Что такое failover и split-brain? Почему автоматическое переключение опасно?
  8. 08Реплика - это бэкап? Какие подводные камни у распределённой работы с данными?

#streaming-replication

intermediateчасто

Как работает потоковая репликация? Что передаётся между узлами?

Что отвечать

Потоковая (физическая) репликация передаёт поток WAL. На мастере процесс walsender отдаёт записи журнала по мере их появления, на реплике процесс walreceiver их принимает и применяет, проигрывая те же изменения страниц. Реплика это побайтовая копия кластера: те же файлы, те же LSN. Standby может быть hot standby - принимать запросы только на чтение, продолжая накатывать WAL. Применение идёт по тем же правилам redo, что и восстановление после сбоя, поэтому реплика всегда «доигрывает» журнал до позиции, которую успела получить. Расхождение между позицией мастера и реплики и есть лаг.

Что хотят услышать

Senior должен: - назвать передаваемое: поток WAL, и процессы walsender/walreceiver - сказать, что физическая реплика это бинарная копия всего кластера на уровне страниц - связать применение на реплике с механизмом redo и LSN - различить роли: hot standby принимает чтения, обычный standby только догоняет

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

  • ✗ Думать, что физическая реплика копирует таблицы выборочно - это весь кластер целиком на уровне WAL
  • ✗ Считать, что на физической реплике можно писать - она только для чтения
  • ✗ Путать поток WAL с логическими изменениями строк - физическая репликация работает страницами

Follow-up

  • ? Чем walsender отличается от walreceiver?
  • ? Почему на физической реплике нельзя выполнить INSERT?
  • ? Как реплика понимает, до какой позиции она применила журнал?

Глубина в базе знаний

  • Физическая (потоковая) репликация
  • WAL: принцип write-ahead и LSN
tags: replication, streaming, walbook: postgresql_internals-17.pdf:ch11 wal modes · codelibs.ru_mastering-postgresql-15-advanced-techniques-to-build-and-manage-scalable-reliable-and-fault-tolerant-database-applications-5-ed.pdf:replication

#sync-vs-async

intermediateчасто

Синхронная и асинхронная репликация: чем расплачиваешься за каждую?

Что отвечать

При асинхронной репликации коммит на мастере подтверждается сразу, не дожидаясь реплики. Быстро, но при внезапной потере мастера последние транзакции, не успевшие уехать на реплику, теряются. При синхронной (`synchronous_commit = on` плюс `synchronous_standby_names`) коммит ждёт, пока хотя бы одна реплика подтвердит запись WAL. Нулевая потеря данных, но цена - задержка каждого коммита на сетевой round-trip, и если синхронная реплика отвалилась, коммиты на мастере встают. Промежуточные уровни `remote_write`/`remote_apply` тонко настраивают, чего именно ждать: записи в журнал реплики или применения. Выбор - это явный компромисс между потерей данных и задержкой.

Что хотят услышать

Senior должен: - сформулировать компромисс: async теряет хвост транзакций при отказе, sync платит задержкой - назвать риск синхронной схемы: отвалившаяся синхронная реплика останавливает коммиты на мастере - знать уровни `synchronous_commit`: off, local, remote_write, on, remote_apply, и что они означают - советовать минимум две синхронные реплики или кворум, чтобы отказ одной не вешал запись

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

  • ✗ Ставить одну синхронную реплику без запаса - её отказ заморозит коммиты на мастере
  • ✗ Считать асинхронную реплику безопасной для нулевой потери - хвост транзакций при аварии пропадёт
  • ✗ Путать `synchronous_commit=off` (локальный риск потери) с асинхронной репликацией (риск на стороне реплики)

Follow-up

  • ? Что произойдёт с коммитами, если единственная синхронная реплика упадёт?
  • ? Чем `remote_write` отличается от `remote_apply`?
  • ? Сколько синхронных реплик нужно, чтобы пережить отказ одной без остановки записи?

Глубина в базе знаний

  • Физическая (потоковая) репликация
  • hot_standby_feedback и vacuum мастера
tags: replication, sync, durabilitybook: codelibs.ru_mastering-postgresql-15-advanced-techniques-to-build-and-manage-scalable-reliable-and-fault-tolerant-database-applications-5-ed.pdf:synchronous replication

#replication-lag

intermediateчасто

Что такое лаг репликации, как его измерять и откуда он берётся?

Что отвечать

Лаг - отставание реплики от мастера. Его измеряют двояко: по объёму (разница LSN между тем, что мастер записал, и тем, что реплика приняла и применила) и по времени (`replay лаг` - на сколько секунд устарели данные на реплике). Причины: узкая сеть не успевает прокачать WAL; реплика не успевает применять журнал, потому что redo однопоточный и упирается в диск или в конфликты с читающими запросами; всплеск записи на мастере. Смотрят через `pg_stat_replication` на мастере (`sent`/`write`/`flush`/ `replay` LSN) и `pg_last_wal_replay_lsn` на реплике. Большой лаг означает, что чтения с реплики отдают устаревшие данные, а failover потеряет хвост.

Что хотят услышать

Senior должен: - различать лаг по объёму (LSN) и по времени (replay) - назвать причины: сеть, скорость применения redo, конфликты с запросами на реплике, всплески записи - показать инструменты: `pg_stat_replication`, разности LSN, `pg_last_wal_replay_lsn` - связать лаг с двумя последствиями: устаревшие чтения и потеря хвоста при переключении

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

  • ✗ Мерить лаг только по времени и пропустить, что реплика приняла WAL, но не применила
  • ✗ Игнорировать, что redo на реплике по сути однопоточный и может не успевать за параллельной записью мастера
  • ✗ Читать с сильно отстающей реплики критичные данные и удивляться устаревшим результатам

Follow-up

  • ? Чем `write` LSN в `pg_stat_replication` отличается от `replay` LSN?
  • ? Почему реплика может принять WAL, но отставать по применению?
  • ? Как лаг влияет на потерю данных при failover?

Глубина в базе знаний

  • Физическая (потоковая) репликация
  • hot_standby_feedback и vacuum мастера
tags: replication, lag, monitoringbook: codelibs.ru_monitoring-postgresql.pdf:replication lag

#hot-standby-feedback

seniorиногда

Зачем нужен hot_standby_feedback и какой конфликт он решает?

Что отвечать

На hot standby выполняются длинные читающие запросы, и им нужны старые версии строк. А мастер тем временем вакуумит и может удалить версии, которые реплика ещё показывает своему запросу. Когда применение redo доходит до такого удаления, возникает конфликт: реплика либо отменяет запрос (`ERROR: canceling statement due to conflict with recovery`), либо тормозит применение. `hot_standby_feedback = on` решает это так: реплика сообщает мастеру свой горизонт, и мастер не чистит версии, нужные репликовым запросам. Цена платится на мастере: его горизонт теперь держит ещё и реплика, поэтому долгий запрос на standby тормозит очистку и копит мусор на мастере.

Что хотят услышать

Senior должен: - описать конфликт: vacuum на мастере против длинных запросов на реплике - объяснить, что делает feedback: реплика двигает горизонт мастера, и тот не удаляет нужные версии - назвать цену: горизонт мастера держится репликой, растёт раздувание от долгих запросов на standby - знать альтернативы без feedback: `max_standby_streaming_delay` как компромисс между отменой запросов и лагом

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

  • ✗ Включать `hot_standby_feedback` и забыть, что теперь долгий запрос на реплике раздувает мастер
  • ✗ Считать отмену запроса на реплике багом - это штатный конфликт с восстановлением
  • ✗ Путать роль feedback с устранением лага - он про конфликт vacuum, а не про скорость

Follow-up

  • ? Почему длинный запрос на реплике с feedback вредит мастеру?
  • ? Что делает `max_standby_streaming_delay` без feedback?
  • ? Откуда берётся ошибка отмены запроса на standby?

Глубина в базе знаний

  • hot_standby_feedback и vacuum мастера
  • Горизонт транзакции
  • Физическая (потоковая) репликация
tags: replication, standby, horizonbook: postgresql_internals-17.pdf:ch6 vacuum · codelibs.ru_mastering-postgresql-15-advanced-techniques-to-build-and-manage-scalable-reliable-and-fault-tolerant-database-applications-5-ed.pdf:hot standby

#logical-replication

intermediateчасто

Чем логическая репликация отличается от физической и когда она нужна?

Что отвечать

Физическая репликация копирует кластер целиком на уровне страниц: всё или ничего, одинаковая версия, только чтение на реплике. Логическая работает на уровне строк через publication/subscription: WAL декодируется в логические изменения (INSERT/UPDATE/DELETE конкретных таблиц) и применяется на подписчике обычными командами. Это даёт то, чего физическая не умеет: реплицировать выборочные таблицы, между разными мажорными версиями (полезно при апгрейде с минимальным простоем), в базу, где подписчик может иметь свои таблицы и принимать запись. Требует `wal_level = logical`, у таблиц нужен способ идентифицировать строку (REPLICA IDENTITY, обычно первичный ключ). DDL логически не реплицируется.

Что хотят услышать

Senior должен: - противопоставить уровни: физическая - страницы и весь кластер, логическая - строки и выбранные таблицы - назвать сценарии логической: выборочная репликация, апгрейд между мажорными версиями, агрегация в один приёмник - знать требования: `wal_level=logical`, REPLICA IDENTITY для UPDATE/DELETE - назвать ограничения: DDL не реплицируется, последовательности и большие объекты требуют внимания

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

  • ✗ Ждать, что логическая репликация перенесёт изменения схемы (DDL) - она реплицирует только данные
  • ✗ Забыть про REPLICA IDENTITY - без него UPDATE/DELETE на таблице без ключа сломают подписку
  • ✗ Путать выборочность: физическая всё-или-ничего, выбрать таблицы можно только логической

Follow-up

  • ? Почему для логической репликации UPDATE нужен REPLICA IDENTITY?
  • ? Как логическая репликация помогает апгрейду между мажорными версиями?
  • ? Что произойдёт с подпиской при `ALTER TABLE` на издателе?

Глубина в базе знаний

  • Логическая репликация (publication/subscription)
  • Уровни журнала: minimal, replica, logical
  • Физическая (потоковая) репликация
tags: replication, logical, publicationbook: postgresql_internals-17.pdf:ch11 wal modes · codelibs.ru_mastering-postgresql-15-advanced-techniques-to-build-and-manage-scalable-reliable-and-fault-tolerant-database-applications-5-ed.pdf:logical replication

#replication-slots

intermediateчасто

Что такое слот репликации и чем опасен заброшенный слот?

Что отвечать

Слот репликации - запись на мастере, которая помнит, до какой позиции WAL дочитал конкретный потребитель (реплика или логическая подписка). Пока слот существует, мастер обязан хранить WAL до этой позиции и (для логических слотов) не вычищать версии строк, нужные для декодирования. Это спасает реплику, которая на время отвалилась: вернувшись, она догонит, потому что нужный WAL сохранён. Но обратная сторона опасна: если потребитель исчез навсегда, а слот не удалили, мастер копит WAL до тех пор, пока не кончится место на диске и сервер не встанет. Заброшенный слот - классическая причина внезапно заполнившегося `pg_wal`.

Что хотят услышать

Senior должен: - определить слот как точку удержания WAL (и для логических - удержания версий строк) под конкретного потребителя - объяснить пользу: реплика переживает временный разрыв без потери позиции - назвать опасность: заброшенный слот держит WAL и забивает диск, сервер останавливается - дать практику: мониторить `pg_replication_slots`, ограничивать `max_slot_wal_keep_size`, удалять мёртвые слоты

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

  • ✗ Создать слот под реплику, удалить реплику и забыть слот - `pg_wal` будет расти до отказа
  • ✗ Не ставить `max_slot_wal_keep_size` и полагаться, что место не кончится
  • ✗ Путать слот с самим WAL: слот это лишь точка удержания, удерживает он реальные файлы журнала

Follow-up

  • ? Что произойдёт с `pg_wal`, если слот есть, а потребителя нет?
  • ? Зачем нужен `max_slot_wal_keep_size`?
  • ? Чем логический слот отличается от физического по тому, что он удерживает?

Глубина в базе знаний

  • Физическая (потоковая) репликация
  • Логическая репликация (publication/subscription)
  • WAL: принцип write-ahead и LSN
tags: replication, slots, walbook: codelibs.ru_mastering-postgresql-15-advanced-techniques-to-build-and-manage-scalable-reliable-and-fault-tolerant-database-applications-5-ed.pdf:replication slots · codelibs.ru_monitoring-postgresql.pdf:wal retention

#failover-split-brain

seniorиногда

Что такое failover и split-brain? Почему автоматическое переключение опасно?

Что отвечать

Failover - повышение реплики до мастера, когда прежний мастер отказал. Технически это `promote`: standby перестаёт быть только для чтения и начинает принимать запись. Опасность - split-brain: если старый мастер на самом деле жив (а недоступен была лишь сеть), и мы повысили реплику, в кластере оказывается два мастера, оба принимают запись, данные расходятся безвозвратно. Поэтому надёжный автоматический failover требует кворума-арбитра и механизма fencing (гарантированно отключить старый мастер - STONITH), а не просто пинга. Инструменты вроде Patroni строят это поверх распределённого консенсуса. Наивный авто-failover по таймауту пинга - прямой путь к split-brain.

Что хотят услышать

Senior должен: - определить failover как promote реплики и split-brain как двух живых мастеров с расходящимися данными - объяснить, почему пинга недостаточно: сетевой раздел неотличим от смерти узла - назвать защиту: кворум, fencing/STONITH, внешний консенсус (Patroni, etcd) - понимать компромисс: автоматика быстрее, но рискованнее; ручной failover медленнее, но контролируем

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

  • ✗ Строить авто-failover на одном таймауте пинга без кворума и fencing - получишь split-brain при сетевом разделе
  • ✗ Повышать реплику, не убедившись, что старый мастер гарантированно отключён
  • ✗ Путать promote (логическое повышение) с восстановлением данных - разошедшиеся записи failover не вернёт

Follow-up

  • ? Почему недоступность по сети нельзя приравнивать к смерти мастера?
  • ? Что такое fencing/STONITH и зачем он при failover?
  • ? Какую роль играет внешний кворум в безопасном переключении?

Глубина в базе знаний

  • Физическая (потоковая) репликация
  • Распределённые ловушки: 2PC, multi-master, CAP
tags: replication, failover, habook: codelibs.ru_mastering-postgresql-15-advanced-techniques-to-build-and-manage-scalable-reliable-and-fault-tolerant-database-applications-5-ed.pdf:high availability

#distributed-pitfalls

seniorиногда

Реплика - это бэкап? Какие подводные камни у распределённой работы с данными?

Что отвечать

Реплика - не бэкап. Она верно копирует и ошибки тоже: `DROP TABLE` или порченое приложением значение мгновенно уедет на все реплики. Бэкап нужен отдельный (базовый бэкап плюс архив WAL для PITR), чтобы можно было откатиться на момент до ошибки. Другие грабли распределённой работы: чтение с асинхронной реплики возвращает устаревшие данные (read-your- writes ломается, если записал в мастер и сразу читаешь с реплики); синхронная репликация добавляет задержку коммита; failover теряет хвост при асинхронном режиме; распределённые транзакции между узлами требуют двухфазного коммита и не бесплатны. Главное правило: репликация про доступность, бэкап про сохранность, это разные задачи.

Что хотят услышать

Senior должен: - твёрдо сказать «реплика не бэкап» и объяснить, почему: она тиражирует и ошибки тоже - назвать PITR (базовый бэкап плюс архив WAL) как настоящую защиту от логических ошибок - перечислить ловушки: устаревшие чтения с реплики, нарушение read-your- writes, потеря хвоста при async failover - развести цели: репликация это доступность, бэкап это сохранность

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

  • ✗ Считать реплику заменой бэкапу - `DROP TABLE` повторится на всех репликах за секунды
  • ✗ Читать с асинхронной реплики сразу после записи в мастер и ждать свежие данные
  • ✗ Думать, что failover в async-режиме ничего не теряет - хвост незареплицированных транзакций пропадёт

Follow-up

  • ? Почему репликация не защищает от ошибочного `DELETE` без `WHERE`?
  • ? Что даёт PITR, чего не даёт реплика?
  • ? Как сломается read-your-writes при чтении с асинхронной реплики?

Глубина в базе знаний

  • Распределённые ловушки: 2PC, multi-master, CAP
  • Backup и восстановление на точку (PITR)
  • Логическая репликация (publication/subscription)
tags: replication, backup, consistencybook: codelibs.ru_postgresql-mistakes-and-how-to-avoid-them.pdf:replication is not backup · codelibs.ru_mastering-postgresql-15-advanced-techniques-to-build-and-manage-scalable-reliable-and-fault-tolerant-database-applications-5-ed.pdf:backup and recovery
Footer
linuxlab-УчебникиЦеныО платформеКонфиденциальность и куки
Copyright © 2026 LinuxLab. Все права защищены.