[Документация Yandex Cloud](../../index.md) > [Yandex StoreDoc](../index.md) > [Практические руководства](index.md) > Миграция коллекций из стороннего кластера Yandex StoreDoc

# Миграция коллекций из MongoDB в Yandex StoreDoc

# Миграция коллекций из MongoDB в Yandex StoreDoc


{% note warning %}

Часть ресурсов, необходимых для прохождения практического руководства, доступны только в [регионе Россия](../../overview/concepts/region.md).

{% endnote %}


Чтобы перенести коллекции, хранящиеся в стороннем кластере MongoDB, в кластер Yandex StoreDoc, нужно непосредственно перенести данные, запретить запись в старые базы данных и переключить нагрузку на кластер в Yandex Cloud.


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

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


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

Убедитесь, что к хостам кластера-источника можно подключиться из интернета.

## Миграция данных с использованием сервиса Yandex Data Transfer {#data-transfer}

# Миграция данных с использованием сервиса Yandex Data Transfer {#data-transfer}

1. [Подготовьте кластер-источник](../../data-transfer/operations/prepare.md#source-mg).
1. [Подготовьте кластер-приемник](../../data-transfer/operations/prepare.md#target-mg).
1. [Создайте эндпоинт для источника](../../data-transfer/operations/endpoint/index.md#create) со следующими параметрами:
   
   * **Тип базы данных** — `MongoDB`.
   * **Параметры эндпоинта** → **Настройки подключения** — `Пользовательская инсталляция`.
   
       Укажите параметры подключения к кластеру-источнику.
   
   {% note info %}
   
   Так как сервис не поддерживает перенос коллекций `Time Series`, необходимо [исключить](../../data-transfer/operations/endpoint/source/mongodb.md#additional-settings) такие коллекции в настройках эндпоинта.
   
   {% endnote %}
1. [Создайте эндпоинт для приемника](../../data-transfer/operations/endpoint/index.md#create) со следующими параметрами:
   
   * **Тип базы данных** — `MongoDB`.
   * **Параметры эндпоинта** → **Настройки подключения** — `Кластер Yandex StoreDoc`.
   
       Укажите идентификатор кластера-приемника.
1. [Создайте трансфер](../../data-transfer/operations/transfer.md#create) типа _**Копирование и репликация**_, использующий созданные эндпоинты.
   
   Чтобы ускорить копирование больших коллекций (более 1 ГБ), включите [параллельное копирование](../../data-transfer/concepts/sharded.md) в настройках трансфера. Укажите два [воркера](../../data-transfer/concepts/index.md#worker) или больше. Коллекция разделится на указанное количество частей, которые будут копироваться параллельно.
   
   Чтобы параллельное копирование работало, поля `_id` во всех документах коллекции должны иметь одинаковый тип данных. Если трансфер обнаруживает неоднородность типов, то коллекция не разбивается на части и переносится в одном потоке. При необходимости удалите из коллекции документы с отличающимися типами данных перед началом трансфера.
   
   {% note info %}
   
   Если после активации трансфера в коллекцию добавится документ с отличающимся типом данных, трансфер перенесет его на стадии репликации после параллельного копирования. Однако при повторной активации трансфер не сможет разбить коллекцию на части, так как требование к одинаковому типу поля `_id` во всех документах коллекции не будет выполнено.
   
   {% endnote %}
1. [Активируйте трансфер](../../data-transfer/operations/transfer.md#activate).
1. Дождитесь перехода трансфера в статус **Реплицируется**.
1. Переведите кластер-источник в режим <q>только чтение</q> и переключите нагрузку на кластер-приемник.
1. На странице [мониторинга трансфера](../../data-transfer/operations/monitoring.md) дождитесь снижения до нуля характеристики **Maximum data transfer delay**. Это значит, что на кластер-приемник перенесены все изменения, произошедшие в кластере-источнике после завершения копирования данных.
1. [Деактивируйте](../../data-transfer/operations/transfer.md#deactivate) трансфер и дождитесь его перехода в статус **Остановлен**.

    Подробнее о статусах трансфера смотрите в разделе [Жизненный цикл трансфера](../../data-transfer/concepts/transfer-lifecycle.md#statuses).

1. [Удалите остановленный трансфер](../../data-transfer/operations/transfer.md#delete).
1. [Удалите эндпоинты](../../data-transfer/operations/endpoint/index.md#delete) для источника и приемника.

## Пример миграции коллекции {#example}

1. [Настройте кластер-источник](#source-setup).
1. [Создайте и настройте кластер-приемник](#target-setup).
1. [Настройте эндпоинты и трансфер](#prepare-endpoints-transfer).
1. [Перенесите данные](#transfer).
1. [Удалите созданные ресурсы](#clear-out).

### Настройте кластер-источник {#source-setup}
  
1. Подключитесь к хосту `mongos` кластера-источника MongoDB с помощью утилиты mongosh.
1. Создайте базу данных `db1`.
1. Создайте пользователя с правами владельца базы данных `db1` и авторизуйтесь под его именем:

    ```javascript
    use admin
    db.createUser({
      user: "user1",
      pwd: passwordPrompt(),
      roles: [
          {
              role: "dbOwner",
              db: "db1"
          }
      ]
    })

    db.auth("user1")
    ```

1. Заполните коллекцию `collection1` в базе `db1` случайными значениями. В коллекцию будет вставлено 200 000 записей:
  
    ```javascript
    use db1
    function randomName() {
      // Base 36 uses letters and digits to represent a number:
      return (Math.random()+1).toString(36).substring(2);
    }

    var day = 1000 * 60 * 60 * 24;
    function randomDate () {
      return new Date(Date.now() - (Math.floor(Math.random() * day)));
    }

    for (var i = 1; i <= 200000; ++i) {
      db.collection1.insertOne({
       name: randomName(),
       creationDate: randomDate(),
       uid: i
      });
    }
    ```

### Создайте и настройте кластер-приемник {#target-setup}

{% list tabs group=cluster %}

- Нешардированный кластер-приемник {#non-sharded}

  1. [Создайте кластер](../operations/cluster-create.md) Yandex StoreDoc любой подходящей конфигурации.
  1. [Создайте базу данных](../operations/databases.md#add-db) `db1`.
  1. [Создайте пользователя](../operations/cluster-users.md#adduser) `user_transfer` с ролью [`readWrite`](../concepts/users-and-roles.md#readWrite) на созданную базу.
  
- Шардированный кластер-приемник {#sharded}

  1. [Создайте кластер](../operations/cluster-create.md) Yandex StoreDoc любой подходящей конфигурации. В кластере должно быть не менее двух хостов.
  1. [Включите шардирование](../operations/shards.md).
  1. [Создайте базу данных](../operations/databases.md#add-db) `db1`.
  1. [Создайте пользователя](../operations/cluster-users.md#adduser) `user_transfer` с ролью [`readWrite`](../concepts/users-and-roles.md#readWrite) на созданную базу и ролью [`mdbShardingManager`](../concepts/users-and-roles.md#mdbShardingManager) на служебную базу `admin`.
  1. Следуя [инструкции](sharding.md), создайте и настройте в базе `db1` пустую шардированную коллекцию `collection1`.

{% endlist %}

### Настройте эндпоинты и трансфер {#prepare-endpoints-transfer}

{% list tabs group=cluster %}

- Нешардированный кластер-приемник {#non-sharded}

  1. [Создайте эндпоинт для кластера-источника](../../data-transfer/operations/endpoint/index.md#create):
      * **Тип базы данных** — `MongoDB`.
      * **Настройки подключения** — `Пользовательская инсталляция`.
        * **Сертификат CA** — загрузите файл сертификата, если при подключении к кластеру-источнику требуется шифрование.
        * **Список хостов** — укажите FQDN хостов кластера-источника.
        * **Порт** — укажите порт для подключения к хостам.
        * **Источник аутентификации** — `db1`.
        * **Пользователь** — `user1`.
        * **Пароль** — укажите пароль пользователя `user1`.
  1. [Создайте эндпоинт для кластера-приемника](../../data-transfer/operations/endpoint/index.md#create):
      * **Тип базы данных** — `MongoDB`.
      * **Настройки подключения** — `Кластер MDB`.
        * Укажите идентификатор кластера-приемника.
        * **Пользователь** — `user_transfer`.
        * **Пароль** — укажите пароль пользователя `user_transfer`.
        * **Политика очистки** — `Drop`.
  1. [Создайте трансфер](../../data-transfer/operations/transfer.md#create):
     * **Тип трансфера** — **Копирование и репликация**.
     * **Источник** — выберите созданный эндпоинт для кластера-источника.
     * **Приёмник** — выберите созданный эндпоинт для кластера-приемника.

- Шардированный кластер-приемник {#sharded}

  1. [Создайте эндпоинт для кластера-источника](../../data-transfer/operations/endpoint/index.md#create):
      * **Тип базы данных** — `MongoDB`.
      * **Настройки подключения** — `Пользовательская инсталляция`.
        * **Сертификат CA** — загрузите файл сертификата, если при подключении к кластеру-источнику требуется шифрование.
        * **Список хостов** — укажите FQDN хостов кластера-источника.
        * **Порт** — укажите порт для подключения к хостам.
        * **Источник аутентификации** — `db1`.
        * **Пользователь** — `user1`.
        * **Пароль** — укажите пароль пользователя `user1`.
  1. [Создайте эндпоинт для кластера-приемника](../../data-transfer/operations/endpoint/index.md#create):
      * **Тип базы данных** — `MongoDB`.
      * **Настройки подключения** — `Кластер MDB`.
         * Укажите идентификатор кластера-приемника.
         * **Пользователь** — `user_transfer`.
         * **Пароль** — укажите пароль пользователя `user_transfer`.
         * **Политика очистки** — `Не очищать` или `Truncate`.
  1. [Создайте трансфер](../../data-transfer/operations/transfer.md#create):
      * **Тип трансфера** — **Копирование и репликация**.
      * **Источник** — выберите созданный эндпоинт для кластера-источника.
      * **Приёмник** — выберите созданный эндпоинт для кластера-приемника.

{% endlist %}

### Перенесите данные {#transfer}

{% list tabs group=cluster %}

- Нешардированный кластер-приемник {#non-sharded}

  1. [Активируйте](../../data-transfer/operations/transfer.md#activate) созданный трансфер.
  1. Дождитесь перехода трансфера в статус **Реплицируется**.
  1. Переведите кластер-источник в режим <q>только чтение</q> и переключите нагрузку на кластер-приемник.
  1. На странице [мониторинга трансфера](../../data-transfer/operations/monitoring.md) дождитесь снижения до нуля характеристики **Maximum data transfer delay**. Это значит, что на кластер-приемник перенесены все изменения, произошедшие в кластере-источнике после завершения копирования данных.
  1. [Подключитесь](../operations/connect/index.md) к кластеру-приемнику.
  1. Проверьте, что коллекция `collection1` перенесена и количество документов в ней равно 200 000, как в кластере-источнике:
  
     ```javascript
     use db1
     db.collection1.countDocuments()
     ```

     ```text
     200000
     ```

- Шардированный кластер-приемник {#sharded}

  1. [Активируйте](../../data-transfer/operations/transfer.md#activate) созданный трансфер.
  1. Дождитесь перехода трансфера в статус **Реплицируется**.
  1. Переведите кластер-источник в режим <q>только чтение</q> и переключите нагрузку на кластер-приемник.
  1. На странице [мониторинга трансфера](../../data-transfer/operations/monitoring.md) дождитесь снижения до нуля характеристики **Maximum data transfer delay**. Это значит, что на кластер-приемник перенесены все изменения, произошедшие в кластере-источнике после завершения копирования данных.
  1. [Подключитесь](../operations/connect/index.md) к кластеру-приемнику.
  1. Проверьте, что коллекция `collection1` перенесена, количество документов в ней равно 200 000, как в кластере-источнике, и документы распределены по шардам:
       
      ```javascript
      use db1
      db.collection1.countDocuments()
      ```

      ```text
      200000
      ```

      ```javascript
      db.collection1.getShardDistribution()
      ```

      ```text
      Shard rs01 at rs01/<хост_1>
      {
        data: '7.05MiB',
        docs: 99752,
        chunks: 2,
        'estimated data per chunk': '3.52MiB',
        'estimated docs per chunk': 49876
      }
      ---
      Shard rs02 at rs02/<хост_2>
      {
        data: '7.08MiB',
        docs: 100248,
        chunks: 2,
        'estimated data per chunk': '3.54MiB',
        'estimated docs per chunk': 50124
      }
      ---
      ...
      ```

{% endlist %}

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

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

1. [Деактивируйте](../../data-transfer/operations/transfer.md#deactivate) трансфер и дождитесь его перехода в статус **Остановлен**.

    Подробнее о жизненном цикле трансфера читайте в [документации Yandex Data Transfer](../../data-transfer/concepts/transfer-lifecycle.md).

1. [Удалите](../../data-transfer/operations/transfer.md#delete) остановленный трансфер.
1. [Удалите эндпоинты для источника и приемника](../../data-transfer/operations/endpoint/index.md#delete).
1. [Удалите созданный кластер Yandex StoreDoc](../operations/cluster-delete.md).