Кратко:
- Миграция данных в облако репликацией включает настройку сервера-источника, экспорт схемы БД, создание кластера Managed Service for PostgreSQL, создание публикаций и подписки, перенос PostgreSQL-sequences после репликации и отключение репликации.
- Настройте сервер-источник с помощью файла postgresql.conf и файла pg_hba.conf.
- Экспортируйте схему БД с помощью утилиты pg_dump.
- Создайте кластер Managed Service for PostgreSQL в Yandex Cloud с тем же именем БД, что и на сервере-источнике.
- Восстановите схему в созданном кластере с помощью pg_restore.
- Создайте публикации и подписки на сервере-источнике и сервере-приёмнике соответственно.
- Следите за статусом репликации на приёмнике и сервере-источнике.
- Запретите запись данных на сервере-источнике и перенесите PostgreSQL-sequences в кластер Managed Service for PostgreSQL.
- Отключите репликации и перенесите нагрузку на сервер-приёмник.
Миграция данных в облако репликацией
Предположим, вы решили перенести БД в сервис управляемых БД PostgreSQL. Для этого придётся выполнить логическую репликацию:
- Настроить сервер с источником данных.
- Экспортировать схему БД из источника.
- Создать кластер Managed Service for PostgreSQL и восстановить схему БД.
- Создать публикации и подписки.
- Перенести PostgreSQL-sequences после репликации.
- Отключить репликацию и перенести нагрузки.
Как видите, процесс довольно трудоёмкий. Разберём его по шагам.
1. Настройка сервера с источником данных
Чтобы перенести данные с помощью репликации, настройте PostgreSQL на сервере-источнике. Измените настройки SSL и WAL (Write Ahead Log) в файле
postgresql.conf
(в Ubuntu путь к нему по умолчанию — /etc/postgresql/10/main/postgresql.conf
).Для переноса данных используйте SSL: это поможет не только зашифровать данные, но и сжать их. Подробнее читайте в документации PostgreSQL: разделы SSL Support и Database Connection Control Functions.
Включите использование SSL:
SSL=ON
Измените уровень логирования для WAL, чтобы добавить в него информацию для логической репликации. В файле
postgresql.conf
найдите строку с настройкой wal_level
, раскомментируйте её при необходимости и установите значение logical
:wal_level=logical
Теперь настройте аутентификацию хостов в источнике: внесите хосты кластера в облаке в файл
pg_hba.conf
(в Debian и Ubuntu путь к нему по умолчанию — /etc/postgresql/10/main/pg_hba.conf
). Добавьте в файл строки, которые разрешат входящие соединения к БД с указанных хостов.host all all <адрес хоста> md5
host replication all <адрес хоста> md5
Если на сервере-источнике работает фаервол, разрешите входящие соединения с хостов кластера Managed Service for PostgreSQL. Например, для Ubuntu 18:
sudo ufw allow from <адрес хоста> to any port 5432
Перезагрузите сервер БД, чтобы применить настройки:
sudo systemctl restart postgresql
После перезапуска проверьте статус PostgreSQL с помощью команды:
sudo systemctl status postgresql
2. Экспорт схемы БД из источника
С помощью утилиты pg_dump создайте файл со схемой БД, которую нужно применить в кластере Managed Service for PostgreSQL.
pg_dump -h <адрес сервера СУБД> \
-U <имя пользователя> \
-p <порт> \
--schema-only \
--no-privileges \
--no-subscriptions \
-d <имя базы данных> -Fd -f /tmp/db_dump
В этой команде при экспорте исключаются все данные, которые связаны с привилегиями и ролями. Это необходимо, чтобы не возникало конфликтов с настройками БД в Yandex Cloud. Если базе нужны дополнительные пользователи, создайте их.
3. Создание кластера Managed Service for PostgreSQL и восстановление схемы БД
Если у вас ещё нет PostgreSQL-кластера в Yandex Cloud, создайте его. При создании кластера укажите то же имя БД, что и на сервере-источнике.
Восстановите схему в созданном кластере:
pg_restore -Fd -v --single-transaction -s --no-privileges \
-h <адрес приемника> \
-U <имя пользователя> \
-p 6432 \
-d <имя базы данных> /tmp/db_dump
4. Создание публикаций и подписки
Определите публикацию (группу логически реплицируемых таблиц) на сервере-источнике и подписку (описание соединения с другой базой) на сервере-приёмнике.
На сервере-источнике создайте публикацию для всех таблиц БД. Если переносите несколько баз — для каждой сделайте свою публикацию.
Чтобы создать публикации для всех таблиц, потребуются права суперпользователя. Чтобы перенести выбранные таблицы, права не нужны. Воспользуйтесь запросом:
CREATE PUBLICATION p_data_migration FOR ALL TABLES;
На хосте кластера Managed Service for PostgreSQL создайте подписку со строкой подключения к публикации. Подробности о создании подписок смотрите в документации PostgreSQL (раздел Create subscription).
CREATE SUBSCRIPTION s_data_migration CONNECTION 'host=<адрес сервера-источника> port=<порт> user=<имя пользователя> sslmode=verify-full dbname=<имя базы данных>' PUBLICATION p_data_migration;
Следите за статусом репликации через каталоги
pg_subscription_rel
. Общий статус репликации на приёмнике можно получить через pg_stat_subscription
, на источнике — через pg_stat_replication
.select * from pg_subscription_rel;
Важно следить за статусом репликации на приёмнике по полю
srsubstate
. Значение r
в поле srsubstate
говорит о том, что синхронизация завершилась и базы готовы к репликации.5. Перенос PostgreSQL-sequences после репликации
Чтобы завершить синхронизацию источника и приёмника, запретите запись данных на сервере-источнике и перенесите PostgreSQL-sequences в кластер Managed Service for PostgreSQL.
Экспортируйте PostgreSQL-sequences из источника:
pg_dump -h <адрес сервера СУБД> \
-U <имя пользователя> \
-p <порт> -d <имя базы данных> \
--data-only -t '*.*_seq' > /tmp/seq-data.sql
Обратите внимание на паттерн: если в переносимой БД есть
sequences
, которые не соответствуют паттерну *.*_seq
, то для их выгрузки укажите другой паттерн. Подробная информация о паттернах приводится в документации PostgreSQL.Восстановите
sequences
на хосте Managed Service for PostgreSQL:psql -h <адрес сервера СУБД> \
-U <имя пользователя> -p 6432 \
-d <имя базы данных> \
< /tmp/seq
6. Отключение репликации и перенос нагрузки
После того как репликация завершилась и вы перенесли
sequences
, удалите подписку на сервере-приёмнике (в кластере Managed Service for PostgreSQL):DROP SUBSCRIPTION s_data_migration;
После этого можно переносить нагрузку на сервер-приёмник.