Перейти к основному содержимому
Слоты логической репликации PostgreSQL
Последнее изменение:

Слоты логической репликации PostgreSQL

Чтобы постоянно реплицировать данные из одной базы данных в другую (например, внутри облачных баз данных Selectel или во внешнее хранилище), вы можете создать постоянные слоты.

Слоты обеспечивают отказоустойчивую логическую репликацию — данные сохранятся при масштабировании или перезагрузке СУБД.

Ограничения

Максимальное количество слотов логической репликации — 26.

Создавать и использовать слоты может только пользователь с ролью dbaas_replication — эта роль автоматически выдается владельцу базы данных, назначить ее другим пользователям нельзя.

Создать слот логической репликации

Можно создать слот логической репликации для базы данных через API облачных баз данных или в панели управления.

  1. В панели управления перейдите в раздел Облачная платформаБазы данных.
  2. Откройте страницу кластера → вкладка Базы данных.
  3. Откройте карточку базы данных.
  4. В блоке Слоты репликации нажмите Добавить.
  5. Введите имя слота или оставьте имя по умолчанию.
  6. Нажмите .

Настроить логическую репликацию с помощью слота

У логической репликации в PostgreSQL есть ограничения.

  1. Создайте публикацию на исходном кластере:

    CREATE PUBLICATION <publication_name> FOR TABLE <table_name>;

    Укажите:

    • <publication_name> — имя публикации;
    • <table_name> — имя таблицы.
  2. Опционально: если требуется, добавьте дополнительные таблицы в публикацию:

    ALTER PUBLICATION <publication_name> ADD TABLE <extra_table_name>;

    Укажите <extra_table_name> — имя таблицы.

  3. Создайте слот логической репликации для базы данных в исходном кластере.

  4. Создайте схему данных всех реплицируемых таблиц на принимающем кластере. Выполните дамп схемы на исходном кластере с помощью утилиты pg_dump:

    pg_dump \
    "host=<host> \
    port=<port> \
    dbname=<database_name> \
    user=<user_name>" \
    --schema-only \
    --no-privileges \
    --no-subscriptions \
    --no-publications \
    -Fd -f <dump_directory>

    Укажите:

    • <host> — IP-адрес или DNS-имя хоста исходного кластера;
    • <port> — порт;
    • <database_name> — имя базы данных;
    • <user_name> — имя владельца базы данных;
    • <dump_directory> — директория для дампа.
  5. Восстановите схему из дампа на принимающем кластере с помощью утилиты pg_restore:

    pg_restore \
    -Fd -v \
    --single-transaction -s \
    --no-privileges -O \
    -h <host> \
    -U <user_name> \
    -p <port> \
    -d <database_name> \
    <dump_directory>

    Укажите:

    • <host> — IP-адрес или DNS-имя мастер-хоста принимающего кластера;
    • <user_name> — имя пользователя базы данных;
    • <database_name> — имя базы данных;
    • <port> — порт;
    • <dump_directory> — директория с дампом.
  6. Создайте подписку на принимающем кластере от имени пользователя с ролью dbaas_replication:

    CREATE SUBSCRIPTION <subscription_name> CONNECTION
    'host=<host>
    port=<port>
    dbname=<database_name>
    user=<user_name>
    password=<password>
    sslmode=verify-ca'
    PUBLICATION <publication_name>
    WITH (copy_data=true, create_slot=false, enabled=true, slot_name=<logical_slot_name>);

    Укажите:

    • <subscription_name> — имя подписки;
    • <host> — IP-адрес или DNS-имя мастер-хоста исходного кластера;
    • <port> — порт исходного кластера;
    • <user_name> — имя пользователя базы данных;
    • <password> — пароль пользователя;
    • <database_name> — имя базы данных;
    • <logical_slot_name> — имя слота логической репликации.
  7. В таблице на принимающем кластере появятся существующие данные.

    Если в таблицу на исходном кластере добавятся новые данные, они автоматически реплицируются.

  8. Чтобы остановить логическую репликацию, выключите подписку, отвяжите от нее слот и удалите подписку:

    ALTER SUBSCRIPTION <subscription_name> DISABLE;
    ALTER SUBSCRIPTION <subscription_name> SET (slot_name=NONE);
    DROP SUBSCRIPTION <subscription_name>;