Передача данных в эндпоинт-приемник Elasticsearch
С помощью сервиса Yandex Data Transfer вы можете переносить данные в базу Elasticsearch и реализовывать различные сценарии переноса, обработки и трансформации данных. Для реализации трансфера:
- Ознакомьтесь с возможными сценариями передачи данных.
- Настройте один из поддерживаемых источников данных.
- Подготовьте базу данных Elasticsearch к трансферу.
- Настройте эндпоинт-приемник в Yandex Data Transfer.
- Создайте и запустите трансфер.
- Выполняйте необходимые действия по работе с базой и контролируйте трансфер.
- При возникновении проблем, воспользуйтесь готовыми решениями по их устранению.
Сценарии передачи данных в Elasticsearch
-
Миграция — перенос данных из одного хранилища в другое. Часто это перенос базы из устаревших локальных баз в управляемые облачные.
Настройка источника данных
Настройте один из поддерживаемых источников данных:
Полный список поддерживаемых источников и приемников в Yandex Data Transfer см. в разделе Доступные трансферы.
Подготовка базы данных приемника
-
Если вы не планируете использовать для подключения к внешнему кластеру сервис Cloud Interconnect или VPN, разрешите подключения к такому кластеру из интернета с IP-адресов, используемых сервисом Data Transfer
.Подробнее о настройке сети для работы с внешними ресурсами см. в концепции.
-
Убедитесь, что количество колонок в источнике не превышает максимальное количество полей в индексах Elasticsearch. Максимальное количество полей задается в параметре
index.mapping.total_fields.limit
и по умолчанию составляет1000
.Чтобы увеличить значение параметра, настройте шаблон
, по которому максимальное количество полей в создаваемых индексах будет равно указанному значению.Пример запроса для настройки шаблона
curl \ --user <имя_пользователя_Elasticsearch>:<пароль> \ --header 'Content-Type: application/json' \ --request PUT "https://<FQDN_кластера_Elasticsearch>:9200/_template/index_defaults" \ --data ' { "index_patterns": "cdc*", "settings": { "index": { "mapping": { "total_fields": { "limit": "2000" } } } } }'
При такой настройке шаблона, все новые индексы с маской
cdc*
смогут содержать до2000
полей.Для настройки шаблона можно также использовать интерфейс Kibana
.Проверить текущее значение параметра
index.mapping.total_fields.limit
можно с помощью интерфейса Kibana , либо выполнив запрос:curl \ --user <имя_пользователя_Elasticsearch>:<пароль> \ --header 'Content-Type: application/json' \ --request GET 'https://<FQDN_кластера_Elasticsearch>:9200/<название_индекса>/_settings/*total_fields.limit?include_defaults=true'
-
По умолчанию при трансфере данных в единичный индекс задействуется только один хост. Чтобы распределить нагрузку между хостами при передаче больших объемов данных, настройте шаблон
, по которому создаваемые индексы будут заранее разбиты на шарды.Пример запроса для настройки шаблона
curl \ --user <имя_пользователя_Elasticsearch>:<пароль> \ --header 'Content-Type: application/json' \ --request PUT 'https://<FQDN_кластера_Elasticsearch>:9200/_template/index_defaults' \ --data ' { "index_patterns": "cdc*", "settings" : { "index" : { "number_of_shards" : 15, "number_of_replicas" : 1 } } }'
При такой настройке шаблона, все новые индексы с маской
cdc*
будут разбиты на15
шардов.Для настройки шаблона можно также использовать интерфейс Kibana
.
Настройка эндпоинта-приемника Elasticsearch
При создании или изменении эндпоинта вы можете задать:
- Настройки подключения к пользовательской инсталляции, в т. ч. на базе виртуальных машин Yandex Compute Cloud. Эти параметры обязательные.
- Дополнительные параметры.
Пользовательская инсталляция
Подключение к узлам с явным указанием сетевых адресов и портов.
-
Узлы с данными — нажмите на значок
, чтобы добавить новый узел с данными. Для каждого узла укажите:-
Хост — IP-адрес или FQDN хоста с ролью
DATA
, к которому необходимо подключиться. -
Порт — номер порта, который сервис Data Transfer будет использовать для подключения к хосту с ролью
DATA
.
-
-
SSL — выберите, если используется безопасное соединение SSL.
-
Сертификат CA — загрузите файл сертификата или добавьте его содержимое в текстовом виде, если требуется шифрование передаваемых данных, например, для соответствия требованиям PCI DSS
. -
Идентификатор подсети — выберите или создайте подсеть в нужной зоне доступности.
Если значение в этом поле задано для обоих эндпоинтов, то обе подсети должны быть размещены в одной зоне доступности.
-
Пользователь — укажите имя пользователя, под которым сервис Data Transfer будет подключаться к кластеру.
-
Пароль — укажите пароль пользователя для доступа к кластеру.
-
Группы безопасности — выберите облачную сеть для размещения эндпоинта и группы безопасности для сетевого трафика.
Это позволит применить к ВМ и кластерам в выбранной сети указанные правила групп безопасности без изменения настроек этих ВМ и кластеров. Подробнее см. в разделе Сеть в Yandex Data Transfer.
Дополнительные настройки
-
Политика очистки — выберите способ очистки данных в приемнике перед переносом:
-
Не очищать
— выберите эту опцию, если будет производиться только репликация без копирования данных. -
Drop
— полное удаление таблиц, участвующих в трансфере (вариант по умолчанию).Используйте эту опцию, чтобы при любой активации трансфера в базу-приемник всегда передавалась самая последняя версия схемы таблиц из источника.
-
-
Исправить некорректные ключи в документах — выберите эту опцию, чтобы для полей на приемнике выполнялась автозамена ключей, невалидных для Elasticsearch.
Правила автозамены:
- Пустые или состоящие из пробелов и точек ключи будут заменены на подчеркивание:
""
," "
,"."
→"_"
. - Точки в начале и конце ключа будут удалены:
"somekey."
,".somekey"
→"somekey"
. - Если две точки стоят друг за другом, либо между ними есть только пробелы, весь фрагмент будет заменен на точку:
" some . . key"
→" some . key"
.
Пример:
". s o m e ..incorrect....key. . . "
→" s o m e .incorrect.key"
. - Пустые или состоящие из пробелов и точек ключи будут заменены на подчеркивание:
После настройки источника и приемника данных создайте и запустите трансфер.
Решение проблем, возникающих при переносе данных
См. полный список рекомендаций в разделе Решение проблем.
Прерывание трансфера с ошибкой
Тексты ошибок:
object field starting or ending with a [.] makes object resolution ambiguous <описание_поля>
Index -1 out of bounds for length 0
Трансфер прерывается из-за того, что ключи в передаваемых документах невалидны для приемника Elasticsearch. К невалидным относятся пустые ключи, а также ключи:
- состоящие из пробелов;
- состоящие из точек;
- с точкой в начале или конце;
- с точками, стоящими друг за другом;
- с точками, разделенными пробелами.
Решение:
В дополнительных настройках эндпоинта-приемника включите опцию Исправить некорректные ключи в документах и активируйте трансфер повторно.
Дублирование документов на приемнике
На приемнике возникают дубли документов при повторной передаче данных.
Все документы, передаваемые из одной таблицы источника, попадают в один индекс с именем <schemaName.tableName>
на приемнике. При этом по умолчанию приемник автоматически генерирует идентификаторы документов (_id
). В результате одинаковые документы получают разные идентификаторы и дублируются.
Дублирование не происходит, если в таблице источника или в правилах конвертации эндпоинта заданы первичные ключи. В этом случае идентификаторы документов генерируются на этапе трансфера с использованием значений первичных ключей.
Генерация происходит следующим образом:
- Если значение ключа содержит
.
, она экранируется\
:some.key
-->some\.key
. - Значения всех первичных ключей преобразуются в строку:
<some_key1>.<some_key2>.<...>
. - Полученная строка преобразуется функцией url.QueryEscape
. - Если длина итоговой строки не превышает 512 символов, то она используется в качестве
_id
. Если длина больше 512 символов, то она хешируется алгоритмом SHA-1 , и в качестве_id
используется полученный хеш.
В результате документы с одинаковыми первичными ключами получат одинаковый идентификатор при повторной передаче данных, и последний переданный документ перезапишет существующий.
Решение:
- Установите первичный ключ для одного или нескольких столбцов на источнике или в правилах конвертации эндпоинта.
- Запустите трансфер.