Миграция в Managed Service for Elasticsearch с помощью снапшотов
Важно
Сервис Yandex Managed Service for Elasticsearch недоступен с 11 апреля 2024 года.
Вы можете создать кластер OpenSearch в Yandex Cloud в качестве альтернативы Elasticsearch.
Кластер Managed Service for Elasticsearch поддерживает механизм снапшотов. Это позволяет мигрировать в него данные из другого кластера Elasticsearch. Подробнее о механизме снапшотов см. в документации Elasticsearch
Чтобы мигрировать данные из кластера-источника Elasticsearch в кластер-приемник Managed Service for Elasticsearch:
- Подготовьте рабочее окружение.
- Создайте снапшот на кластере-источнике.
- Восстановите снапшот в кластере-приемнике.
- Закончите миграцию.
Если используемые ресурсы вам больше не нужны, удалите их.
Важно
Использовать снапшот невозможно, если версия Elasticsearch в кластере-источнике выше, чем в кластере-приемнике. Например, не получится восстановить снапшот кластера Elasticsearch 7.13 в кластере Managed Service for Elasticsearch 7.11.
Подготовьте рабочее окружение
Создайте необходимые ресурсы
-
Создайте бакет Object Storage с ограниченным доступом. Этот бакет будет использоваться в качестве репозитория снапшотов.
-
Создайте сервисный аккаунт и назначьте ему роль
storage.editor
. Сервисный аккаунт необходим для доступа к бакету из кластера-источника и кластера-приемника. -
Создайте статический ключ доступа для этого сервисного аккаунта.
Важно
Сохраните идентификатор ключа и секретный ключ. Они понадобятся позднее.
-
Создайте кластер-приемник Managed Service for Elasticsearch нужной вам конфигурации со следующими настройками:
- публичный доступ к хостам;
- версия Elasticsearch не ниже чем на кластере-источнике.
Перед созданием кластера-приемника проверьте совместимость
кластера-источника и выбранной версии кластера-приемника. -
Установите плагин
repository-s3
в кластер-приемник.
-
Если у вас еще нет Terraform, установите его.
-
Получите данные для аутентификации. Вы можете добавить их в переменные окружения или указать далее в файле с настройками провайдера.
-
Настройте и инициализируйте провайдер. Чтобы не создавать конфигурационный файл с настройками провайдера вручную, скачайте его
. -
Поместите конфигурационный файл в отдельную рабочую директорию и укажите значения параметров. Если данные для аутентификации не были добавлены в переменные окружения, укажите их в конфигурационном файле.
-
Скачайте в ту же рабочую директорию файл конфигурации mes-migration.tf
. В файле описаны:- сеть;
- подсеть;
- группа безопасности и правила, необходимые для доступа к кластеру-приемнику Managed Service for Elasticsearch;
- сервисный аккаунт
sa-mes-cluster
, необходимый для создания кластера Managed Service for Elasticsearch; - сервисный аккаунт
sa-bucket
для работы с бакетом Object Storage. - кластер-приемник с установленным плагином repository-s3
;
-
Укажите в файле конфигурации
mes-migration.tf
в блокеlocals
:- идентификатор каталога;
- пароль для пользователя
admin
; - редакцию кластера-приемника;
- версию кластера-приемника;
- имя бакета Object Storage.
-
Проверьте корректность файлов конфигурации Terraform с помощью команды:
terraform validate
Если в файлах конфигурации есть ошибки, Terraform на них укажет.
-
Создайте необходимую инфраструктуру:
-
Выполните команду для просмотра планируемых изменений:
terraform plan
Если конфигурации ресурсов описаны верно, в терминале отобразится список изменяемых ресурсов и их параметров. Это проверочный этап: ресурсы не будут изменены.
-
Если вас устраивают планируемые изменения, внесите их:
-
Выполните команду:
terraform apply
-
Подтвердите изменение ресурсов.
-
Дождитесь завершения операции.
-
В указанном каталоге будут созданы все требуемые ресурсы. Проверить появление ресурсов и их настройки можно в консоли управления
. -
-
Создайте статический ключ доступа для сервисного аккаунта
sa-bucket
.Важно
Сохраните идентификатор ключа и секретный ключ. Они понадобятся позднее.
Завершите настройку и проверьте доступ к ресурсам
-
Настройте ACL для бакета:
- В выпадающем списке Выберите пользователя укажите созданный ранее сервисный аккаунт.
- Задайте разрешения
READ и WRITE
для выбранного сервисного аккаунта. - Нажмите кнопку Добавить.
- Нажмите кнопку Сохранить.
-
Установите плагин
repository-s3
на все хосты кластера-источника. -
Чтобы плагин
repository-s3
заработал, перезапустите сервисы Elasticsearch и Kibana на всех хостах кластера-источника. -
Убедитесь, что вы можете подключиться к кластеру-приемнику Managed Service for Elasticsearch с помощью Elasticsearch API и Kibana.
-
Убедитесь, что у кластера-источника 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 -X POST "https://<FQDN_кластера-источника>:9200/_nodes/reload_secure_settings"
-
Зарегистрируйте репозиторий:
curl "https://<FQDN_кластера-источника>:9200/_snapshot/<имя_репозитория>" \ -X PUT \ -H 'Content-Type: application/json' -d ' { "type": "s3", "settings": { "bucket": "<имя_бакета>", "endpoint": "storage.yandexcloud.net" } }'
Подробнее о подключении репозитория см. в документации плагина
.Внимание
Если бакет зарегистрирован в кластере Elasticsearch как репозиторий снапшотов, не изменяйте содержимое бакета вручную — это нарушит работу механизма снапшотов Elasticsearch.
-
-
Запустите создание снапшота на кластере-источнике. Можно создать снапшот всего кластера или части данных. Разместите снапшот в репозитории, созданном на предыдущем шаге. Подробнее см. в документации Elasticsearch
.Пример создания снапшота с именем
snapshot_1
для всего кластера:curl -X PUT \ "https://<FQDN_кластера-источника>:9200/_snapshot/<имя_репозитория>/snapshot_1?wait_for_completion=true&pretty"
Процесс создания снапшота может занять длительное время. Отслеживайте ход выполнения операции с помощью инструментов Elasticsearch
, например:curl -X GET \ "https://<FQDN_кластера-источника>:9200/_snapshot/<имя_репозитория>/snapshot_1/_status?pretty"
Восстановите снапшот в кластере-приемнике
-
Настройте доступ к бакету со снапшотами для кластера-приемника. Используйте созданный ранее сервисный аккаунт.
-
Подключите к кластеру-приемнику бакет Object Storage в качестве хранилища снапшотов:
curl "https://admin:<пароль_пользователя_admin>@<FQDN_кластера-приемника>:9200/_snapshot/<имя_репозитория>" \ -X PUT \ -H 'Content-Type: application/json' -d ' { "type": "s3", "settings": { "bucket": "<имя_бакета>", "endpoint": "storage.yandexcloud.net" } }'
-
Выберите способ восстановления индексов на кластере-приемнике:
При настройках по умолчанию попытка восстановления индекса завершится неудачей, если в кластере уже открыт индекс с тем же именем. Даже если кластер Managed Service for Elasticsearch не содержит пользовательских данных, в нем есть открытые системные индексы (такие как
.apm-custom-link
,.kibana_*
и другие), что может помешать восстановлению. Чтобы этого избежать, воспользуйтесь одной из политик восстановления:-
Только пользовательские индексы — существующие системные индексы не переносятся, в процессе импорта участвую только индексы, созданные на кластере-источнике пользователем.
-
Delete and restore
— существующие индексы закрываются и удаляются, вместо них создаются новые пустые с такими же именами, после чего наполняются данными из снапшота. -
Rename on restore
— существующие индексы не затрагиваются, создаются новые с измененными именами. Данные из снапшота восстанавливаются в новые индексы.
Важно
Закрытие всех индексов приведет к временной неработоспособности Kibana. После того как будут открыты системные индексы, Kibana вновь станет доступна.
Например, эта команда закроет все индексы в кластере-приемнике:
curl -X POST \ "https://admin:<пароль_пользователя_admin>@<FQDN_кластера-приемника>:9200/_all/_close?pretty"
Пример восстановления снапшота целиком:
curl -X POST \ "https://admin:<пароль_пользователя_admin>@<FQDN_кластера-приемника>:9200/_snapshot/<имя_репозитория>/snapshot_1/_restore"
-
-
Запустите восстановление из снапшота на кластере-приемнике. Можно восстановить весь снапшот или отдельные индексы. Подробнее см. в документации Elasticsearch
.Пример восстановления снапшота с указанием пользовательских индексов, которые нужно восстановить в кластере-приемнике:
curl -X POST \ -H 'Content-Type: application/json' 'https://admin:<пароль_пользователя_admin>@<FQDN_кластера-приемника>:9200/_snapshot/<имя_репозитория>/snapshot_1/_restore' -d ' { "indices": "<список_индексов>" }'
Где
список индексов
— список восстанавливаемых индексов через запятую, напримерmy_index*, my_index_2.*
. Перенос только пользовательских индексов позволит избежать ошибок при восстановлении снапшота — системные индексы не затрагиваются.Процесс восстановления может занять длительное время. Отслеживайте ход выполнения операции с помощью инструментов Elasticsearch
, например:curl -X GET \ "https://admin:<пароль_пользователя_admin>@<FQDN_кластера-приемника>:9200/_snapshot/<имя_репозитория>/snapshot_1/_status?pretty"
-
При необходимости после завершения операции восстановления откройте все закрытые индексы
.Например, эта команда откроет все индексы в кластере-приемнике:
curl -X POST \ "https://admin:<пароль_пользователя_admin>@<FQDN_кластера-приемника>:9200/_all/_open?pretty"
Закончите миграцию
-
Убедитесь, что все нужные данные перенесены в кластер-приемник Managed Service for Elasticsearch.
Это можно сделать, например, с помощью Kibana.
-
При необходимости отключите репозиторий снапшотов
на стороне кластера-источника и кластера-приемника.
Удалите созданные ресурсы
Некоторые ресурсы платные. Чтобы за них не списывалась плата, удалите ресурсы, которые вы больше не будете использовать:
- Удалите сервисный аккаунт
- Удалите снапшоты из бакета и затем удалите бакет целиком.
- Удалите кластер Managed Service for Elasticsearch.
-
В терминале перейдите в директорию с планом инфраструктуры.
Важно
Убедитесь, что в директории нет Terraform-манифестов с ресурсами, которые вы хотите сохранить. Terraform удаляет все ресурсы, которые были созданы с помощью манифестов в текущей директории.
-
Удалите ресурсы:
-
Выполните команду:
terraform destroy
-
Подтвердите удаление ресурсов и дождитесь завершения операции.
Все ресурсы, которые были описаны в Terraform-манифестах, будут удалены.
-