Миграция данных в Yandex Managed Service for OpenSearch
Примечание
Сервис Yandex Managed Service for Elasticsearch недоступен с 11 апреля 2024 года.
Перенести данные из кластера-источника Elasticsearch в кластер-приемник Yandex Managed Service for OpenSearch можно с помощью трех механизмов:
-
Этот способ подходит для любых кластеров Elasticsearch.
Пример такого переноса см. в практическом руководстве Миграция данных в OpenSearch с помощью Yandex Data Transfer.
-
Снапшотов (snapshots).
Этот способ подходит для кластеров Elasticsearch версии не выше 7.11.
Подробнее о механизме снапшотов см. в документации OpenSearch
. -
Удаленной переиндексации
(reindex data).С ее помощью можно перенести существующие индексы, псевдонимы (aliases) или потоки данных. Этот способ подходит для всех кластеров Elasticsearch версии 7.
Миграция с помощью снапшотов
Чтобы мигрировать данные из кластера-источника Elasticsearch в кластер-приемник Managed Service for OpenSearch с помощью снапшотов:
- Создайте снапшот на кластере-источнике.
- Восстановите снапшот в кластере-приемнике.
- Закончите миграцию.
Если используемые ресурсы вам больше не нужны, удалите их.
Перед началом работы
Подготовьте инфраструктуру
-
Создайте бакет Object Storage с ограниченным доступом. Этот бакет будет использоваться в качестве репозитория снапшотов.
-
Создайте сервисный аккаунт и назначьте ему роль
storage.editor
. Сервисный аккаунт необходим для доступа к бакету из кластера-источника и кластера-приемника.- Если вы переносите данные из стороннего кластера Elasticsearch, создайте статический ключ доступа для этого сервисного аккаунта.
Важно
Сохраните идентификатор ключа и секретный ключ. Они понадобятся позднее.
-
Создайте кластер-приемник Managed Service for OpenSearch нужной вам конфигурации со следующими настройками:
- Плагин —
repository-s3
. - Публичный доступ к группе хостов с ролью
DATA
.
- Плагин —
-
Если у вас еще нет Terraform, установите его.
-
Получите данные для аутентификации. Вы можете добавить их в переменные окружения или указать далее в файле с настройками провайдера.
-
Настройте и инициализируйте провайдер. Чтобы не создавать конфигурационный файл с настройками провайдера вручную, скачайте его
. -
Поместите конфигурационный файл в отдельную рабочую директорию и укажите значения параметров. Если данные для аутентификации не были добавлены в переменные окружения, укажите их в конфигурационном файле.
-
Скачайте в ту же рабочую директорию файл конфигурации es-mos-migration-snapshot.tf
. В файле описаны:- сеть;
- подсеть;
- группа безопасности и правила, необходимые для подключения к кластеру Managed Service for OpenSearch;
- сервисный аккаунт для работы с бакетом Object Storage;
- бакет Object Storage;
- кластер-приемник Managed Service for OpenSearch.
-
Укажите в файле
es-mos-migration-snapshot.tf
переменные:folder_id
— идентификатор облачного каталога, такой же, как в настройках провайдера.bucket_name
— имя бакета в соответствии с правилами именования.os_admin_password
— пароль администратора OpenSearch.os_version
— версия OpenSearch.
-
Проверьте корректность файлов конфигурации Terraform с помощью команды:
terraform validate
Если в файлах конфигурации есть ошибки, Terraform на них укажет.
-
Создайте необходимую инфраструктуру:
-
Выполните команду для просмотра планируемых изменений:
terraform plan
Если конфигурации ресурсов описаны верно, в терминале отобразится список изменяемых ресурсов и их параметров. Это проверочный этап: ресурсы не будут изменены.
-
Если вас устраивают планируемые изменения, внесите их:
-
Выполните команду:
terraform apply
-
Подтвердите изменение ресурсов.
-
Дождитесь завершения операции.
-
В указанном каталоге будут созданы все требуемые ресурсы. Проверить появление ресурсов и их настройки можно в консоли управления
. -
Завершите настройку и проверьте доступ к ресурсам
-
Настройте ACL для бакета:
- В выпадающем списке Выберите пользователя укажите созданный ранее сервисный аккаунт.
- Задайте разрешения
READ и WRITE
для выбранного сервисного аккаунта. - Нажмите кнопку Добавить.
- Нажмите кнопку Сохранить.
-
Настройте кластер-источник Elasticsearch:
-
Установите плагин
repository-s3
на все хосты кластера. -
Чтобы плагин
repository-s3
заработал, перезапустите сервисы Elasticsearch и Kibana на всех хостах кластера. -
Убедитесь, что у кластера-источника Elasticsearch есть доступ в интернет.
-
-
Убедитесь, что вы можете подключиться к кластеру-приемнику Managed Service for OpenSearch с помощью OpenSearch API и Dashboards.
Создайте снапшот на кластере-источнике
-
Подключите бакет в качестве репозитория снапшотов на кластере-источнике:
-
Добавьте сведения о ключе статического доступа в хранилище ключей
(keystore) Elasticsearch.Примечание
Выполните процедуру на всех хостах кластера-источника.
Добавьте:
-
Идентификатор ключа:
$ES_PATH/bin/elasticsearch-keystore add s3.client.default.access_key
-
Секретный ключ:
$ES_PATH/bin/elasticsearch-keystore add s3.client.default.secret_key
Примечание
Путь к Elasticsearch (
$ES_PATH
) зависит от выбранного способа установки. Найти путь к установленному Elasticsearch можно в документации по установке (например, для DEB , RPM ). -
-
Загрузите данные из хранилища ключей:
curl --request POST "https://<IP-адрес_или_FQDN_хоста_с_ролью_DATA_в_кластере-источнике>:9200/_nodes/reload_secure_settings"
-
Зарегистрируйте репозиторий:
curl --request PUT \ "https://<IP-адрес_или_FQDN_хоста_с_ролью_DATA_в_кластере-источнике>:9200/_snapshot/<имя_репозитория>" \ --header 'Content-Type: application/json' \ --data '{ "type": "s3", "settings": { "bucket": "<имя_бакета>", "endpoint": "storage.yandexcloud.net" } }'
Подробнее о подключении репозитория см. в документации плагина
.Внимание
Если бакет зарегистрирован в кластере Elasticsearch как репозиторий снапшотов, не изменяйте содержимое бакета вручную — это нарушит работу механизма снапшотов Elasticsearch.
-
-
Запустите создание снапшота в репозитории, созданном на предыдущем шаге. Можно создать снапшот всего кластера или части данных. Подробнее см. в документации Elasticsearch
.Пример создания снапшота с именем
snapshot_1
для всего кластера:curl --request PUT \ "https://<IP-адрес_или_FQDN_хоста_с_ролью_DATA_в_кластере-источнике>:9200/_snapshot/<имя_репозитория>/snapshot_1?wait_for_completion=false&pretty"
Процесс создания снапшота может занять длительное время. Отслеживайте ход выполнения операции с помощью инструментов Elasticsearch
, например:curl --request GET \ "https://<IP-адрес_или_FQDN_хоста_с_ролью_DATA_в_кластере-источнике>:9200/_snapshot/<имя_репозитория>/snapshot_1/_status?pretty"
Восстановите снапшот в кластере-приемнике
-
Настройте доступ к бакету со снапшотами для кластера-приемника. Используйте созданный ранее сервисный аккаунт.
-
Подключите к кластеру-приемнику бакет Object Storage в качестве хранилища снапшотов в режиме только для чтения:
curl --request PUT \ "https://admin:<пароль_пользователя_admin>@<идентификатор_хоста_OpenSearch_с_ролью_DATA>.mdb.yandexcloud.net:9200/_snapshot/<имя_репозитория>" \ --cacert ~/.opensearch/root.crt \ --header 'Content-Type: application/json' \ --data '{ "type": "s3", "settings": { "bucket": "<имя_бакета>", "readonly" : "true", "endpoint": "storage.yandexcloud.net" } }'
-
Выберите способ восстановления индексов на кластере-приемнике.
При настройках по умолчанию попытка восстановления индекса завершится неудачей, если в кластере уже открыт индекс с тем же именем. Даже если кластер Managed Service for OpenSearch не содержит пользовательских данных, в нем есть открытые системные индексы (такие как
.apm-custom-link
,.kibana_*
и другие), что может помешать восстановлению. Чтобы этого избежать, воспользуйтесь одним из способов:-
Переносите только пользовательские индексы. Существующие системные индексы не переносятся, в процессе импорта участвую только индексы, созданные на кластере-источнике пользователем.
-
Используйте параметры
rename_pattern
иrename_replacement
. Индексы будут переименовываться по мере их восстановления. Подробнее см. в документации OpenSearch .
Пример восстановления снапшота целиком:
curl --request POST \ "https://admin:<пароль_пользователя_admin>@<идентификатор_хоста_OpenSearch_с_ролью_DATA>.mdb.yandexcloud.net:9200/_snapshot/<имя_репозитория>/snapshot_1/_restore" \ --cacert ~/.opensearch/root.crt
-
-
Запустите восстановление из снапшота на кластере-приемнике.
Пример восстановления снапшота с указанием пользовательских индексов, которые нужно восстановить в кластере-приемнике:
curl --request POST \ "https://admin:<пароль_пользователя_admin>@<идентификатор_хоста_OpenSearch_с_ролью_DATA>.mdb.yandexcloud.net:9200/_snapshot/<имя_репозитория>/snapshot_1/_restore?wait_for_completion=false&pretty" \ --cacert ~/.opensearch/root.crt \ --header 'Content-Type: application/json' \ --data '{ "indices": "<список_индексов>" }'
Где
indices
— список восстанавливаемых индексов через запятую, напримерmy_index*, my_index_2.*
.Процесс восстановления может занять длительное время. Чтобы проверить статус восстановления, выполните команду:
curl --request GET \ "https://admin:<пароль_пользователя_admin>@<идентификатор_хоста_OpenSearch_с_ролью_DATA>.mdb.yandexcloud.net:9200/_snapshot/<имя_репозитория>/snapshot_1/_status?pretty" \ --cacert ~/.opensearch/root.crt
Закончите миграцию
-
Убедитесь, что все нужные индексы перенесены в кластер-приемник Managed Service for OpenSearch, а количество документов в них такое же, как и в кластере-источнике:
BashOpenSearch DashboardsВыполните команду:
curl \ --user <имя_пользователя_в_кластере-приемнике>:<пароль_пользователя_в_кластере-приемнике> \ --cacert ~/.opensearch/root.crt \ --request GET 'https://<идентификатор_хоста_OpenSearch_с_ролью_DATA>.mdb.yandexcloud.net:9200/_cat/indices?v'
В списке должны быть перенесенные индексы из Elasticsearch с количеством документов в столбце
docs.count
.- Подключитесь к кластеру-приемнику с помощью OpenSearch Dashboards.
- Выберите общий тенант
Global
. - Откройте панель управления, нажав на значок
. - В разделе OpenSearch Plugins выберите Index Management.
- Перейдите в раздел Indices.
В списке должны быть перенесенные индексы из Elasticsearch с количеством документов в столбце Total documents.
-
При необходимости отключите репозиторий снапшотов
на стороне кластера-источника и кластера-приемника.
Удалите созданные ресурсы
Некоторые ресурсы платные. Чтобы за них не списывалась плата, удалите ресурсы, которые вы больше не будете использовать:
- Удалите сервисный аккаунт.
- Удалите снапшоты из бакета и затем удалите бакет целиком.
- Удалите кластер Managed Service for OpenSearch.
- Удалите все объекты из бакета.
-
В терминале перейдите в директорию с планом инфраструктуры.
Важно
Убедитесь, что в директории нет Terraform-манифестов с ресурсами, которые вы хотите сохранить. Terraform удаляет все ресурсы, которые были созданы с помощью манифестов в текущей директории.
-
Удалите ресурсы:
-
Выполните команду:
terraform destroy
-
Подтвердите удаление ресурсов и дождитесь завершения операции.
Все ресурсы, которые были описаны в Terraform-манифестах, будут удалены.
-
Миграция с помощью переиндексации
Чтобы мигрировать данные из кластера-источника Elasticsearch в кластер-приемник Managed Service for OpenSearch с помощью переиндексации:
Если созданные ресурсы вам больше не нужны, удалите их.
Перед началом работы
-
Подготовьте инфраструктуру:
ВручнуюС помощью TerraformСоздайте кластер-приемник Managed Service for OpenSearch нужной вам конфигурации с публичным доступом к группе хостов с ролью
DATA
.-
Если у вас еще нет Terraform, установите его.
-
Получите данные для аутентификации. Вы можете добавить их в переменные окружения или указать далее в файле с настройками провайдера.
-
Настройте и инициализируйте провайдер. Чтобы не создавать конфигурационный файл с настройками провайдера вручную, скачайте его
. -
Поместите конфигурационный файл в отдельную рабочую директорию и укажите значения параметров. Если данные для аутентификации не были добавлены в переменные окружения, укажите их в конфигурационном файле.
-
Скачайте в ту же рабочую директорию файл конфигурации es-mos-migration-reindex.tf
. В файле описаны:- сеть;
- подсеть;
- группа безопасности и правила, необходимые для подключения к кластеру Managed Service for OpenSearch;
- кластер-приемник Managed Service for OpenSearch.
-
Укажите в файле
es-mos-migration-reindex.tf
переменные:os_admin_password
— пароль администратора OpenSearch.os_version
— версия OpenSearch.
-
Проверьте корректность файлов конфигурации Terraform с помощью команды:
terraform validate
Если в файлах конфигурации есть ошибки, Terraform на них укажет.
-
Создайте необходимую инфраструктуру:
-
Выполните команду для просмотра планируемых изменений:
terraform plan
Если конфигурации ресурсов описаны верно, в терминале отобразится список изменяемых ресурсов и их параметров. Это проверочный этап: ресурсы не будут изменены.
-
Если вас устраивают планируемые изменения, внесите их:
-
Выполните команду:
terraform apply
-
Подтвердите изменение ресурсов.
-
Дождитесь завершения операции.
-
В указанном каталоге будут созданы все требуемые ресурсы. Проверить появление ресурсов и их настройки можно в консоли управления
. -
-
-
Установите SSL-сертификат:
Linux (Bash)/macOS (Zsh)Windows (PowerShell)mkdir -p ~/.opensearch && \ wget "https://storage.yandexcloud.net/cloud-certs/CA.pem" \ --output-document ~/.opensearch/root.crt && \ chmod 0600 ~/.opensearch/root.crt
Сертификат будет сохранен в файле
~/.opensearch/root.crt
.mkdir $HOME\.opensearch; curl --output $HOME\.opensearch\root.crt https://storage.yandexcloud.net/cloud-certs/CA.pem
Сертификат будет сохранен в файле
$HOME\.opensearch\root.crt
.Корпоративные политики и антивирус могут блокировать скачивание сертификата. Подробнее см. в разделе Вопросы и ответы.
-
Убедитесь, что вы можете подключиться к кластеру-приемнику Managed Service for OpenSearch с помощью OpenSearch API и Dashboards.
-
Убедитесь, что у кластера-источника Elasticsearch есть доступ в интернет.
-
Создайте в кластере-источнике пользователя
с ролямиmonitoring_user
иviewer
.
Настройте кластер-приемник
-
Создайте роль
с привилегиямиcreate_index
иwrite
для всех индексов (*
). -
Создайте пользователя и назначьте ему эту роль.
Совет
В кластерах Managed Service for OpenSearch вы можете использовать переиндексацию от имени пользователя
admin
, имеющего рольsuperuser
, но безопаснее для каждой задачи создавать отдельных пользователей с ограниченными привилегиями. Подробнее см. в разделе Управление пользователями OpenSearch.
Запустите переиндексацию
-
Получите список хостов кластера-приемника.
-
Для запуска переиндексации выполните запрос к хосту с ролью
DATA
в кластере-приемнике:curl --user <имя_пользователя_в_кластере-приемнике>:<пароль_пользователя_в_кластере-приемнике> \ --cacert ~/.opensearch/root.crt \ --request POST \ "https://<идентификатор_хоста_OpenSearch_с_ролью_DATA>.mdb.yandexcloud.net:9200/_reindex?wait_for_completion=false&pretty" \ --header 'Content-Type: application/json' \ --data '{ "source": { "remote": { "host": "https://<IP-адрес_или_FQDN_хоста_с_ролью_DATA_в_кластере-источнике>:9200", "username": "<имя_пользователя_в_кластере-источнике>", "password": "<пароль_пользователя_в_кластере-источнике>" }, "index": "<имя_индекса_псевдонима_или_потока_данных_в_кластере-источнике>" }, "dest": { "index": "<имя_индекса_псевдонима_или_потока_данных_в_кластере-приемнике>" } }'
Результат:
{ "task" : "<идентификатор_задачи_переиндексации>" }
Чтобы перенести несколько индексов, используйте цикл
for
:for index in <имена_индексов_псевдонимов_или_потоков_данных_разделенные_пробелами>; do curl --user <имя_пользователя_в_кластере-приемнике>:<пароль_пользователя_в_кластере-приемнике> \ --cacert ~/.opensearch/root.crt \ --request POST \ "https://<идентификатор_хоста_OpenSearch_с_ролью_DATA>.mdb.yandexcloud.net:9200/_reindex?wait_for_completion=false&pretty" \ --header 'Content-Type: application/json' \ --data '{ "source": { "remote": { "host": "https://<IP-адрес_или_FQDN_хоста_с_ролью_DATA_в_кластере-источнике>:9200", "username": "<имя_пользователя_в_кластере-источнике>", "password": "<пароль_пользователя_в_кластере-источнике>" }, "index": "'$index'" }, "dest": { "index": "'$index'" } }' done
Результат:
{ "task" : "<идентификатор_задачи_переиндексации_1>" } { "task" : "<идентификатор_задачи_переиндексации_2>" } ...
Подробнее о параметрах переиндексации см. в документации OpenSearch
.Процесс переиндексации может занять длительное время. Чтобы проверить статус операции, выполните команду:
curl --user <имя_пользователя_в_кластере-приемнике>:<пароль_пользователя_в_кластере-приемнике> \ --cacert ~/.opensearch/root.crt \ --request GET \ "https://<идентификатор_хоста_OpenSearch_с_ролью_DATA>.mdb.yandexcloud.net:9200/_tasks/<идентификатор_задачи_переиндексации>"
-
Чтобы отменить операцию переиндексации, выполните команду:
curl --user <имя_пользователя_в_кластере-приемнике>:<пароль_пользователя_в_кластере-приемнике> \ --cacert ~/.opensearch/root.crt \ --request POST \ "https://<идентификатор_хоста_OpenSearch_с_ролью_DATA>.mdb.yandexcloud.net:9200/_tasks/<идентификатор_задачи_переиндексации>/_cancel"
Проверьте результат
Убедитесь, что все нужные индексы перенесены в кластер-приемник Managed Service for OpenSearch, а количество документов в них такое же как и в кластере-источнике:
Выполните команду:
curl \
--user <имя_пользователя_в_кластере-приемнике>:<пароль_пользователя_в_кластере-приемнике> \
--cacert ~/.opensearch/root.crt \
--request GET 'https://<идентификатор_хоста_OpenSearch_с_ролью_DATA>.mdb.yandexcloud.net:9200/_cat/indices?v'
В списке должны быть перенесенные индексы из Elasticsearch с количеством документов в столбце docs.count
.
- Подключитесь к кластеру-приемнику с помощью OpenSearch Dashboards.
- Выберите общий тенант
Global
. - Откройте панель управления, нажав на значок
. - В разделе OpenSearch Plugins выберите Index Management.
- Перейдите в раздел Indices.
В списке должны быть перенесенные индексы из Elasticsearch с количеством документов в столбце Total documents.
Удалите созданные ресурсы
Некоторые ресурсы платные. Чтобы за них не списывалась плата, удалите ресурсы, которые вы больше не будете использовать:
-
Удалите объекты из бакета.
-
Удалите ресурсы в зависимости от способа их создания:
ВручнуюС помощью Terraform-
В терминале перейдите в директорию с планом инфраструктуры.
Важно
Убедитесь, что в директории нет Terraform-манифестов с ресурсами, которые вы хотите сохранить. Terraform удаляет все ресурсы, которые были созданы с помощью манифестов в текущей директории.
-
Удалите ресурсы:
-
Выполните команду:
terraform destroy
-
Подтвердите удаление ресурсов и дождитесь завершения операции.
Все ресурсы, которые были описаны в Terraform-манифестах, будут удалены.
-
-
-
Если вы зарезервировали для доступа к кластеру публичные статические IP-адреса, освободите и удалите их.