Создание логической реплики Amazon RDS для PostgreSQL в Managed Service for PostgreSQL
Перенести базу данных из кластера-источника Amazon RDS для PostgreSQL в кластер-приемник Managed Service for PostgreSQL можно с помощью логической репликации.
Логическая репликация
Используйте логическую репликацию в том случае, если перенос данных с помощью Yandex Data Transfer по каким-либо причинам невозможен.
Чтобы перенести базу данных из кластера-источника Amazon RDS для PostgreSQL в кластер-приемник Managed Service for PostgreSQL:
- Настройте Amazon RDS.
- Настройте кластер-приемник и создайте подписку.
- Перенесите последовательности.
- Удалите подписку и переключите нагрузку на кластер-приемник.
Особенности использования логической репликации
-
Изменения схемы базы данных и DDL не реплицируются.
В первую очередь применяйте новые изменения схемы на стороне подписчика (subscription)
, а потом — на стороне публикации (publication) . -
Последовательности (
SEQUENCES
) не реплицируются.В составе таблицы реплицируются данные в столбцах
serial
или столбцах идентификации, которые генерируются последовательностями. Но сама последовательность на подписчике будет сохранять стартовое значение.В случае переключения на базу подписчика, необходимо обновить последовательность до последнего значения:
ALTER SEQUENCE serial RESTART WITH <новое_значение>;
-
По умолчанию при создании подписки происходит полное копирование данных из исходных таблиц.
Для ускорения копирования создайте только первичный ключ (
PRIMARY KEY
), а после его завершения создайте все остальные индексы. -
Если в таблице отсутствует первичный ключ, во время репликации появятся ошибки:
ERROR: 55000: cannot update table "<имя_таблицы>" because it does not have a replica identity and publishes updates HINT: To enable updating the table, set REPLICA IDENTITY using ALTER TABLE.
Для работы репликации
UPDATE
иDELETE
в таблицах без первичного ключа необходимо изменитьREPLICA IDENTITY
:ALTER TABLE <имя_таблицы> REPLICA IDENTITY FULL;
-
В PostgreSQL версии 10 команда
TRUNCATE
не реплицируется.Вместо этого можно использовать
DELETE
. -
Внешние таблицы не реплицируются.
-
Если потребуется пересоздать подписку, то для предотвращения ошибок ограничения первичного ключа очистите таблицы в кластере-приемнике.
-
Ошибки, связанные с работой логической репликации, смотрите в логах Managed Service for PostgreSQL.
Перед началом работы
Создайте необходимые ресурсы:
Создайте кластер Managed Service for PostgreSQL с публичным доступом к хостам. При этом:
- Версия PostgreSQL должна быть не ниже, чем в кластере-источнике. Миграция с понижением версии PostgreSQL невозможна.
- Имя базы данных должно быть такое же, как и в кластере-источнике.
- Включите те же расширения PostgreSQL, что и в базе-источнике.
-
Если у вас еще нет Terraform, установите его.
-
Получите данные для аутентификации. Вы можете добавить их в переменные окружения или указать далее в файле с настройками провайдера.
-
Настройте и инициализируйте провайдер. Чтобы не создавать конфигурационный файл с настройками провайдера вручную, скачайте его
. -
Поместите конфигурационный файл в отдельную рабочую директорию и укажите значения параметров. Если данные для аутентификации не были добавлены в переменные окружения, укажите их в конфигурационном файле.
-
Скачайте в ту же рабочую директорию файл конфигурации logical-replica-amazon-rds-to-postgresql.tf
.В этом файле описаны:
- сеть;
- подсеть;
- группа безопасности и правило, разрешающее подключение к кластеру;
- кластер Managed Service for PostgreSQL с публичным доступом из интернета.
-
Укажите параметры инфраструктуры в файле конфигурации
logical-replica-amazon-rds-to-postgresql.tf
в блокеlocals
:pg_version
— версия PostgreSQL. Она должна быть не ниже, чем в Amazon RDS.db_name
— имя базы данных в кластере-приемнике. Должно совпадать с именем базы-источника.username
иpassword
— имя и пароль пользователя-владельца базы данных.- Имена и версии расширений PostgreSQL, используемых в Amazon RDS. Для этого раскомментируйте и размножьте блок
extension
.
-
Проверьте корректность файлов конфигурации Terraform с помощью команды:
terraform validate
Если в файлах конфигурации есть ошибки, Terraform на них укажет.
-
Создайте необходимую инфраструктуру:
-
Выполните команду для просмотра планируемых изменений:
terraform plan
Если конфигурации ресурсов описаны верно, в терминале отобразится список изменяемых ресурсов и их параметров. Это проверочный этап: ресурсы не будут изменены.
-
Если вас устраивают планируемые изменения, внесите их:
-
Выполните команду:
terraform apply
-
Подтвердите изменение ресурсов.
-
Дождитесь завершения операции.
-
В указанном каталоге будут созданы все требуемые ресурсы. Проверить появление ресурсов и их настройки можно в консоли управления
. -
Настройте Amazon RDS
Важно
Экземпляр БД должен иметь публичный доступ — Public accessibility = yes
.
-
Настройте логическую репликацию.
-
Установите параметр в
parameter group
вашего экземпляра БД:rds.logical_replication = 1
-
Перезапустите кластер для применения изменений.
-
-
Создайте отдельного пользователя с ролью
rds_replication
. Для этого выполните от имени пользователя с рольюrds_superuser
:CREATE ROLE <имя_пользователя> WITH LOGIN PASSWORD <пароль>; GRANT rds_replication TO <имя_пользователя>;
-
Предоставьте привилегию
SELECT
на все таблицы, участвующие в репликации:GRANT SELECT ON <таблица_1>, <таблица_2>, ..., <таблица_n> TO <имя_пользователя>;
-
Создайте публикацию:
CREATE PUBLICATION pub FOR TABLE <таблица_1>, <таблица_2>, ..., <таблица_n>;
Примечание
Не рекомендуется использовать публикации
FOR ALL TABLES
из-за невозможности отредактировать список таблиц в будущем. -
Добавьте правило для входящего трафика в VPC security groups
. Например:protocol: tcp, port: 5432, source: 84.201.175.90/32
Где
84.201.175.90
— публичный IP-адрес.
Настройте кластер-приемник и создайте подписку
В кластерах Managed Service for PostgreSQL подписки может использовать владелец базы данных (пользователь, созданный одновременно с кластером) и пользователи с ролью mdb_admin
для этого кластера.
-
(Опционально) Назначьте пользователю кластера Managed Service for PostgreSQL роль
mdb_admin
. -
Создайте подписку со строкой подключения к кластеру-источнику:
CREATE SUBSCRIPTION s_data_migration CONNECTION 'host=<адрес_кластера-источника> port=<порт> user=<имя_пользователя> sslmode=prefer dbname=<имя_БД>' PUBLICATION pub;
Подробнее о создании подписок см. в документации PostgreSQL
. -
Чтобы получить статус репликации, обратитесь к каталогам
pg_subscription_rel
.SELECT * FROM pg_subscription_rel;
Значение
r
в полеsrsubstate
означает, что репликация завершилась.
Перенесите последовательности
Чтобы завершить синхронизацию кластера-источника и кластера-приемника:
-
Переведите кластер-источник в режим
только чтение
. -
Создайте дамп с последовательностями:
pg_dump --host=<адрес_кластера-источника> \ --username=<имя_пользователя> \ --port=<порт> \ --dbname=<имя_БД> \ --data-only \ --table='*.*_seq' > /tmp/seq-data.sql
Обратите внимание на используемый паттерн
*.*_seq
. Если в переносимой базе есть не соответствующие ему последовательности, то для их выгрузки укажите другой паттерн.Подробнее о паттернах см. в документации PostgreSQL
. -
Восстановите дамп с последовательностями в кластере-приемнике:
psql \ --host=<FQDN_хоста-мастера_кластера-приемника> \ --username=<имя_пользователя> \ --port=6432 \ --dbname=<имя_БД> < /tmp/seq-data.sql
Удалите подписку и переключите нагрузку на кластер-приемник
-
Удалите подписку в кластере-приемнике:
DROP SUBSCRIPTION s_data_migration;
-
Перенесите нагрузку на кластер-приемник.