Миграция кластера Yandex Managed Service for PostgreSQL на другую версию c помощью Data Transfer
Важно
Этот документ не применим для пользователей Yandex Cloud в регионе Казахстан. См. полный перечень поддерживаемых эндпоинтов в Data Transfer.
Вы можете перенести продуктивную нагруженную базу данных, развернутую в кластере Managed Service for PostgreSQL, в кластер со старшей версией. В этом руководстве рассматривается пример переноса с версии 13 сразу на версию 17, без последовательного переноса между несколькими версиями (13 → 14 → 15 → 16 → 17).
Чтобы перенести данные:
- Подготовьте кластер-источник.
- Подготовьте кластер-приемник.
- Подготовьте и активируйте трансферы.
- Переключитесь на работу с новым кластером.
- Проверьте перенос данных.
Если созданные ресурсы вам больше не нужны, удалите их.
Необходимые платные ресурсы
- Кластер PostgreSQL: выделенные хостам вычислительные ресурсы, объем хранилища и резервных копий (см. тарифы PostgreSQL).
- Публичные IP-адреса, если для хостов кластера включен публичный доступ (см. тарифы Virtual Private Cloud).
- Каждый трансфер: использование вычислительных ресурсов и количество переданных строк данных (см. тарифы Data Transfer).
Подготовьте кластер-источник
-
Подготовьте базу-источник к миграции в соответствии с рекомендациями.
-
Оцените нагрузку на базу данных. Если она превышает 10 000 операций на запись в секунду, запланируйте несколько трансферов:
- Определите список особо нагруженных таблиц.
- Распределите таблицы между несколькими трансферами.
Подготовьте кластер-приемник
-
Создайте кластер-приемник Managed Service for PostgreSQL:
ВручнуюС помощью TerraformСоздайте кластер-приемник Managed Service for PostgreSQL с конфигурацией, идентичной кластеру-источнику, и со следующими настройками:
- Версия кластера —
17. - Имя базы данных —
db1. - Имя пользователя —
user1.
Если вы планируете подключаться к кластеру из интернета, включите публичный доступ к хостам кластера.
-
Если у вас еще нет Terraform, установите его.
-
Получите данные для аутентификации. Вы можете добавить их в переменные окружения или указать далее в файле с настройками провайдера.
-
Настройте и инициализируйте провайдер. Чтобы не создавать конфигурационный файл с настройками провайдера вручную, скачайте его
. -
Поместите конфигурационный файл в отдельную рабочую директорию и укажите значения параметров. Если данные для аутентификации не были добавлены в переменные окружения, укажите их в конфигурационном файле.
-
В той же рабочей директории разместите файл с расширением
.tfи содержимым:resource "yandex_mdb_postgresql_cluster" "old" { } -
Запишите идентификатор кластера PostgreSQL версии 13 в переменную окружения:
export POSTGRESQL_CLUSTER_ID=<идентификатор_кластера>Идентификатор можно запросить вместе со списком кластеров в каталоге.
-
Импортируйте настройки кластера PostgreSQL версии 13 в конфигурацию Terraform:
terraform import yandex_mdb_postgresql_cluster.old ${POSTGRESQL_CLUSTER_ID} -
Получите импортированную конфигурацию:
terraform show -
Скопируйте ее из терминала и вставьте в файл с расширением
.tf. -
Расположите файл в новой директории
imported-cluster. -
Измените скопированную конфигурацию так, чтобы из нее можно было создать новый кластер:
- Укажите новое имя кластера в строке
resourceи параметреname. - В блоке
configукажите в параметреversionверсию17. - Удалите параметры
created_at,health,idиstatus. - В блоках
hostудалите параметрыfqdn,roleиpriority. - Если в блоке
disk_size_autoscalingуказано значение параметраdisk_size_limit = 0, удалите этот блок. - Если в блоке
maintenance_windowуказано значение параметраtype = "ANYTIME", удалите параметрhour. - (Опционально) Внесите дополнительные изменения, если вам нужна не идентичная, а кастомизированная копия кластера.
- Укажите новое имя кластера в строке
-
Добавьте в файл ресурс для создания пользователя
user1:resource "yandex_mdb_postgresql_user" "user1" { cluster_id = yandex_mdb_postgresql_cluster.<имя_кластера>.id name = "user1" password = "<пароль_пользователя>" }Где
<имя_кластера>— новое имя кластера, указанное в ресурсеyandex_mdb_postgresql_cluster. -
Добавьте в файл ресурс для создания базы данных:
resource "yandex_mdb_postgresql_database" "db1" { cluster_id = yandex_mdb_postgresql_cluster.<имя_кластера>.id name = "db1" owner = yandex_mdb_postgresql_user.user1.name depends_on = [yandex_mdb_postgresql_user.user1] }Где
<имя_кластера>— новое имя кластера, указанное в ресурсеyandex_mdb_postgresql_cluster. -
В директории
imported-clusterполучите данные для аутентификации. -
В этой же директории настройте и инициализируйте провайдер. Чтобы не создавать конфигурационный файл с настройками провайдера вручную, скачайте его
. -
Поместите конфигурационный файл в директорию
imported-clusterи укажите значения параметров. Если данные для аутентификации не были добавлены в переменные окружения, укажите их в конфигурационном файле. -
Проверьте корректность файлов конфигурации Terraform:
terraform validateЕсли в файлах конфигурации есть ошибки, Terraform на них укажет.
-
Создайте необходимую инфраструктуру:
-
Выполните команду для просмотра планируемых изменений:
terraform planЕсли конфигурации ресурсов описаны верно, в терминале отобразится список изменяемых ресурсов и их параметров. Это проверочный этап: ресурсы не будут изменены.
-
Если вас устраивают планируемые изменения, внесите их:
-
Выполните команду:
terraform apply -
Подтвердите изменение ресурсов.
-
Дождитесь завершения операции.
-
В указанном каталоге будут созданы все требуемые ресурсы. Проверить появление ресурсов и их настройки можно в консоли управления
. -
Ограничения по времени
Провайдер Terraform ограничивает время на выполнение операций с кластером Managed Service for PostgreSQL:
- создание, в том числе путем восстановления из резервной копии, — 30 минут;
- изменение — 60 минут;
- удаление — 15 минут.
Операции, длящиеся дольше указанного времени, прерываются.
Как изменить эти ограничения?
Добавьте к описанию кластера блок
timeouts, например:resource "yandex_mdb_postgresql_cluster" "<имя_кластера>" { ... timeouts { create = "1h30m" # Полтора часа update = "2h" # 2 часа delete = "30m" # 30 минут } } - Версия кластера —
-
Если вы используете группы безопасности в кластере, убедитесь, что они настроены правильно и допускают подключение к нему.
-
Подготовьте базу-приемник к миграции в соответствии с рекомендациями.
Подготовьте и активируйте трансферы
-
Создайте эндпоинт-источник для каждого запланированного трансфера и укажите параметры эндпоинта:
- Тип базы данных —
PostgreSQL. - Тип подключения —
Ручная настройка. - Тип инсталляции —
Кластер Managed Service for PostgreSQL. - Кластер управляемой БД —
<имя_кластера-источника>из выпадающего списка. - База данных —
<имя_базы_данных_кластера-источника>. - Пользователь —
<имя_пользователя>. - Пароль —
<пароль>. - Список включенных таблиц — для каждого эндпоинта укажите список включенных таблиц в соответствии с планом распределения по трансферам.
Убедитесь, что в блоке Перенос схемы для внешних ключей и индексов установлено значение
После переноса данных. В этом случае перенос внешних ключей и индексов будет выполняться на этапе деактивации трансферов. - Тип базы данных —
-
Создайте эндпоинт-приемник для каждого запланированного трансфера и укажите параметры эндпоинта:
- Тип базы данных —
PostgreSQL. - Тип подключения —
Ручная настройка. - Тип инсталляции —
Кластер Managed Service for PostgreSQL. - Кластер управляемой БД —
db1из выпадающего списка. - Пользователь —
user1. - Пароль —
<пароль>.
- Тип базы данных —
-
Создайте трансферы типа Копирование и репликация, использующие созданные эндпоинты.
Чтобы ускорить копирование больших таблиц (более 100 ГБ), настройте параллельное копирование для трансфера, указав нужное количество воркеров и потоков.
Таблица разделится на указанное количество частей, которые будут копироваться параллельно.
-
Откройте в папке
imported-clusterконфигурационный файл Terraform с планом инфраструктуры. -
Добавьте в файл ресурс для создания эндпоинта-источника.
resource "yandex_datatransfer_endpoint" "<имя_эндпоинта>" { name = "<имя_эндпоинта>" settings { postgres_source { connection { mdb_cluster_id = "<идентификатор_кластера-источника>" } database = "<имя_базы_данных>" user = "<имя_пользователя>" password { raw = "<пароль>" } include_tables = ["<схема>.<таблица_1>", ... , "<схема>.<таблица_N>"] object_transfer_settings { fk_constraint = "AFTER_DATA" index = "AFTER_DATA" } } } }Если вы запланировали несколько трансферов, добавьте отдельный эндпоинт для каждого из них. Для каждого эндпоинта-источника укажите в параметре
include_tablesсписок включенных таблиц в соответствии с планом распределения по трансферам.В блоке
object_transfer_settingsопределены параметры переноса схемы. ЗначениеAFTER_DATAозначает, что внешние ключи и индексы будут переноситься после переноса данных (на этапе деактивации трансферов). -
Добавьте в файл ресурс для создания эндпоинта-приемника.
resource "yandex_datatransfer_endpoint" "<имя_эндпоинта>" { name = "<имя_эндпоинта>" settings { postgres_target { connection { mdb_cluster_id = yandex_mdb_postgresql_cluster.<имя_кластера>.id } database = "db1" user = "user1" password { raw = "<пароль>" } } } }Где
<имя_кластера>— имя кластера, указанное в ресурсеyandex_mdb_postgresql_cluster.Если вы запланировали несколько трансферов, добавьте отдельный эндпоинт для каждого из них.
-
Добавьте в файл ресурс для создания трансфера, использующего созданные эндпоинты.
resource "yandex_datatransfer_transfer" "<имя_трансфера>" { name = "<имя_трансфера>" source_id = yandex_datatransfer_endpoint.<имя_эндпоинта-источника>.id target_id = yandex_datatransfer_endpoint.<имя_эндпоинта-приемника>.id type = "SNAPSHOT_AND_INCREMENT" runtime { yc_runtime { upload_shard_params { job_count = <количество_воркеров> process_count = <количество_потоков> } } } }Где:
-
source_id— ссылка на эндпоинт-источник. -
target_id— ссылка на эндпоинт-приемник. -
type— тип трансфера. ЗначениеSNAPSHOT_AND_INCREMENT— Копирование и репликация. -
runtime.yc_runtime.upload_shard_params— настройки параллельного копирования. Используются, чтобы ускорить копирование больших таблиц (более 100 ГБ).job_count— количество воркеров.process_count— количество потоков.
Если вы распределили таблицы между несколькими парами эндпоинтов, создайте отдельный трансфер для каждой из них.
Трансферы будут запущены автоматически после создания.
-
Переключитесь на работу с новым кластером
-
Дождитесь перехода трансферов в статус Реплицируется.
-
Снимите пишущую нагрузку с кластера-источника.
-
На странице мониторинга трансфера дождитесь снижения до нуля характеристики Maximum data transfer delay для каждого трансфера. Это значит, что в кластер-приемник перенесены все изменения, произошедшие в кластере-источнике после завершения копирования данных.
-
Переключите нагрузку на кластер-приемник.
-
Деактивируйте трансферы и дождитесь их перехода в статус Остановлен.
Во время деактивации выполняется создание внешних ключей и индексов. Это может занять продолжительное время. Чем больший объем занимает база данных, тем больше времени занимает деактивация.
Проверьте перенос данных
-
Подключитесь к базе данных
db1в кластере-приемнике Managed Service for PostgreSQL. -
Убедитесь, что в базе данных
db1появились таблицы, выполнив запрос:SELECT schemaname AS schema, tablename AS table_name FROM pg_tables WHERE schemaname NOT IN ('pg_catalog', 'information_schema') AND tablename NOT LIKE 'pg\_%' ORDER BY schemaname, tablename;Запрос выведет список всех несистемных таблиц.
Удалите созданные ресурсы
Некоторые ресурсы платные. Удалите ресурсы, которые вы больше не будете использовать, чтобы не платить за них:
-
В терминале перейдите в директорию с планом инфраструктуры.
Важно
Убедитесь, что в директории нет Terraform-манифестов с ресурсами, которые вы хотите сохранить. Terraform удаляет все ресурсы, которые были созданы с помощью манифестов в текущей директории.
-
Удалите ресурсы:
-
Выполните команду:
terraform destroy -
Подтвердите удаление ресурсов и дождитесь завершения операции.
Все ресурсы, которые были описаны в Terraform-манифестах, будут удалены.
-