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

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

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

У слотов репликации всегда должен быть потребитель. Если потребителя нет, то объем данных в слоте будет расти. Вы можете проверить, есть ли у слотов репликации потребитель с помощью SQL-запроса или статуса слота репликации.

Если вы больше не используете слот репликации, удалите его.

Подробнее о логической репликации в разделе Logical Replication документации PostgreSQL.

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

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

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

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

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

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

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

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

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

  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. Создайте схему данных всех реплицируемых таблиц в принимающей базе данных и выполните дамп схемы в исходной базе данных с помощью утилиты 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> — директория для дампа.
  4. Восстановите схему из дампа в принимающей базе данных с помощью утилиты 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> — директория с дампом.
  5. Создайте подписку в принимающей базе данных от имени пользователя с ролью 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> — имя слота логической репликации.
  6. В таблице принимающей базы данных появятся существующие данные.

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

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

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

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

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

  1. В панели управления перейдите в раздел Облачная платформаБазы данных.

  2. Откройте страницу кластера → вкладка Базы данных.

  3. Откройте карточку базы данных.

  4. В блоке Слоты репликации, в строке слота посмотрите статус.

    CREATINGСлот создается
    ACTIVEСлот используется — у слота есть потребитель, данные передаются в принимающую базу данных
    UNUSEDСлот не используется — у слота нет потребителя, данные не передаются в принимающую базу данных, накапливаются в слоте репликации и занимают дополнительное место на диске. Если вы больше не будете использовать слот репликации, удалите его.
    DELETINGСлот удаляется

Проверить потребителей слотов логической репликации с помощью SQL-запроса

Чтобы проверить, есть ли у слотов логической репликации потребители, отправьте SQL-запрос к представлению pg_replication_slots:

SELECT slot_name, pg_size_pretty(pg_wal_lsn_diff(pg_current_wal_lsn(),restart_lsn)) AS replicationSlotLag,active
FROM pg_replication_slots;

Пример вывода:

slot_name        | replicationslotlag | active
-----------------+--------------------+--------
myslot1 | 129 GB | f
myslot2 | 704 MB | t
myslot3 | 624 MB | t

Здесь:

  • slot_name — имя слота логической репликации;
  • replicationslotlag — размер WAL-файлов, которые не будут автоматически удаляться при контрольных точках и которые потребители слота логической репликации могут использовать;
  • active — булево значение показывает, используется ли слот логической репликации:
    • f — у слота нет потребителя;
    • t — у слота есть потребитель.

Если у вас версия PostgreSQL 13 и выше, вы можете ограничить максимальный размер хранимых WAL-файлов с помощью параметра max_slot_wal_keep_size. Учтите, что при использовании этого параметра журнал транзакций может быть удален раньше, чем потребитель прочитает изменения в слоте логической репликации.

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

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

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