Переход на Opensearch вручную

Внимание

Дисклеймер.

Инструкция содержит примерный порядок действий по переходу с Elasticsearch на Opensearch. Инструкция призвана описать логику действий по обновлению на простом абстрактном примере. В зависимости от инфраструктуры сервера (кластера) и его конфигурации вам могут понадобиться дополнительные/иные шаги.

Эта инструкция не должна восприниматься буквально, а использоваться в качестве основы действий.

При старте системы требуется проверить backend лог на предмет ошибок ERROR. В случае их наличия - обратитесь к разработчику.

Переход с потерей данных

  1. Установите Opensearch согласно инструкции по установке для ОС Ubuntu, Astra Linux без SSL или Astra Linux с SSL.

  2. Перенесите настройки из файла elasticsearch.yml в opensearch.yml.

  3. При необходимости обновите параметры DG: org.universe.dg.search.cluster.nodes, org.universe.dg.search.cluster.address

  4. Поскольку данные не будут перенесены, выполните операцию переиндексации данных, а при наличии правил качества - операцию переприменения данных.

Важные примечания:

  • Если в качестве хранилища для аудита выбран поисковой движок, журнал событий будет утерян — его невозможно восстановить из БД, даже если она также указана в качестве хранилища.

Переход с переносом данных

Перед обновлением системы Юниверс необходимо сделать слепок индексов Elasticsearch. Рекомендуется выполнить этот шаг, чтобы иметь бэкап состояния поискового узла. Подробности см. в официальной документации Elaticsearch.

Слепок индексов

  1. Снимите слепок Elasticsearch согласно инструкции "Резервное копирование поискового индекса".

  2. Далее выполните обновление согласно инструкции "Переход с потерей данных" (см. выше).

  3. Используйте слепок для восстановления данных в opensearch. Укажите путь к хранилищу в opensearch.yml:

    path.repo: /mount/backups
    
  4. Добавьте репозиторий в конфигурацию кластера. Пример выполнения из консоли с помощью утилиты curl:

    $ curl -XPUT 'localhost:9200/_snapshot/universe_indices_backup' -d '{ "type" : "fs", "settings" : { "compress" : true, "location": "<путь к директории репозитория из настроек>/universe_indices_backup" } }'
    
  • Если путь к директории репозитория был указан в path.repo, его не требуется включать в вышеуказанную команду. В таком случае команда будет иметь вид:

    curl -XPUT 'localhost:9200/_snapshot/universe_indices_backup' -d '{ "type" : "fs", "settings" : { "compress" : true, "location" : "universe_indices_backup" }}'
    
  1. Проверьте успешность выполнения предыдущего шага (в результате выполнения команды на экране должны отобразится текущие настройки репозитория):

    $ curl -XGET 'localhost:9200/_snapshot/universe_indices_backup'
    
  2. Закройте текущие индексы:

    $ curl -XPOST 'localhost:9200/_all/_close'
    

Количество частей (Shards) индекса в снапшоте и в кластере должны совпадать, в противном случае восстановление завершится с ошибкой. Требование не распространяется на пустые кластеры.

  1. В случае, если имя текущих снапшотов неизвестно, используйте команду:

    $ curl -XGET 'localhost:9200/_snapshot/_all'
    
  2. Восстановите снапшот. Пример команды для снапшота с именем snapshot_1:

    $ curl -XPOST 'localhost:9200/_snapshot/universe_indices_backup/snapshot_1/_restore'
    

Примечания:

Представленный вариант применим в т.ч, если Elasticsearch развернут в docker — достаточно пробросить локальное хранилище и конфигурационный файл через docker volume.

Фрагмент docker-compose для Opensearch:

volumes:
- dg-opensearch-data:/usr/share/opensearch/data
- ./hunspell:/usr/share/opensearch/config/hunspell/
- ./opensearch.yml:/usr/share/opensearch/config/opensearch.yml
- ./backups:/mount/backups

Миграция кластера

Представленный вариант подразумевает ручной перенос настроек и данных для каждого узла.

