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/lessons/pg-lab-38-1-streaming-replication

lesson ── postgres-labs ── ~22 мин ── 7 шагов

Запусти физический standby и измерь, как он догоняет primary

Раньше эта лаба показывала только primary-сторону на одном сервере. Теперь у тебя живая пара: primary (узел pg) и физический standby, который при старте сам снял базовую копию через pg_basebackup и встал в recovery. У тебя два пульта: вкладка client смотрит на primary, вкладка standby-cli - на standby.

Пройди связку с обеих сторон. Каждый шаг сначала предскажи вывод, потом проверь на нужном узле.

▶ интерактивный sandbox

Поднимется контейнер postgreslab/postgres-base с PostgreSQL 17 и psql. В браузере откроется терминал, база lab уже настроена. Каждый шаг проверяется автоматически. Сеть air-gapped, наружу контейнер не ходит.

запустить sandbox →

stack ── PostgreSQL 17 · psql · 1 GB RAM · air-gapped · самоуничтожается через 45 мин простоя

Шаги

  1. 01

    Убедись, что primary не в recovery

    На вкладке client (это primary) спроси, в режиме ли восстановления узел. Primary принимает запись, значит в recovery он быть не должен.

    sql
    SELECT pg_is_in_recovery();

    Предскажи: true или false вернёт primary?

    ✓ primary не в recovery - он ведущий и принимает запись.

  2. 02

    Проверь, что standby стоит в recovery

    Переключись на вкладку standby-cli. Этот узел поднялся из базовой копии и применяет журнал primary, то есть он в постоянном восстановлении.

    sql
    SELECT pg_is_in_recovery();

    Предскажи значение для standby и сравни с тем, что было на primary.

    подсказка

    standby не ведущий: он только применяет чужой журнал, запись на него закрыта.

    ✓ standby в recovery (true) - принимает и проигрывает журнал primary.

  3. 03

    Посмотри на primary, кто к нему подключён

    Вернись на вкладку client. На primary есть представление pg_stat_replication: одна строка на каждый подключённый walsender.

    sql
    SELECT application_name, state FROM pg_stat_replication;

    Предскажи: будет ли там строка, и какое state у догнавшего реплику потока - startup, catchup или streaming?

    ✓ state=streaming - standby подключён и тянет журнал в реальном времени.

  4. 04

    Проверь, что слот теперь активен

    Раньше ты заводил слот на одиноком сервере, и он висел с active=false. Здесь у слота есть реальный потребитель - standby.

    sql
    SELECT slot_name, active, restart_lsn FROM pg_replication_slots
    WHERE slot_name = 'standby_slot';

    Предскажи значение колонки active теперь, когда standby подключён.

    ✓ active=true - слот занят standby и держит WAL ровно до его позиции.

  5. 05

    Вставь строку на primary

    Всё ещё на вкладке client (primary). Вставь одну строку в таблицу repl_demo - дальше проверим, доедет ли она до standby сама.

    sql
    INSERT INTO repl_demo (id, note) VALUES (1, 'streamed');

    Предскажи: появится ли строка на primary сразу после INSERT?

    ✓ Строка на primary записана и попала в WAL.

  6. 06

    Найди ту же строку на standby

    Переключись на вкладку standby-cli. Ты НЕ вставлял сюда ничего: запись на standby закрыта. Строка может появиться только одним путём - примениться из журнала primary.

    sql
    SELECT note FROM repl_demo WHERE id = 1;

    Предскажи: окажется ли здесь строка 'streamed', которую ты вставлял на primary?

    подсказка

    Если пусто - проверка повторится; дай реплике мгновение применить журнал.

    ✓ Строка доехала. standby проиграл WAL primary и увидел вставку.

  7. 07

    Измерь, что standby догнал primary

    Остаёмся на standby-cli. У реплики две позиции журнала: сколько она приняла по сети (receive) и сколько уже применила (replay).

    sql
    SELECT pg_last_wal_receive_lsn() AS received,
           pg_last_wal_replay_lsn()  AS replayed;

    Предскажи: когда standby догнал primary, replay будет меньше received, равен ему или больше?

    ✓ replay догнал received - standby применил всё, что принял. Лага нет.

Что ты узнал

Физический standby снимается с primary через pg_basebackup и догоняет журнал потоком. На primary его видно в pg_stat_replication, а слот репликации держит WAL до позиции standby. На standby pg_last_wal_replay_lsn показывает, до какого места применён журнал; когда он сравнялся с receive_lsn, реплика догнала primary.

команды

  • SELECT pg_is_in_recovery();primary этот узел или standby
  • SELECT state FROM pg_stat_replication;кто стримит с primary и в каком состоянии
  • SELECT active FROM pg_replication_slots;держит ли слот WAL для потребителя
  • SELECT pg_last_wal_replay_lsn();до какого места standby применил журнал

концепции

  • · физическая репликация везёт весь кластер побайтово через WAL
  • · слот с активным потребителем держит WAL до позиции standby
  • · standby в recovery: read-only, pg_is_in_recovery()=true, применяет журнал потоком

← предыдущая

Составной индекс против Seq Scan плюс Sort

следующая →

Подними логическую подписку и проведи строку от источника к приёмнику

Footer
linuxlab-
Copyright © 2026 LinuxLab. Все права защищены.
Учебники
Цены
О платформе
Конфиденциальность и куки