[Документация Yandex Cloud](../../index.md) > [Yandex Data Transfer](../index.md) > [Практические руководства](index.md) > Миграция > Миграция кластера Yandex StoreDoc (Managed Service for MongoDB) с версии 4.4 на 6.0

# Миграция кластера Yandex StoreDoc (Managed Service for MongoDB) с версии 4.4 на 6.0

# Миграция кластера Yandex StoreDoc (Managed Service for MongoDB) с версии 4.4 на 6.0 c помощью Yandex Data Transfer

{% note warning %}

Этот документ не применим для пользователей Yandex Cloud в [регионе Казахстан](../../overview/concepts/region.md). Смотрите полный перечень [поддерживаемых эндпоинтов](../transfer-matrix.md) в Data Transfer.

{% endnote %}

Вы можете перенести продуктивную нагруженную шардированную базу данных, развернутую в кластере Yandex StoreDoc версии 4.4, на версию 6.0.

Чтобы перенести данные:

1. [Подготовьте кластер-источник](#prepare-source).
1. [Подготовьте кластер-приемник](#prepare-target).
1. [Подготовьте трансферы](#prepare-transfer).
1. [Активируйте трансферы](#activate-transfer).
1. [Проверьте работоспособность трансфера](#verify-transfer).

Если созданные ресурсы вам больше не нужны, [удалите их](#clear-out).


## Необходимые платные ресурсы {#paid-resources}

* Кластер Yandex StoreDoc: выделенные хостам вычислительные ресурсы, объем хранилища и резервных копий ([тарифы Yandex StoreDoc](../../storedoc/pricing.md)).
* Публичные IP-адреса, если для хостов кластера включен публичный доступ ([тарифы Virtual Private Cloud](../../vpc/pricing.md)).
* Каждый трансфер: использование вычислительных ресурсов и количество переданных строк данных ([тарифы Data Transfer](../pricing.md)).


## Перед началом работы {#before-you-begin}

Создайте кластер-приемник Yandex StoreDoc версии 6.0, идентичный кластеру версии 4.4.

{% list tabs group=instructions %}

- Вручную {#manual}

    1. [Создайте кластер-приемник Yandex StoreDoc (Managed Service for MongoDB)](../../storedoc/operations/cluster-create.md) с конфигурацией, идентичной кластеру-источнику, и со следующими настройками:

        * Версия кластера — `6.0`.
        * Имя базы данных — `db1`.
        * Имя пользователя — `user1`.
        * Публичный доступ к хостам кластера.

        {% note info %}
        
        Публичный доступ к хостам кластера нужен, если вы планируете подключаться к кластеру через интернет. Этот вариант подключения более простой, и его рекомендуется использовать для прохождения руководства. К хостам без публичного доступа тоже можно подключиться, но только с виртуальных машин Yandex Cloud, расположенных в той же облачной сети, что и кластер.
        
        {% endnote %}

    
    1. Если вы используете группы безопасности в кластере, убедитесь, что они [настроены правильно](../../storedoc/operations/connect/index.md#configuring-security-groups) и допускают подключение к нему.


    1. [Выдайте роль](../../storedoc/operations/cluster-users.md#updateuser) `readWrite` на базу `db1` пользователю `user1`.

    1. [Включите шардирование кластера](../../storedoc/operations/shards.md#enable) и [добавьте](../../storedoc/operations/shards.md#add-shard) нужное количество шардов.

- С помощью Terraform {#tf}

    1. Если у вас еще нет Terraform, [установите его](../../tutorials/infrastructure-management/terraform-quickstart.md#install-terraform).
    1. [Получите данные для аутентификации](../../tutorials/infrastructure-management/terraform-quickstart.md#get-credentials). Вы можете добавить их в переменные окружения или указать далее в файле с настройками провайдера.
    1. [Настройте и инициализируйте провайдер](../../tutorials/infrastructure-management/terraform-quickstart.md#configure-provider). Чтобы не создавать конфигурационный файл с настройками провайдера вручную, [скачайте его](https://github.com/yandex-cloud-examples/yc-terraform-provider-settings/blob/main/provider.tf).
    1. Поместите конфигурационный файл в отдельную рабочую директорию и [укажите значения параметров](../../tutorials/infrastructure-management/terraform-quickstart.md#configure-provider). Если данные для аутентификации не были добавлены в переменные окружения, укажите их в конфигурационном файле.

    1. В той же рабочей директории разместите файл с расширением `.tf` и содержимым:

        ```hcl
        resource "yandex_mdb_mongodb_cluster" "old" { }
        ```

    1. Запишите идентификатор кластера Yandex StoreDoc версии 4.4 в переменную окружения:

        ```bash
        export MONGODB_CLUSTER_ID=<идентификатор_кластера>
        ```

        Идентификатор можно запросить вместе со [списком кластеров в каталоге](../../storedoc/operations/cluster-list.md#list-clusters).

    1. Импортируйте настройки кластера Yandex StoreDoc версии 4.4 в конфигурацию Terraform:

        ```bash
        terraform import yandex_mdb_mongodb_cluster.old ${MONGODB_CLUSTER_ID}
        ```

    1. Получите импортированную конфигурацию:

        ```bash
        terraform show
        ```

    1. Скопируйте ее из терминала и вставьте в файл с расширением `.tf`.
    1. Расположите файл в новой директории `imported-cluster`.
    1. Измените скопированную конфигурацию так, чтобы из нее можно было создать новый кластер:

        * Укажите новое имя кластера в строке `resource` и параметре `name`.
        * Укажите в параметре `version` версию `6.0`.
        * Удалите параметры `created_at`, `health`, `id`, `sharded` и `status`.
        * В блоках `host` удалите параметры `health` и `name`.
        * Если в блоке `maintenance_window` указано значение параметра `type = "ANYTIME"`, удалите параметр `hour`.
        * Если есть блоки `user`, удалите их. Пользователи БД добавляются с помощью отдельного ресурса `yandex_mdb_mongodb_user`.
        * Если есть блоки `database`, удалите их. Базы данных добавляются с помощью отдельного ресурса `yandex_mdb_mongodb_database`.
        * (Опционально) Внесите дополнительные изменения, если вам нужна не идентичная, а кастомизированная копия кластера.

    1. Добавьте в файл ресурс для создания базы данных:

        ```hcl
        resource "yandex_mdb_mongodb_database" "db1" {
          cluster_id = yandex_mdb_mongodb_cluster.<имя_кластера>.id
          name       = "db1"
        }
        ```

        Где `<имя_кластера>` — новое имя кластера, указанное в ресурсе `yandex_mdb_mongodb_cluster`.

    1. Добавьте в файл ресурс для создания пользователя `user1`:

        ```hcl
        resource "yandex_mdb_mongodb_user" "user1" {
          cluster_id = yandex_mdb_mongodb_cluster.<имя_кластера>.id
          name       = "user1"
          password   = "<пароль_пользователя>"
          permission {
            database_name = "db1"
            roles         = ["readWrite"]
          }
          depends_on = [
            yandex_mdb_mongodb_database.db1
          ]
        }
        ```

        Где `<имя_кластера>` — новое имя кластера, указанное в ресурсе `yandex_mdb_mongodb_cluster`.

    1. В директории `imported-cluster` [получите данные для аутентификации](../../tutorials/infrastructure-management/terraform-quickstart.md#get-credentials).

    1. В этой же директории [настройте и инициализируйте провайдер](../../tutorials/infrastructure-management/terraform-quickstart.md#configure-provider). Чтобы не создавать конфигурационный файл с настройками провайдера вручную, [скачайте его](https://github.com/yandex-cloud-examples/yc-terraform-provider-settings/blob/main/provider.tf).

    1. Поместите конфигурационный файл в директорию `imported-cluster` и [укажите значения параметров](../../tutorials/infrastructure-management/terraform-quickstart.md#configure-provider). Если данные для аутентификации не были добавлены в переменные окружения, укажите их в конфигурационном файле.

    1. Проверьте корректность файлов конфигурации Terraform:

        ```bash
        terraform validate
        ```

        Если в файлах конфигурации есть ошибки, Terraform на них укажет.

    1. Создайте необходимую инфраструктуру:

        1. Выполните команду для просмотра планируемых изменений:
        
           ```bash
           terraform plan
           ```
        
           Если конфигурации ресурсов описаны верно, в терминале отобразится список изменяемых ресурсов и их параметров. Это проверочный этап: ресурсы не будут изменены.
        
        1. Если вас устраивают планируемые изменения, внесите их:
           1. Выполните команду:
        
              ```bash
              terraform apply
              ```
        
           1. Подтвердите изменение ресурсов.
           1. Дождитесь завершения операции.

        В указанном каталоге будут созданы все требуемые ресурсы. Проверить появление ресурсов и их настройки можно в [консоли управления](https://kz.console.yandex.cloud).

    {% note warning "Ограничения по времени" %}
    
    Провайдер Terraform ограничивает время на выполнение операций с кластером Yandex StoreDoc:
    
    * создание, в т. ч. путем восстановления из резервной копии, — 30 минут;
    * изменение — 60 минут.
    
    Операции, длящиеся дольше указанного времени, прерываются.
    
    {% cut "Как изменить эти ограничения?" %}
    
    Добавьте к описанию кластера блок `timeouts`, например:
    
    ```hcl
    resource "yandex_mdb_mongodb_cluster" "<имя_кластера>" {
      ...
      timeouts {
        create = "1h30m" # Полтора часа
        update = "2h"    # 2 часа
      }
    }
    ```
    
    {% endcut %}
    
    {% endnote %}

{% endlist %}

## Подготовьте кластер-источник {#prepare-source}

1. [Создайте пользователя](../../storedoc/operations/cluster-users.md#adduser) с ролью `readWrite` на базу данных в источнике, которая будет реплицироваться.

1. Удалите из базы неиспользуемые коллекции.

1. Отключите в коллекциях признак уникальности индексов. Он будет включен после переноса данных.

1. Оцените нагрузку на базу данных. Если она превышает 10 000 операций на запись в секунду, запланируйте несколько трансферов:

    1. Определите список особо нагруженных коллекций.
    1. Распределите коллекции между несколькими трансферами.

1. Задайте размер хранения oplog с запасом 15–20 % от размера диска кластера. Это позволит Data Transfer считывать изменения из кластера-источника на протяжении всего процесса копирования данных.


## Подготовьте кластер-приемник {#prepare-target}

Если в базе-источнике есть шардированные коллекции, [подготовьте базу-приемник](../operations/prepare.md#target-mg). Для индексов не указывайте уникальность.

## Подготовьте трансферы {#prepare-transfer}

1. [Создайте эндпоинт-источник](../operations/endpoint/index.md#create) для каждого запланированного трансфера и укажите параметры эндпоинта:

    * **Тип базы данных** — `MongoDB`.

    * **Тип подключения** — `Кластер Yandex StoreDoc`.

    * **Кластер Yandex StoreDoc** — `<имя_кластера-источника_Yandex_StoreDoc>` из выпадающего списка.

    * **Источник аутентификации** — `<имя_базы_данных_кластера-источника>`.

    * **Пользователь** — `<имя_пользователя>`.

    * **Пароль** — `<пароль>`.

    * **Список включённых коллекций** — для каждого эндпоинта укажите список включенных коллекций в соответствии с планом распределения по трансферам.

    * **Список исключённых коллекций** — укажите коллекции `Time Series`, если они существуют в базе данных. Data Transfer не поддерживает перенос таких коллекций.

1. [Создайте эндпоинт-приемник](../operations/endpoint/index.md#create) для каждого запланированного трансфера и укажите параметры эндпоинта:

    * **Тип базы данных** — `MongoDB`.

    * **Тип подключения** — `Кластер Yandex StoreDoc`.

    * **Кластер Yandex StoreDoc** — `<имя_кластера-приемника_Yandex_StoreDoc>` из выпадающего списка.

    * **Источник аутентификации** — `db1`.

    * **Пользователь** — `user1`.

    * **Пароль** — `<пароль>`.

    * **База данных** — `db1`.

    Если в базе-приемнике созданы шардированные коллекции, выберите политику очистки `Не очищать` или `TRUNCATE`.

    Выбор политики `DROP` приведет к тому, что при активации трансфера сервис удалит из базы-приемника все данные, в т. ч. шардированные коллекции, и создаст вместо них новые, нешардированные.

1. [Создайте трансферы](../operations/transfer.md#create) типа **_Копирование и репликация_**, использующие созданные эндпоинты.

    Чтобы ускорить копирование больших коллекций (более 1 ГБ), включите [параллельное копирование](../concepts/sharded.md) в настройках трансфера:

    * **Количество воркеров** — `5` или более.
    * **Количество потоков** — `8` или более.

    Коллекция разделится на указанное количество частей, которые будут копироваться параллельно.

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

    {% note info %}

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

    {% endnote %}

## Активируйте трансферы {#activate-transfer}

1. [Активируйте трансферы](../operations/transfer.md#activate).
1. Дождитесь перехода трансферов в статус **Реплицируется**.
1. Переведите кластер-источник в режим «только чтение».
1. Если в базе-источнике вы отключали уникальные индексы, включите их в базе-приемнике.
1. Переключите нагрузку на кластер-приемник.
1. На странице [мониторинга трансфера](../operations/monitoring.md) дождитесь снижения до нуля характеристики **Maximum data transfer delay** для каждого трансфера. Это значит, что в кластер-приемник перенесены все изменения, произошедшие в кластере-источнике после завершения копирования данных.
1. [Деактивируйте](../operations/transfer.md#deactivate) трансферы и дождитесь их перехода в статус **Остановлен**.

## Проверьте работоспособность трансфера {#verify-transfer}

1. [Подключитесь к базе данных](../../storedoc/operations/connect/index.md) `db1` в кластере-приемнике Yandex StoreDoc.

1. Убедитесь, что в базе данных `db1` появились коллекции с данными:

    ```javascript
    show collections
    db.<имя_коллекции>.find()
    ```

## Удалите созданные ресурсы {#clear-out}

Чтобы снизить потребление ресурсов, которые вам не нужны, удалите их:

1. [Удалите трансфер](../operations/transfer.md#delete).
1. [Удалите эндпоинты](../operations/endpoint/index.md#delete).
1. Кластер Yandex StoreDoc версии `6.0` удалите в зависимости от способа его создания:

   {% list tabs group=instructions %}

   - Вручную {#manual}

       Удалите [кластер Yandex StoreDoc](../../storedoc/operations/cluster-delete.md).

   - С помощью Terraform {#tf}

       1. В терминале перейдите в директорию с планом инфраструктуры.
       
           {% note warning %}
       
           Убедитесь, что в директории нет Terraform-манифестов с ресурсами, которые вы хотите сохранить. Terraform удаляет все ресурсы, которые были созданы с помощью манифестов в текущей директории.
       
           {% endnote %}
       
       1. Удалите ресурсы:
       
           1. Выполните команду:
       
               ```bash
               terraform destroy
               ```
       
           1. Подтвердите удаление ресурсов и дождитесь завершения операции.
       
           Все ресурсы, которые были описаны в Terraform-манифестах, будут удалены.

   {% endlist %}