Доступно два варианта:

  • Остановить кластер, выполнить перенос для каждого узла и запустить весь кластер (cluster restart upgrade);

  • Поделать процесс для каждого узла отдельно — в этом случае поисковый движок будет активен во время обновления (rolling upgrade).

  1. Установите Opensearch согласно инструкции по установке, при этом директории Elasticsearch не должны быть затерты.

  2. Отключите аллоцирование шардов:

    curl -X PUT "localhost:9200/_cluster/settings" -H 'Content-Type: application/json' -d'
    {
      "persistent": {
        "cluster.routing.allocation.enable": "primaries"
      }
    }
    
  3. Остановите Elasticsearch на одном узле (rolling upgrade) или на всех (cluster restart upgrade):

    sudo systemctl stop elasticsearch.service
    
  4. Выполните переход на одном узле (rolling) или на всех (cluster restart):

    • Скопируйте данные и логи Elasticsearch (содержимое директорий data и logs) в аналогичные директории Opensearch. Например, sudo cp -r /usr/share/elasticsearch/data /usr/share/opensearch/data && chown -R opensearch:opensearch

    • Портируйте настройки из elasticsearch.yml в opensearch.yml.

  5. Запустите OpenSearch на одном узле (rolling) или на всех (cluster restart):

    sudo systemctl start opensearch
    
  6. Rolling - повторите шаги 3–5 до полного перехода всего кластера на OpenSearch.

  7. Включите аллоцирование шардов обратно:

    curl -X PUT "localhost:9200/_cluster/settings" -H 'Content-Type: application/json' -d'
    {
     "persistent": {
        "cluster.routing.allocation.enable": "all"
      }
    }
    

Шаг 3 может быть выполнен автоматически через утилиту opensearch-upgrade:

  1. Установите Opensearch согласно инструкции по установке.

  2. Отключите аллоцирование шардов:

    curl -X PUT "localhost:9200/_cluster/settings" -H 'Content-Type: application/json' -d'
    {
      "persistent": {
        "cluster.routing.allocation.enable": "primaries"
      }
    }
    
  3. Проверьте, что заданы переменные окружения: ES_HOME, ES_PATH_CONF, OPENSEARCH_HOME, OPENSEARCH_PATH_CONF.

  4. Исполните утилиту от имени пользователя, запустившего Elasticsearch:

    /usr/share/opensearch/bin/opensearch-upgrade
    
  5. Остановите Elasticsearch на узле:

    sudo systemctl stop elasticsearch.service
    
  6. Запустите Opensearch на узле:

    sudo systemctl start opensearch
    
  7. Повторите шаги 3–6 до полного перехода на Opensearch.

  8. Включите аллоцирование шардов обратно:

    curl -X PUT "localhost:9200/_cluster/settings" -H 'Content-Type: application/json' -d'
    {
     "persistent": {
        "cluster.routing.allocation.enable": "all"
      }
    }
    

Сохранение данных аудита

Для сохранения данных аудита при переходе на Opensearch проделайте следующие действия:

  1. Остановите приложение, если оно запущено, чтобы в данные не вносились изменения.

  2. Создайте индекс default_default_audit read-only с помощью запроса:

    PUT http://OPEN_SEARCH_HOST:OPEN_SEARCH_PORT/default_default_audit/_settings
    
    {
      "settings": {
        "index.blocks.write": true
      }
    }
    
  3. Клонируйте индекс default_default_audit с данными во временный индекс default_default_audit_old_index_copy с помощью запроса:

    PUT http://OPEN_SEARCH_HOST:OPEN_SEARCH_PORT/default_default_audit/_clone/default_default_audit_old_index_copy/
    
  4. Проверьте, что индекс default_default_audit_old_index_copy создался и содержит все нужные данные.

  5. Удалите индекс default_default_audit с помощью запроса:

    DELETE http://OPEN_SEARCH_HOST:OPEN_SEARCH_PORT/default_default_audit
    
  6. Запустите сервер с приложением и дождитесь выполнения запуска. Должен создаться новый индекс default_default_audit.

  7. Копируйте данные из копии индекса default_default_audit_old_index_copy в новый индекс default_default_audit.

    • Если данных в журнале много, то копирование может занять значительное время. Данные будут постепенно переноситься в журнал, работа в системе в это время будет доступна.

  8. Выполните запрос:

    POST http://OPEN_SEARCH_HOST:OPEN_SEARCH_PORT/_reindex/
    
    • В теле запроса должен присутствовать следующий JSON:

      {
        "source": {
          "index": "default_default_audit_old_index_copy"
        },
        "dest": {
          "index": "default_default_audit"
        }
      }
      
  9. Проверьте, что данные перенеслись в индекс default_default_audit.

  10. Зайдите в раздел "Журнал" и проверьте наличие в журнале записей до обновления.

  11. Опционально: Если шаги выполнены корректно, то можно удалить копию индекса default_default_audit_old_index_copy с помощью запроса:

    DELETE http://OPEN_SEARCH_HOST:OPEN_SEARCH_PORT/default_default_audit_old_index_copy