Слоты логической репликации PostgreSQL
Чтобы постоянно реплицировать данные из одной базы данных в другую (например, внутри облачных баз данных Selectel или во внешнее хранилище), вы можете создать постоянные слоты.
Слоты обеспечивают отказоустойчивую логическую репликацию — данные сохранятся при масштабировании или перезагрузке СУБД.
Ограничения
Максимальное количество слотов логической репликации — 26.
Создавать и использовать слоты может только пользователь с ролью dbaas_replication
— эта роль автоматически выдается владельцу базы данных, назначить ее другим пользователям нельзя.
Создать слот логической репликации
Можно создать слот логической репликации для базы данных через API облачных баз данных или в панели управления.
- В панели управления перейдите в раздел Облачная платформа → Базы данных.
- Откройте страницу кластера → вкладка Базы данных.
- Откройте карточку базы данных.
- В блоке Слоты репликации нажмите Добавить.
- Введите имя слота или оставьте имя по умолчанию.
- Нажмите .
Настроить логическую репликацию с помощью слота
У логической репликации в PostgreSQL есть ограничения.
Создайте слот логической репликации для базы данных в исходном кластере.
Создайте публикацию на исходном кластере:
CREATE PUBLICATION <publication_name> FOR TABLE <table_name>;
Укажите:
<publication_name>
— имя публикации;<table_name>
— имя таблицы.
Опционально: если требуется, добавьте дополнительные таблицы в публикацию:
ALTER PUBLICATION <publication_name> ADD TABLE <extra_table_name>;
Укажите
<extra_table_name>
— имя таблицы.Создайте схему данных всех реплицируемых таблиц на принимающем кластере. Выполните дамп схемы на исходном кластере с помощью утилиты 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>
— директория для дампа.
Восстановите схему из дампа на принимающем кластере с помощью утилиты 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>
— директория с дампом.
Создайте подписку на принимающем кластере от имени пользователя с ролью
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>
— имя слота логической репликации.
В таблице на принимающем кластере появятся существующие данные.
Если в таблицу на исходном кластере добавятся новые данные, они автоматически реплицируются.
Чтобы остановить логическую репликацию, выключите подписку, отвяжите от нее слот и удалите подписку:
ALTER SUBSCRIPTION <subscription_name> DISABLE;
ALTER SUBSCRIPTION <subscription_name> SET (slot_name=NONE);
DROP SUBSCRIPTION <subscription_name>;