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-39-1-logical-replication

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

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

Раньше эта лаба показывала только источник-сторону на одном сервере. Теперь у тебя два независимых кластера: publisher (узел pg) с заранее поднятым wal_level=logical и отдельный subscriber. У тебя два пульта: вкладка pub смотрит на publisher, sub - на subscriber.

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

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

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

запустить sandbox →

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

Шаги

  1. 01

    Проверь уровень журнала на источнике

    На вкладке pub (это publisher) спроси уровень журнала. По умолчанию у сервера replica, но логическому потоку нужен logical, и для этой лабы он поднят заранее.

    sql
    SHOW wal_level;

    Предскажи: какое значение вернёт источник?

    подсказка

    logical больше, чем replica, и включается заранее с рестартом сервера.

    ✓ wal_level=logical - источник готов отдавать поток изменений построчно.

  2. 02

    Создай публикацию на одну таблицу

    Всё ещё на pub. Публикация - объявленный набор таблиц, изменения которых источник готов отдавать подписчикам.

    sql
    CREATE PUBLICATION pub_demo FOR TABLE repl_demo;

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

    ✓ Публикация pub_demo создана на источнике.

  3. 03

    Посмотри состав публикации

    Какие таблицы реально попали в публикацию, видно в pg_publication_tables.

    sql
    SELECT pubname, tablename FROM pg_publication_tables WHERE pubname='pub_demo';

    Предскажи имя таблицы, которое окажется в выводе.

    ✓ В публикации одна таблица - repl_demo.

  4. 04

    Убедись, что у приёмника таблица пуста

    Переключись на вкладку sub (это subscriber, отдельный кластер). Схема repl_demo у него есть, но подписки пока нет.

    sql
    SELECT count(*) FROM repl_demo;

    Предскажи: сколько строк сейчас в repl_demo на приёмнике?

    ✓ На приёмнике пусто - база для чистого опыта: всё, что приедет, приедет по подписке.

  5. 05

    Заведи подписку на приёмнике

    Остаёмся на sub. Подписка открывает коннект к источнику и начинает тянуть изменения опубликованных таблиц. Источник доступен по имени pg, роль replicator уже заведена.

    sql
    CREATE SUBSCRIPTION sub_demo
      CONNECTION 'host=pg dbname=lab user=replicator password=replpass'
      PUBLICATION pub_demo;

    Предскажи: появится ли подписка в pg_subscription после команды?

    подсказка

    Источник пуст, поэтому начальная синхронизация скопирует ноль строк - подписка встанет быстро.

    ✓ Подписка sub_demo создана и подключилась к источнику.

  6. 06

    Вставь строку на источнике

    Вернись на вкладку pub (publisher). Вставь одну строку в опубликованную таблицу.

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

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

    ✓ Строка на источнике записана и ушла в поток подписки.

  7. 07

    Поймай строку у приёмника

    Переключись на sub. Ты ничего сюда не вставлял: строка может появиться только по подписке, применённой из потока источника.

    sql
    SELECT note FROM repl_demo WHERE id = 1;

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

    подсказка

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

    ✓ Строка доехала по логической подписке - источник отдал, приёмник применил.

  8. 08

    Убери подписку за собой

    Остаёмся на sub. Подписку надо снимать командой DROP SUBSCRIPTION: она же закроет коннект к источнику и уберёт его слот.

    sql
    DROP SUBSCRIPTION sub_demo;

    Предскажи, что вернёт count по pg_subscription после удаления.

    ✓ Подписка снята, слот на источнике освобождён. Приёмник-сторона разобрана.

Что ты узнал

Логическая репликация шлёт строки, а не байты WAL, и требует wal_level=logical на источнике. Источник объявляет PUBLICATION (набор таблиц), приёмник заводит SUBSCRIPTION и применяет изменения. Это два независимых кластера: приёмник открыт на запись. DDL и последовательности так не реплицируются.

команды

  • CREATE PUBLICATION p FOR TABLE t;объявить таблицы на источнике
  • CREATE SUBSCRIPTION s CONNECTION '...' PUBLICATION p;подписаться на приёмнике
  • SELECT * FROM pg_publication_tables;что реально попало в публикацию
  • SELECT subname, subenabled FROM pg_subscription;подписки приёмника

концепции

  • · publication - набор таблиц на источнике, subscription - подписка на приёмнике
  • · поток изменений требует wal_level=logical на источнике
  • · приёмник самостоятельный кластер, открыт на запись; DDL и sequence не едут

← предыдущая

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

следующая →

Найди медленный SQL через pg_stat_statements

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