Миграция коллекций из MongoDB в Managed Service for MongoDB
Чтобы перенести коллекции, хранящиеся в стороннем кластере MongoDB, в кластер Managed Service for MongoDB, нужно непосредственно перенести данные, запретить запись в старые базы данных и переключить нагрузку на кластер в Yandex Cloud.
Перед началом работы
Убедитесь, что к хостам кластера-источника можно подключиться из интернета.
Миграция данных с использованием сервиса Yandex Data Transfer
-
Создайте эндпоинт для источника со следующими параметрами:
-
Тип базы данных —
MongoDB
. -
Параметры эндпоинта → Настройки подключения —
Пользовательская инсталляция
.Укажите параметры подключения к кластеру-источнику.
Примечание
Так как сервис не поддерживает перенос коллекций Time Series
, необходимо исключить такие коллекции в настройках эндпоинта. -
-
Создайте эндпоинт для приемника со следующими параметрами:
-
Тип базы данных —
MongoDB
. -
Параметры эндпоинта → Настройки подключения —
Кластер Managed Service for MongoDB
.Укажите идентификатор кластера-приемника.
-
-
Создайте трансфер типа Копирование и репликация, использующий созданные эндпоинты.
Чтобы ускорить копирование больших коллекций (более 1 ГБ), включите параллельное копирование в настройках трансфера. Укажите два воркера или больше. Коллекция разделится на указанное количество частей, которые будут копироваться параллельно.
Чтобы параллельное копирование работало, тип данных
поля_id
у всех документов коллекции должен быть одинаковым. Если трансфер обнаруживает неоднородность типов, то коллекция не разбивается на части и переносится в одном потоке. При необходимости перед началом трансфера удалите из коллекции документы с отличающимися типами данных.Примечание
Если после активации трансфера в коллекцию добавится документ с отличающимся типом данных, трансфер перенесет его на стадии репликации, после параллельного копирования. Но при повторной активации трансфер не сможет разбить коллекцию на части, так как требование к типу поля
_id
во всех документах коллекции не будет выполнено. -
Дождитесь перехода трансфера в статус Реплицируется.
-
Переведите кластер-источник в режим
только чтение
и переключите нагрузку на кластер-приемник. -
На странице мониторинга трансфера дождитесь снижения до нуля характеристики Maximum data transfer delay. Это значит, что на кластер-приемник перенесены все изменения, произошедшие в кластере-источнике после завершения копирования данных.
-
Деактивируйте трансфер и дождитесь его перехода в статус Остановлен.
Подробнее о статусах трансфера см. в разделе Жизненный цикл трансфера.
-
Удалите эндпоинты для источника и приемника.
Пример миграции коллекции
- Настройте кластер-источник.
- Создайте и настройте кластер-приемник.
- Настройте эндпоинты и трансфер.
- Перенесите данные.
- Удалите созданные ресурсы.
Настройте кластер-источник
-
Подключитесь к хосту
mongos
кластера-источника MongoDB с помощью утилиты mongosh . -
Создайте базу данных
db1
. -
Создайте пользователя с правами владельца базы данных
db1
и авторизуйтесь под его именем:use admin db.createUser({ user: "user1", pwd: passwordPrompt(), roles: [ { role: "dbOwner", db: "db1" } ] }) db.auth("user1")
-
Заполните коллекцию
collection1
в базеdb1
случайными значениями. В коллекцию будет вставлено 200 000 записей: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 }); }
Создайте и настройте кластер-приемник
- Создайте кластер Managed Service for MongoDB любой подходящей конфигурации.
- Создайте базу данных
db1
. - Создайте пользователя
user_transfer
с рольюreadWrite
на созданную базу.
- Создайте кластер Managed Service for MongoDB любой подходящей конфигурации. В кластере должно быть не менее двух хостов.
- Включите шардирование.
- Создайте базу данных
db1
. - Создайте пользователя
user_transfer
с рольюreadWrite
на созданную базу и рольюmdbShardingManager
на служебную базуadmin
. - Следуя инструкции, создайте и настройте в базе
db1
пустую шардированную коллекциюcollection1
.
Настройте эндпоинты и трансфер
- Создайте эндпоинт для кластера-источника:
- Тип базы данных —
MongoDB
. - Настройки подключения —
Пользовательская инсталляция
.- Сертификат CA — загрузите файл сертификата, если при подключении к кластеру-источнику требуется шифрование.
- Список хостов — укажите FQDN хостов кластера-источника.
- Порт — укажите порт для подключения к хостам.
- Источник аутентификации —
db1
. - Пользователь —
user1
. - Пароль — укажите пароль пользователя
user1
.
- Тип базы данных —
- Создайте эндпоинт для кластера-приемника:
- Тип базы данных —
MongoDB
. - Настройки подключения —
Кластер MDB
.- Укажите идентификатор кластера-приемника.
- Пользователь —
user_transfer
. - Пароль — укажите пароль пользователя
user_transfer
. - Политика очистки —
Drop
.
- Тип базы данных —
- Создайте трансфер:
- Тип трансфера — Копирование и репликация.
- Источник — выберите созданный эндпоинт для кластера-источника.
- Приёмник — выберите созданный эндпоинт для кластера-приемника.
- Создайте эндпоинт для кластера-источника:
- Тип базы данных —
MongoDB
. - Настройки подключения —
Пользовательская инсталляция
.- Сертификат CA — загрузите файл сертификата, если при подключении к кластеру-источнику требуется шифрование.
- Список хостов — укажите FQDN хостов кластера-источника.
- Порт — укажите порт для подключения к хостам.
- Источник аутентификации —
db1
. - Пользователь —
user1
. - Пароль — укажите пароль пользователя
user1
.
- Тип базы данных —
- Создайте эндпоинт для кластера-приемника:
- Тип базы данных —
MongoDB
. - Настройки подключения —
Кластер MDB
.- Укажите идентификатор кластера-приемника.
- Пользователь —
user_transfer
. - Пароль — укажите пароль пользователя
user_transfer
. - Политика очистки —
Не очищать
илиTruncate
.
- Тип базы данных —
- Создайте трансфер:
- Тип трансфера — Копирование и репликация.
- Источник — выберите созданный эндпоинт для кластера-источника.
- Приёмник — выберите созданный эндпоинт для кластера-приемника.
Перенесите данные
-
Активируйте созданный трансфер.
-
Дождитесь перехода трансфера в статус Реплицируется.
-
Переведите кластер-источник в режим
только чтение
и переключите нагрузку на кластер-приемник. -
На странице мониторинга трансфера дождитесь снижения до нуля характеристики Maximum data transfer delay. Это значит, что на кластер-приемник перенесены все изменения, произошедшие в кластере-источнике после завершения копирования данных.
-
Подключитесь к кластеру-приемнику.
-
Проверьте, что коллекция
collection1
перенесена и количество документов в ней равно 200 000, как в кластере-источнике:use db1 db.collection1.countDocuments()
200000
-
Активируйте созданный трансфер.
-
Дождитесь перехода трансфера в статус Реплицируется.
-
Переведите кластер-источник в режим
только чтение
и переключите нагрузку на кластер-приемник. -
На странице мониторинга трансфера дождитесь снижения до нуля характеристики Maximum data transfer delay. Это значит, что на кластер-приемник перенесены все изменения, произошедшие в кластере-источнике после завершения копирования данных.
-
Подключитесь к кластеру-приемнику.
-
Проверьте, что коллекция
collection1
перенесена, количество документов в ней равно 200 000, как в кластере-источнике, и документы распределены по шардам:use db1 db.collection1.countDocuments()
200000
db.collection1.getShardDistribution()
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 } --- ...
Удалите созданные ресурсы
Некоторые ресурсы платные. Чтобы за них не списывалась плата, удалите ресурсы, которые вы больше не будете использовать:
-
Деактивируйте трансфер и дождитесь его перехода в статус Остановлен.
Подробнее о жизненном цикле трансфера читайте в документации Yandex Data Transfer.
-
Удалите остановленный трансфер.