Передача данных из эндпоинта-источника MongoDB
- Сценарии передачи данных из MongoDB
- Подготовка базы данных источника
- Настройка эндпоинта-источника MongoDB
- Настройка приемника данных
- Действия с базой данных во время трансфера
- Решение проблем, возникающих при переносе данных
- Размер ключа коллекции превышает 5 МБ
- Размер объекта в коллекции превышает 16 МБ
- Не удалось найти ни одной таблицы
- Ошибка при трансфере шардированного кластера
- Ошибка при переносе коллекций timeseries
- Не распознается IP-адрес или FQDN внешнего кластера
- Ошибка на стадии копирования данных
- Данные в источнике не подходят для шардирования
С помощью сервиса Yandex Data Transfer вы можете переносить данные из базы MongoDB и реализовывать различные сценарии переноса, обработки и трансформации данных. Для реализации трансфера:
- Ознакомьтесь с возможными сценариями передачи данных.
- Подготовьте базу данных MongoDB к трансферу.
- Настройте эндпоинт-источник в Yandex Data Transfer.
- Настройте один из поддерживаемых приемников данных.
- Создайте и запустите трансфер.
- Выполняйте необходимые действия по работе с базой и контролируйте трансфер.
- При возникновении проблем, воспользуйтесь готовыми решениями по их устранению.
Сценарии передачи данных из MongoDB
-
Миграция — перенос данных из одного хранилища в другое. Часто это перенос базы из устаревших локальных баз в управляемые облачные.
-
Загрузка данных в масштабируемое хранилище Object Storage позволяет удешевить хранение и облегчает обмен данных с контрагентами.
Подробное описание возможных сценариев передачи данных в Yandex Data Transfer см. в разделе Практические руководства.
Подготовка базы данных источника
- Оцените общее количество баз данных для трансфера и общую нагрузку на Managed Service for MongoDB. Если нагрузка на базы выше 10 000 операций на запись в секунду, создайте несколько эндпоинтов и трансферов. Подробнее см. в разделе Передача данных из эндпоинта-источника MongoDB.
- Создайте пользователя с ролью
readWrite
на каждую базу в источнике, которая будет реплицироваться. РольreadWrite
нужна для того, чтобы у трансфера было право записи в служебную коллекцию__data_transfer.__dt_cluster_time
.
-
Оцените общее количество баз данных для трансфера и общую нагрузку на MongoDB. Если нагрузка на базы выше 10 000 операций на запись в секунду, создайте несколько эндпоинтов и трансферов. Подробнее см. в разделе Передача данных из эндпоинта-источника MongoDB.
-
Если вы не планируете использовать для подключения к внешнему кластеру сервис Cloud Interconnect или VPN, разрешите подключения к такому кластеру из интернета с IP-адресов, используемых сервисом Data Transfer
.Подробнее о настройке сети для работы с внешними ресурсами см. в концепции.
-
Убедитесь, что версия MongoDB на приемнике не ниже
4.0
. -
Убедитесь, что кластер MongoDB сконфигурирован таким образом, чтобы на запросы к нему он возвращал корректно разрешающиеся IP-адреса или FQDN (Fully Qualified Domain Name).
-
Настройте доступ к кластеру-источнику из Yandex Cloud. Чтобы настроить кластер-источник
для подключения из интернета:-
Измените в конфигурационном файле значение настройки
net.bindIp
со127.0.0.1
на0.0.0.0
:# network interfaces net: port: 27017 bindIp: 0.0.0.0
-
Перезапустите сервис
mongod
:sudo systemctl restart mongod.service
-
-
Если кластер-источник не использует репликацию, включите ее:
-
Добавьте в конфигурационный файл
/etc/mongod.conf
настройки репликации:replication: replSetName: <имя_набора_реплик>
-
Перезапустите сервис
mongod
:sudo systemctl restart mongod.service
-
Подключитесь к MongoDB и инициализируйте набор реплик командой:
rs.initiate({ _id: "<имя_набора_реплик>", members: [{ _id: 0, host: "<IP-адрес_который_слушает_MongoDB>:<порт>" }] });
-
-
Создайте пользователя с ролью
readWrite
на все базы в источнике, которые будут реплицироваться:use admin db.createUser({ user: "<имя_пользователя>", pwd: "<пароль>", mechanisms: ["SCRAM-SHA-1"], roles: [ { db: "<имя_базы-источника_1>", role: "readWrite" }, { db: "<имя_базы-источника_2>", role: "readWrite" }, ... ] });
После старта трансфер подключится к источнику от имени этого пользователя. Роль
readWrite
нужна для того, чтобы у трансфера было право записи в служебную коллекцию__data_transfer.__dt_cluster_time
.Примечание
Для версий MongoDB, начиная с 3.6, достаточно выдать созданному пользователю роль
read
на реплицируемые базы. -
При использовании MongoDB, начиная с версии 3.6, для работы трансфера необходимо, чтобы пользователь обладал правами на чтение коллекции
local.oplog.rs
, а также на запись с чтением коллекции__data_transfer.__dt_cluster_time
. Чтобы назначить пользователю рольclusterAdmin
, предоставляющую такие права, подключитесь к MongoDB и выполните команды:use admin; db.grantRolesToUser("<имя_пользователя>", ["clusterAdmin"]);
Для выдачи более гранулярных прав можно назначить роль
clusterMonitor
, необходимую для чтения коллекцииlocal.oplog.rs
, а также дать доступ на чтение и запись системной коллекции__data_transfer.__dt_cluster_time
.
Настройка эндпоинта-источника MongoDB
Data Transfer поддерживает трансферы с MongoDB, начиная с версии 3.6.
При создании или изменении эндпоинта вы можете задать:
- Настройки подключения к кластеру Yandex Managed Service for MongoDB или пользовательской инсталляции, в т. ч. на базе виртуальных машин Yandex Compute Cloud. Эти параметры обязательные.
- Дополнительные параметры.
Кластер Managed Service for MongoDB
Важно
Для создания или редактирования эндпоинта управляемой базы данных вам потребуется роль managed-mongodb.viewer
или примитивная роль viewer
, выданная на каталог кластера этой управляемой базы данных.
Подключение к БД с указанием идентификатора кластера в Yandex Cloud.
-
Кластер Managed Service for MongoDB — укажите идентификатор кластера, к которому необходимо подключиться.
-
Источник аутентификации — укажите имя базы данных в кластере.
-
Пользователь — укажите имя пользователя, под которым сервис Data Transfer будет подключаться к базе данных.
-
Пароль — укажите пароль пользователя для доступа к базе данных.
-
Группы безопасности — выберите облачную сеть для размещения эндпоинта и группы безопасности для сетевого трафика.
Это позволит применить к ВМ и кластерам в выбранной сети указанные правила групп безопасности без изменения настроек этих ВМ и кластеров. Подробнее см. в разделе Сеть в Yandex Data Transfer.
- Тип эндпоинта —
mongo-source
.
-
--cluster-id
— идентификатор кластера, к которому необходимо подключиться. -
--database
— имя базы данных. -
--user
— имя пользователя, под которым сервис Data Transfer будет подключаться к базе данных. -
--security-group
— группы безопасности для сетевого трафика, правила которых применятся к ВМ и кластерам без изменения их настроек. Подробнее см. в разделе Сеть в Yandex Data Transfer. -
Чтобы задать пароль пользователя для доступа к базе данных, используйте один из параметров:
-
--raw-password
— пароль в текстовом виде. -
--password-file
— путь к файлу с паролем.
-
- Тип эндпоинта —
mongo_source
.
-
connection.connection_options.mdb_cluster_id
— идентификатор кластера, к которому необходимо подключиться. -
subnet_id
— идентификатор подсети, в которой находится кластер. Если не указан, то кластер должен быть доступен из интернета.Если значение в этом поле задано для обоих эндпоинтов, то обе подсети должны быть размещены в одной зоне доступности.
-
security_groups
— группы безопасности для сетевого трафика.Правила групп безопасности применяются к трансферу. Они позволяют открыть сетевой доступ с ВМ трансфера к кластеру. Подробнее см. в разделе Сеть в Yandex Data Transfer.
Группы безопасности и подсеть
subnet_id
, если она указана, должны принадлежать той же сети, в которой размещен кластер.Примечание
В Terraform сеть для групп безопасности задавать не нужно.
-
auth_source
— имя базы данных в кластере. -
connection.connection_options.user
— имя пользователя, под которым сервис Data Transfer будет подключаться к базе данных. -
connection.connection_options.password.raw
— пароль в текстовом виде.
Пример структуры конфигурационного файла:
resource "yandex_datatransfer_endpoint" "<имя_эндпоинта_в_Terraform>" {
name = "<имя_эндпоинта>"
settings {
mongo_source {
security_groups = ["<список_идентификаторов_групп_безопасности>"]
subnet_id = "<идентификатор_подсети>"
connection {
connection_options {
mdb_cluster_id = "<идентификатор_кластера>"
auth_source = "<имя_базы_данных>"
user = "<имя_пользователя>"
password {
raw = "<пароль_пользователя>"
}
}
}
<дополнительные_настройки_эндпоинта>
}
}
}
Подробнее см. в документации провайдера Terraform
-
securityGroups
— группы безопасности для сетевого трафика, правила которых применятся к ВМ и кластерам без изменения их настроек. Подробнее см. в разделе Сеть в Yandex Data Transfer. -
mdbClusterId
— идентификатор кластера, к которому необходимо подключиться. -
database
— имя базы данных. -
user
— имя пользователя, под которым сервис Data Transfer будет подключаться к базе данных. -
password.raw
— пароль пользователя для доступа к базе данных (в текстовом виде).
Пользовательская инсталляция
Настройки приведены для случая OnPremise, когда все поля заполняются вручную.
-
Хосты — укажите IP-адреса или FQDN хостов, к которым необходимо подключиться.
-
Набор реплик — укажите имя набора реплик.
-
Порт — укажите номер порта, который сервис Data Transfer будет использовать для подключения.
-
Сертификат CA — для шифрования передаваемых данных загрузите файл PEM-сертификата или добавьте его содержимое в текстовом виде.
-
Идентификатор подсети — выберите или создайте подсеть в нужной зоне доступности.
Если значение в этом поле задано для обоих эндпоинтов, то обе подсети должны быть размещены в одной зоне доступности.
-
Источник аутентификации — укажите имя базы данных в кластере.
-
Пользователь — укажите имя пользователя, под которым сервис Data Transfer будет подключаться к базе данных.
-
Пароль — укажите пароль пользователя для доступа к базе данных.
-
Группы безопасности — выберите облачную сеть для размещения эндпоинта и группы безопасности для сетевого трафика.
Это позволит применить к ВМ и кластерам в выбранной сети указанные правила групп безопасности без изменения настроек этих ВМ и кластеров. Подробнее см. в разделе Сеть в Yandex Data Transfer.
- Тип эндпоинта —
mongo-source
.
-
--host
— IP-адрес или FQDN хоста-мастера, к которому необходимо подключиться. -
--port
— номер порта, который сервис Data Transfer будет использовать для подключения. -
--ca-certificate
— сертификат CA, если требуется шифрование передаваемых данных, например для соответствия требованиям PCI DSS . -
--subnet-id
— идентификатор подсети, в которой находится хост. -
--database
— имя базы данных. -
--user
— имя пользователя, под которым сервис Data Transfer будет подключаться к базе данных. -
--security-group
— группы безопасности для сетевого трафика, правила которых применятся к ВМ и кластерам без изменения их настроек. Подробнее см. в разделе Сеть в Yandex Data Transfer. -
Чтобы задать пароль пользователя для доступа к базе данных, используйте один из параметров:
-
--raw-password
— пароль в текстовом виде. -
--password-file
— путь к файлу с паролем.
-
- Тип эндпоинта —
mongo_source
.
-
on_premise.port
— номер порта, который сервис Data Transfer будет использовать для подключения. -
connection.connection_options.on_premise.tls_mode.enabled.ca_certificate
— сертификат CA, если требуется шифрование передаваемых данных, например, для соответствия требованиям PCI DSS . -
subnet_id
— идентификатор подсети, в которой находится кластер. Если не указан, то кластер должен быть доступен из интернета.Если значение в этом поле задано для обоих эндпоинтов, то обе подсети должны быть размещены в одной зоне доступности.
-
security_groups
— группы безопасности для сетевого трафика.Правила групп безопасности применяются к трансферу. Они позволяют открыть сетевой доступ с ВМ трансфера к ВМ c базой данных. Подробнее см. в разделе Сеть в Yandex Data Transfer.
Группы безопасности должны принадлежать той же сети, что и подсеть
subnet_id
, если она указана.Примечание
В Terraform сеть для групп безопасности задавать не нужно.
-
connection.connection_options.on_premise.replica_set
— укажите имя набора реплик. -
connection.connection_options.on_premise.hosts
— укажите IP-адреса или FQDN хостов, к которым необходимо подключиться. -
auth_source
— имя базы данных в кластере. -
connection.connection_options.user
— имя пользователя, под которым сервис Data Transfer будет подключаться к базе данных. -
connection.connection_options.password.raw
— пароль в текстовом виде.
Пример структуры конфигурационного файла:
resource "yandex_datatransfer_endpoint" "<имя_эндпоинта_в_Terraform>" {
name = "<имя_эндпоинта>"
settings {
mongo_source {
security_groups = ["<список_идентификаторов_групп_безопасности>"]
subnet_id = "<идентификатор_подсети>"
connection {
connection_options {
on_premise {
hosts = [ "список хостов набора реплик" ]
port = "<порт_для_подключения>"
replica_set = "<имя_набора_реплик>"
tls_mode {
enabled {
ca_certificate = "<сертификат_в_формате_PEM>"
}
}
}
auth_source = "<имя_базы_данных>"
user = "<имя_пользователя>"
password {
raw = "<пароль_пользователя>"
}
}
}
<дополнительные_настройки_эндпоинта>
}
}
}
Подробнее см. в документации провайдера Terraform
onPremise
— параметры подключения к базе данных:-
hosts
— IP-адрес или FQDN хоста-мастера, к которому необходимо подключиться. -
port
— номер порта, который сервис Data Transfer будет использовать для подключения. -
tlsMode
— параметры шифрования передаваемых данных, если оно требуется, например для соответствия требованиям PCI DSS . -
subnetId
— идентификатор подсети, в которой находится хост.
-
-
securityGroups
— группы безопасности для сетевого трафика, правила которых применятся к ВМ и кластерам без изменения их настроек. Подробнее см. в разделе Сеть в Yandex Data Transfer. -
database
— имя базы данных. -
user
— имя пользователя, под которым сервис Data Transfer будет подключаться к базе данных. -
password.raw
— пароль пользователя для доступа к базе данных (в текстовом виде).
Фильтр коллекций
-
Список включённых коллекций — будут передаваться данные только из перечисленных коллекций. По умолчанию передаются все коллекции.
Добавление новых коллекций при редактировании эндпоинта, использующегося в трансферах типа Копирование и репликация или Репликация в статусе Реплицируется, не приведет к загрузке истории данных по этим коллекциям. Чтобы добавить коллекцию с ее историческими данными, используйте поле Список объектов для переноса в настройках трансфера.
-
Список исключённых коллекций — будут передаваться данные из всех коллекций, кроме указанных.
Имена включенных и исключенных коллекций должны соответствовать правилам именования идентификаторов в MongoDB. Экранирование двойных кавычек не требуется.
-
--include-collection
— будут передаваться данные только из перечисленных коллекций. Значения указываются в формате<имя_базы_данных>.<имя_коллекции>
. По умолчанию передаются все коллекции.Добавление новых коллекций при редактировании эндпоинта, использующегося в трансферах типа Копирование и репликация или Репликация в статусе Реплицируется, не приведет к загрузке истории данных по этим коллекциям. Чтобы добавить коллекцию с ее историческими данными, используйте поле Список объектов для переноса в настройках трансфера.
-
--exclude-collection
— будут передаваться данные из всех коллекций, кроме указанных. Значения указываются в формате<имя_базы_данных>.<имя_коллекции>
. -
--prefer-secondary
— задайте значениеtrue
для этого параметра, чтобы использовать для чтения данных реплики (если они есть в кластере) вместо хоста-мастера.
-
collections
— будут передаваться данные только из перечисленных коллекций. По умолчанию передаются все коллекции.Добавление новых коллекций при редактировании эндпоинта, использующегося в трансферах типа Копирование и репликация или Репликация в статусе Реплицируется, не приведет к загрузке истории данных по этим коллекциям. Чтобы добавить коллекцию с ее историческими данными, используйте поле Список объектов для переноса в настройках трансфера.
-
excluded_collections
— будут передаваться данные из всех коллекций, кроме указанных. -
secondary_preferred_mode
— задайте значениеtrue
для этого параметра, чтобы использовать для чтения данных реплики (если они есть в кластере) вместо хоста-мастера.
-
collections
— будут передаваться данные только из перечисленных коллекций. Для каждой коллекции указываются:databaseName
— имя базы данных.collectionName
— имя коллекции.
По умолчанию передаются все коллекции.
Добавление новых коллекций при редактировании эндпоинта, использующегося в трансферах типа Копирование и репликация или Репликация в статусе Реплицируется, не приведет к загрузке истории данных по этим коллекциям. Чтобы добавить коллекцию с ее историческими данными, используйте поле Список объектов для переноса в настройках трансфера.
-
excludedCollections
— будут передаваться данные из всех коллекций, кроме указанных. Для каждой коллекции указываются:databaseName
— имя базы данных.collectionName
— имя коллекции.
-
secondaryPreferredMode
— задайте значениеtrue
для этого параметра, чтобы использовать для чтения данных реплики (если они есть в кластере) вместо хоста-мастера.
Если источник испытывает высокую рабочую нагрузку (более 10000 транзакций на запись в секунду), то рекомендуется задать эти настройки так, чтобы в каждом эндпоинте присутствовало не более десяти различных баз. Это позволит избежать ошибок подключения к базам во время работы трансфера.
Примечание
- Если вы используете несколько эндпоинтов, то для каждого из них необходимо создать отдельный трансфер.
- Так как трансферы не поддерживают перенос коллекций timeseries
, такие коллекции необходимо исключить.
Настройка приемника данных
Настройте один из поддерживаемых приемников данных:
Полный список поддерживаемых источников и приемников в Yandex Data Transfer см. в разделе Доступные трансферы.
После настройки источника и приемника данных создайте и запустите трансфер.
Действия с базой данных во время трансфера
-
Для трансферов в статусе Копируется запрещено производить действия, которые сокращают временное окно журнала операций (oplog) на источнике. Не стоит добавлять, удалять шарды или каким-либо образом их переконфигурировать в процессе копирования, а также производить другие действия, приводящие к уменьшению временного окна журнала операций.
-
Для трансферов в статусе Реплицируется можно столкнуться с проблемой дублирования ключа в ситуациях, когда приемником выступает шардированный кластер MongoDB с индексом шардирования, отличным от
_id
. Во время работы трансфера не рекомендуется создавать на приемнике кластеры с индексами шардирования, отличными от_id
.
Решение проблем, возникающих при переносе данных
Известные проблемы, связанные с использованием эндпоинта MongoDB:
- Размер ключа коллекции превышает 5 МБ
- Размер объекта в коллекции превышает 16 МБ
- Не удалось найти ни одной таблицы
- Ошибка при трансфере шардированного кластера
- Ошибка при переносе коллекций timeseries
- Не распознается IP-адрес или FQDN внешнего кластера
- Ошибка на стадии копирования
См. полный список рекомендаций в разделе Решение проблем.
Размер ключа коллекции превышает 5 МБ
Текст ошибки:
Warn(replication): Usage of bulk objects in 'database <имя_БД>'
breaks change event log, transfer is stopping.
Reason: (Location<номер_позиции>) Tried to create string longer than 16MB.
Если размер ключа коллекции превышает 5 МБ, трансферы типа Репликация прерываются из-за внутренних ограничений
Решение: исключите из трансфера коллекции, превышающие лимиты MongoDB, после чего активируйте трансфер повторно.
Размер объекта в коллекции превышает 16 МБ
Текст ошибки:
Warn(replication): Usage of bulk objects in 'collection '<имя_БД>.<имя_коллекции>''
breaks change event log, transfer is stopping.
Reason: (BSONObjectTooLarge) BSONObj size: <размер_объекта> (<размер_объекта_в_hex>) is invalid.
Size muse be between 0 and 16793600(16MB).
Если размер объекта в коллекции превышает 16 МБ, трансферы типа Репликация прерываются из-за внутренних ограничений
Решение: исключите из трансфера коллекции, превышающие лимиты MongoDB, после чего активируйте трансфер повторно.
Не удалось найти ни одной таблицы
Текст ошибки:
Unable to find any tables
Из базы данных извлечено пустое число коллекций. Возможно у пользователя нет прав на базу данных, используемую в трансфере.
Решение: выдайте пользователю, от имени которого трансфер подключается к источнику, права readWrite
на базу данных для переноса.
Ошибка при трансфере шардированного кластера
Решение: задайте в параметре трансфера Настройки копирования → Настройки параллельного копирования количество воркеров, равное количеству переносимых коллекций.
Ошибка при переносе коллекций timeseries
Тексты ошибок:
Unable to find any tables
Cannot execute mongo activate hook:
Failed in accordance with configuration:
some tables from include list are missing in the source database: [<имя_коллекции>]
Сервис не поддерживает перенос коллекций Time Series
Решение: исключите из трансфера коллекции Time Series, после чего активируйте трансфер повторно.
Не распознается IP-адрес или FQDN внешнего кластера
Трансфер завершается с ошибкой:
server selection error: server selection timeout, current topology: { Type: ReplicaSetNoPrimary, Servers: [{ Addr: <неразрешающееся_FQDN>, Type: Unknown, Last error: connection() error occurred during connection handshake: dial tcp: lookup <неразрешающееся_FQDN> on <IP-адрес>: no such host }, ] }"
Ошибка трансфера связана с конфигурацией кластера MongoDB. Например, когда в описании шардов используются внутренние не разрешающиеся имена.
Решение:
Убедитесь, что кластер MongoDB сконфигурирован таким образом, чтобы на запросы к нему он возвращал корректно разрешающиеся IP-адреса или FQDN (Fully Qualified Domain Name).
Ошибка на стадии копирования данных
Трансфер типа Копирование и репликация на стадии копирования завершается с ошибкой:
encountered non-recoverable resume token error. Sync cannot be resumed from this state and must be terminated and re-enabled to continue functioning: (ChangeStreamHistoryLost) Resume of change stream was not possible, as the resume point may no longer be in the oplog.
Ошибка ChangeStreamHistoryLost
возникает, когда общее время копирования данных кластера-источника MongoDB превышает размер временного окна журнала операций (oplog). Текущий размер временного окна можно проверить в Консоли управления на графике Oplog window страницы мониторинга кластера.
Подробнее об oplog читайте в документации MongoDB
Решение:
- Увеличьте размер oplog (по умолчанию 10 % от размера диска кластера). Чтобы увеличить размер oplog в кластере-источнике Managed Service for MongoDB, обратитесь в техническую поддержку
. Чтобы изменить размер oplog в случае пользовательской инсталляции источника, см. документацию MongoDB . - Включите параллельное копирование данных для ускорения стадии копирования.
- Ограничьте список объектов для переноса в настройках трансфера.
После этого активируйте трансфер повторно.
Данные в источнике не подходят для шардирования
Активация трансфера из источника MongoDB завершается с ошибкой:
ERROR: Unable to Activate
error: "failed to execute mongo activate hook: Snapshot loading failed: unable to sharded upload tables: unable to sharded upload(main worker) tables: unable to shard tables for operation id_операции: unable to split table, err: cannot get delimiters: there are two or more types of objects in the sharding index"
Ошибка cannot get delimiters: there are two or more types of objects in the sharding index
означает, что на источнике в коллекции в поле id
встречаются данные разных типов, и поэтому его нельзя использовать для шардирования.
Решение:
Укажите в настройках трансфера Настройки копирования → Настройки параллельного копирования 1 воркер и 1 поток, чтобы отключить шардирование.
После этого активируйте трансфер повторно.