Миграция данных из Elasticsearch в Yandex Managed Service for OpenSearch
Перенести данные из кластера-источника Elasticsearch в кластер-приемник Yandex Managed Service for OpenSearch можно с помощью двух механизмов:
-
Снапшотов (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
.
- Плагин —
Завершите настройку и проверьте доступ к ресурсам
-
Настройте ACL для бакета:
- В выпадающем списке Выберите пользователя укажите созданный ранее сервисный аккаунт.
- Задайте разрешения
READ и WRITE
для выбранного сервисного аккаунта. - Нажмите кнопку Добавить.
- Нажмите кнопку Сохранить.
-
Настройте кластер-источник Elasticsearch:
Сторонний кластер ElasticsearchManaged Service for Elasticsearch-
Установите плагин
repository-s3
на все хосты кластера. -
Чтобы плагин
repository-s3
заработал, перезапустите сервисы Elasticsearch и Kibana на всех хостах кластера. -
Убедитесь, что у кластера-источника Elasticsearch есть доступ в интернет.
-
Установите плагин
repository-s3
. -
Убедитесь, что вы можете подключиться к кластеру-источнику с помощью Elasticsearch API и Kibana.
-
-
Убедитесь, что вы можете подключиться к кластеру-приемнику Managed Service for OpenSearch с помощью OpenSearch API и Dashboards.
Создайте снапшот на кластере-источнике
-
Подключите бакет в качестве репозитория снапшотов на кластере-источнике:
Сторонний кластер ElasticsearchManaged Service for Elasticsearch-
Добавьте сведения о ключе статического доступа в хранилище ключей (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" } }'
Выполните команду:
curl --request PUT \ "https://admin:<пароль пользователя admin>@<IP адрес или FQDN хоста с ролью DATA в кластере-источнике>:9200/_snapshot/<имя репозитория>" \ --cacert ~/.elasticsearch/root.crt \ --header 'Content-Type: application/json' \ --data '{ "type": "s3", "settings": { "bucket": "<имя бакета>", "endpoint": "storage.yandexcloud.net" } }'
Подробнее о подключении репозитория см. в документации плагина.
Внимание
Если бакет зарегистрирован в кластере Elasticsearch как репозиторий снапшотов, не изменяйте содержимое бакета вручную — это нарушит работу механизма снапшотов Elasticsearch.
-
-
Запустите создание снапшота в репозитории, созданном на предыдущем шаге. Можно создать снапшот всего кластера или части данных. Подробнее см. в документации Elasticsearch.
Пример создания снапшота с именем
snapshot_1
для всего кластера:Сторонний кластер ElasticsearchManaged Service for Elasticsearchcurl --request PUT \ "https://<IP адрес или FQDN хоста с ролью DATA в кластере-источнике>:9200/_snapshot/<имя репозитория>/snapshot_1?wait_for_completion=false&pretty"
curl --request PUT \ "https://admin:<пароль пользователя admin>@<IP адрес или FQDN хоста с ролью DATA в кластере-источнике>:9200/_snapshot/<имя репозитория>/snapshot_1?wait_for_completion=false&pretty" \ --cacert ~/.elasticsearch/root.crt
Процесс создания снапшота может занять длительное время. Отслеживайте ход выполнения операции с помощью инструментов Elasticsearch, например:
Сторонний кластер ElasticsearchManaged Service for Elasticsearchcurl --request GET \ "https://<IP адрес или FQDN хоста с ролью DATA в кластере-источнике>:9200/_snapshot/<имя репозитория>/snapshot_1/_status?pretty"
curl --request GET \ "https://admin:<пароль пользователя admin>@<IP адрес или FQDN хоста с ролью DATA в кластере-источнике>:9200/_snapshot/<имя репозитория>/snapshot_1/_status?pretty" \ --cacert ~/.elasticsearch/root.crt
Восстановите снапшот в кластере-приемнике
-
Настройте доступ к бакету со снапшотами для кластера-приемника. Используйте созданный ранее сервисный аккаунт.
-
Подключите к кластеру-приемнику бакет 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": "<список индексов>" }'
Где
список индексов
— список восстанавливаемых индексов через запятую, например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.
Миграция с помощью переиндексации
Чтобы мигрировать данные из кластера-источника Elasticsearch в кластер-приемник Managed Service for OpenSearch с помощью переиндексации:
Если созданные ресурсы вам больше не нужны, удалите их.
Перед началом работы
-
Создайте кластер-приемник Managed Service for OpenSearch нужной вам конфигурации с публичным доступом к группе хостов с ролью
DATA
. -
Установите SSL-сертификат:
Linux (Bash)Windows (PowerShell)sudo mkdir --parents ~/.opensearch && \ sudo wget "https://storage.yandexcloud.net/cloud-certs/CA.pem" \ --output-document ~/.opensearch/root.crt && \ sudo chmod 0600 ~/.opensearch/root.crt
Сертификат будет сохранен в каталоге
$HOME/.opensearch/root.crt
.mkdir $HOME\.opensearch; curl -o $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.
Удалите созданные ресурсы
Некоторые ресурсы платные. Чтобы за них не списывалась плата, удалите ресурсы, которые вы больше не будете использовать:
- Удалите кластер Managed Service for OpenSearch.
- Если вы зарезервировали для доступа к кластеру публичные статические IP-адреса, освободите и удалите их.