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

# Миграция данных в Yandex StoreDoc

# Миграция данных в Yandex StoreDoc


{% note warning %}

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

{% endnote %}


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

Перенести данные из стороннего _кластера-источника_ в _кластер-приемник_ Yandex StoreDoc можно двумя способами:

* [Перенос данных с использованием сервиса Yandex Data Transfer](#data-transfer).

    Этот способ миграции позволяет:

    * перенести базу без остановки обслуживания пользователей;
    * мигрировать со старых версий MongoDB на более новые;
    * обойтись без создания промежуточной виртуальной машины или разрешения доступа к вашему кластеру-приемнику Yandex StoreDoc из интернета.

    Чтобы использовать этот способ, разрешите подключение к кластеру-источнику из интернета.

* [Миграция при помощи дампа базы](#dump-and-restore).

    _Дамп_  — набор файлов, который позволяет восстановить состояние базы данных. Чтобы перенести данные в кластер Yandex StoreDoc, создайте дамп базы с помощью утилиты `mongodump` и восстановите его на кластере-приемнике с помощью утилиты `mongorestore`. Чтобы обеспечить полноту дампа, перед его созданием кластер-источник следует перевести в режим <q>только чтение</q>.

    Используйте этот способ только в том случае, если перенос данных с помощью Yandex Data Transfer по каким-либо причинам невозможен.

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

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

1. [Создайте кластер-приемник](#create-cluster).
1. [Подготовьте кластер-источник и кластер-приемник](#prepare-source-target).
1. [Настройте эндпоинты и трансфер](#prepare-endpoints-transfer).
1. [Перенесите данные](#transfer).

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


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

Зарегистрируйтесь в Yandex Cloud и создайте [платежный аккаунт](../../billing/concepts/billing-account.md):
1. Перейдите в [консоль управления](https://kz.console.yandex.cloud), затем войдите в Yandex Cloud или зарегистрируйтесь.
1. На странице **[Yandex Cloud Billing](https://kz.console.yandex.cloud/billing)** убедитесь, что у вас подключен платежный аккаунт, и он находится в [статусе](../../billing/concepts/billing-account-statuses.md) `ACTIVE` или `TRIAL_ACTIVE`. Если платежного аккаунта нет, [создайте его](../../billing/quickstart/index.md) и [привяжите](../../billing/operations/pin-cloud.md) к нему облако.

Если у вас есть активный платежный аккаунт, вы можете создать или выбрать [каталог](../../resource-manager/concepts/resources-hierarchy.md#folder), в котором будет работать ваша инфраструктура, на [странице облака](https://kz.console.yandex.cloud/cloud).

[Подробнее об облаках и каталогах](../../resource-manager/concepts/resources-hierarchy.md).

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

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


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

[Создайте кластер-приемник Yandex StoreDoc](../../storedoc/operations/cluster-create.md), вычислительная мощность и размер хранилища которого соответствуют среде, в которой развернута мигрируемая база данных.

Имя базы в кластере-приемнике должно совпадать с именем базы-источника.


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

1. [Подготовьте кластер-источник](../../data-transfer/operations/prepare.md#source-mg).
1. Убедитесь, что настройки сети, в которой размещен кластер-источник, разрешают подключение к нему из интернета.
1. [Подготовьте кластер-приемник](../../data-transfer/operations/prepare.md#target-mg).


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

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 %}

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

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

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

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

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) для источника и приемника.
1. [Удалите созданный кластер Yandex StoreDoc](../../storedoc/operations/cluster-delete.md).

## Миграция при помощи дампа базы {#dump-and-restore}

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

1. [Создайте кластер-приемник](#create-cluster-dump).
1. [Создайте дамп](#dump) мигрируемой базы с помощью утилиты `mongodump`.
1. При необходимости [создайте виртуальную машину](#create-vm) в Compute Cloud, чтобы восстанавливать базу из дампа в инфраструктуре Yandex Cloud.
1. [Восстановите данные из дампа](#restore) в кластере с помощью утилиты `mongorestore`.

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


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

Зарегистрируйтесь в Yandex Cloud и создайте [платежный аккаунт](../../billing/concepts/billing-account.md):
1. Перейдите в [консоль управления](https://kz.console.yandex.cloud), затем войдите в Yandex Cloud или зарегистрируйтесь.
1. На странице **[Yandex Cloud Billing](https://kz.console.yandex.cloud/billing)** убедитесь, что у вас подключен платежный аккаунт, и он находится в [статусе](../../billing/concepts/billing-account-statuses.md) `ACTIVE` или `TRIAL_ACTIVE`. Если платежного аккаунта нет, [создайте его](../../billing/quickstart/index.md) и [привяжите](../../billing/operations/pin-cloud.md) к нему облако.

Если у вас есть активный платежный аккаунт, вы можете создать или выбрать [каталог](../../resource-manager/concepts/resources-hierarchy.md#folder), в котором будет работать ваша инфраструктура, на [странице облака](https://kz.console.yandex.cloud/cloud).

[Подробнее об облаках и каталогах](../../resource-manager/concepts/resources-hierarchy.md).

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

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


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

[Создайте кластер-приемник Yandex StoreDoc](../../storedoc/operations/cluster-create.md), вычислительная мощность и размер хранилища которого соответствуют среде, в которой развернута мигрируемая база данных.

Имя базы в кластере-приемнике должно совпадать с именем базы-источника.

### Создайте дамп {#dump}

Создать дамп базы данных следует с помощью утилиты `mongodump`.

1. Установите `mongodump` и дополнительные утилиты для работы с MongoDB. Пример для [Ubuntu 20.04 LTS](https://yandex.cloud/ru-kz/marketplace/products/yc/ubuntu-20-04-lts):

    ```bash
    wget -qO - https://www.mongodb.org/static/pgp/server-4.4.asc | sudo apt-key add -
    echo "deb [ arch=amd64 ] https://repo.mongodb.org/apt/ubuntu focal/mongodb-org/4.4 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-4.4.list
    sudo apt update
    sudo apt install mongodb-org-shell mongodb-org-tools
    ```


1. Перед созданием дампа рекомендуется переключить СУБД в режим «только чтение», чтобы не потерять данные, которые могут появиться за время создания дампа.

1. Создайте дамп базы данных:

    ```bash
    mongodump --host <адрес_сервера_СУБД> \
              --port <порт> \
              --username <имя_пользователя> \
              --password "<пароль>" \
              --db <имя_БД> \
              --out ~/db_dump
    ```

   Если вы можете использовать несколько ядер процессора для создания дампа, задайте флаг `-j` с количеством доступных ядер:

    ```bash
    mongodump --host <адрес_сервера_СУБД> \
              --port <порт> \
              --username <имя_пользователя> \
              --password "<пароль>" \
              -j <количество_ядер> \
              --db <имя_БД> \
              --out ~/db_dump
    ```

1. Архивируйте дамп:

    ```bash
    tar -cvzf db_dump.tar.gz ~/db_dump
    ```

### (Опционально) Создайте виртуальную машину для загрузки дампа {#create-vm}

Промежуточная виртуальная машина в Yandex Compute Cloud понадобится, если:

* К вашему кластеру Yandex StoreDoc нет доступа из интернета.
* Ваше оборудование или соединение с кластером в Yandex Cloud недостаточно надежны.

Чтобы подготовить виртуальную машину для восстановления дампа:

1. В консоли управления [создайте новую виртуальную машину](../../compute/operations/vm-create/create-linux-vm.md) из образа [Ubuntu 20.04 LTS](https://yandex.cloud/ru-kz/marketplace/products/yc/ubuntu-20-04-lts). Нужное количество оперативной памяти и ядер процессора зависит от объема переносимых данных и требуемой скорости переноса.


   Минимальной конфигурации (1 ядро, 2 ГБ RAM, 10 ГБ дискового пространства) должно хватить для переноса базы до 1 ГБ. Чем больше переносимая база, тем больше должно быть дискового пространства (как минимум в два раза больше, чем размер базы) и оперативной памяти.

   Виртуальная машина должна находиться в той же сети и зоне доступности, что хост-мастер кластера Yandex StoreDoc. Кроме того, виртуальной машине должен быть присвоен внешний IP-адрес, чтобы вы могли загрузить файл дампа извне Yandex Cloud.

1. Установите клиент MongoDB и дополнительные утилиты для работы с СУБД:

    ```bash
    wget -qO - https://www.mongodb.org/static/pgp/server-4.4.asc | sudo apt-key add -
    echo "deb [ arch=amd64 ] https://repo.mongodb.org/apt/ubuntu focal/mongodb-org/4.4 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-4.4.list
    sudo apt update
    sudo apt install mongodb-org-shell mongodb-org-tools
    ```

1. Перенесите дамп базы данных с вашего сервера на виртуальную машину, например с помощью утилиты `scp`:

    ```bash
    scp ~/db_dump.tar.gz <имя_пользователя_ВМ>@<публичный_адрес_ВМ>:/tmp/db_dump.tar.gz
    ```

1. Распакуйте дамп на виртуальной машине:

    ```bash
    tar -xzf /tmp/db_dump.tar.gz
    ```

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


### Восстановите данные {#restore}

Восстанавливать базу данных из дампа следует с помощью утилиты `mongorestore`.

* Если вы восстанавливаете дамп с виртуальной машины в Yandex Cloud:

    ```bash
    mongorestore --host <адрес_сервера_СУБД> \
                 --port <порт> \
                 --username <имя_пользователя> \
                 --password "<пароль>" \
                 -j <количество_потоков> \
                 --authenticationDatabase <имя_БД> \
                 --nsInclude '*.*' /tmp/db_dump
    ```

* Если вы восстанавливаете дамп с сервера вне Yandex Cloud, для `mongorestore` необходимо явно задать параметры SSL:

    ```bash
    mongorestore --host <адрес_сервера_СУБД> \
                 --port <порт> \
                 --ssl \
                 --sslCAFile <путь_к_файлу_сертификата> \
                 --username <имя_пользователя> \
                 --password "<пароль>" \
                 -j <количество_потоков> \
                 --authenticationDatabase <имя_БД> \
                 --nsInclude '*.*' ~/db_dump
    ```

* Если нужно перенести только определенные коллекции, задайте флаги `--nsInclude` и `--nsExclude` с указанием на пространства имен, которые нужно или не нужно включать для восстанавливаемого набора коллекций.


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

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

1. [Удалите кластер Yandex StoreDoc](../../storedoc/operations/cluster-delete.md).
1. Если вы создали виртуальную машину для загрузки дампа, [удалите ее](../../compute/operations/vm-control/vm-delete.md).
1. Если вы зарезервировали публичный статический IP-адрес, освободите и [удалите его](../../vpc/operations/address-delete.md).