Переход на Opensearch вручную
Предупреждение
Переход с версии 6.11 на 6.12 не требует обновления Opensearch, Tomcat и PostgreSQL. Необходимо выполнить операцию миграции файловых атрибутов и другие стандартные действия
Переход с потерей данных
- Установите Opensearch согласно инструкции по установке. 
- Перенесите настройки из файла elasticsearch.yml в opensearch.yml. 
- При необходимости обновите параметры MDM: org.unidata.mdm.search.cluster.nodes, org.unidata.mdm.search.cluster.address. 
- Поскольку данные не будут перенесены, выполните операцию переиндексации данных, а при наличии правил качества - операцию переприменения данных. 
Важно:
- Если в качестве хранилища для аудита выбран поисковой движок, журнал событий будет утерян — его невозможно восстановить из БД, даже если она также указана в качестве хранилища. 
Переход с переносом данных
Перед обновлением системы Юниверс необходимо сделать слепок индексов Elasticsearch. Рекомендуется выполнить этот шаг, чтобы иметь бэкап состояния поискового узла. Подробности см. в официальной документации Elaticsearch.
Слепок индексов
- Снимите слепок Elasticsearch согласно инструкции "Резервное копирование поискового индекса". 
- Далее выполните обновление согласно инструкции "Переход с потерей данных" (см. выше). 
- Используйте слепок для восстановления данных в opensearch. Укажите путь к хранилищу в opensearch.yml: - path.repo: /mount/backups 
- Добавьте репозиторий в конфигурацию кластера. Пример выполнения из консоли с помощью утилиты 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" }}' 
- Проверьте успешность выполнения предыдущего шага (в результате выполнения команды на экране должны отобразится текущие настройки репозитория): - $ curl -XGET 'localhost:9200/_snapshot/universe_indices_backup' 
- Закройте текущие индексы: - $ curl -XPOST 'localhost:9200/_all/_close' 
Количество частей (Shards) индекса в снапшоте и в кластере должны совпадать, в противном случае восстановление завершится с ошибкой. Требование не распространяется на пустые кластеры.
- В случае, если имя текущих снапшотов неизвестно, используйте команду: - $ curl -XGET 'localhost:9200/_snapshot/_all' 
- Восстановите снапшот. Пример команды для снапшота с именем snapshot_1: - $ curl -XPOST 'localhost:9200/_snapshot/universe_indices_backup/snapshot_1/_restore' 
Примечания:
Представленный вариант применим в т.ч, если Elasticsearch развернут в docker — достаточно пробросить локальное хранилище и конфигурационный файл через docker volume.
Фрагмент docker-compose для Opensearch:
volumes:
- mdm-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). 
- Установите Opensearch согласно инструкции по установке, при этом директории Elasticsearch не должны быть затерты. 
- Отключите аллоцирование шардов: - curl -X PUT "localhost:9200/_cluster/settings" -H 'Content-Type: application/json' -d' { "persistent": { "cluster.routing.allocation.enable": "primaries" } } ' 
- Остановите Elasticsearch на одном узле (rolling upgrade) или на всех (cluster restart upgrade): - sudo systemctl stop elasticsearch.service 
- Выполните переход на одном узле (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. 
 
- Запустите OpenSearch на одном узле (rolling) или на всех (cluster restart): - sudo systemctl start opensearch 
- Rolling - повторите шаги 3–5 до полного перехода всего кластера на OpenSearch. 
- Включите аллоцирование шардов обратно: - curl -X PUT "localhost:9200/_cluster/settings" -H 'Content-Type: application/json' -d' { "persistent": { "cluster.routing.allocation.enable": "all" } } ' 
Шаг 3 может быть выполнен автоматически через утилиту opensearch-upgrade:
- Установите Opensearch согласно инструкции по установке. 
- Отключите аллоцирование шардов: - curl -X PUT "localhost:9200/_cluster/settings" -H 'Content-Type: application/json' -d' { "persistent": { "cluster.routing.allocation.enable": "primaries" } } ' 
- Проверьте, что заданы переменные окружения: ES_HOME, ES_PATH_CONF, OPENSEARCH_HOME, OPENSEARCH_PATH_CONF. 
- Исполните утилиту от имени пользователя, запустившего Elasticsearch: - /usr/share/opensearch/bin/opensearch-upgrade 
- Остановите Elasticsearch на узле: - sudo systemctl stop elasticsearch.service 
- Запустите Opensearch на узле: - sudo systemctl start opensearch 
- Повторите шаги 3–6 до полного перехода на Opensearch. 
- Включите аллоцирование шардов обратно: - curl -X PUT "localhost:9200/_cluster/settings" -H 'Content-Type: application/json' -d' { "persistent": { "cluster.routing.allocation.enable": "all" } } ' 
Сохранение данных аудита
Для сохранения данных аудита при переходе на Opensearch проделайте следующие действия:
- Остановите приложение, если оно запущено, чтобы в данные не вносились изменения. 
- Создайте индекс - default_default_audit read-onlyс помощью запроса:- PUT http://OPEN_SEARCH_HOST:OPEN_SEARCH_PORT/default_default_audit/_settings { "settings": { "index.blocks.write": true } } 
- Клонируйте индекс - 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/ 
- Проверьте, что индекс - default_default_audit_old_index_copyсоздался и содержит все нужные данные.
- Удалите индекс - default_default_auditс помощью запроса:- DELETE http://OPEN_SEARCH_HOST:OPEN_SEARCH_PORT/default_default_audit 
- Запустите сервер с приложением и дождитесь выполнения запуска. Должен создаться новый индекс - default_default_audit.
- Копируйте данные из копии индекса - default_default_audit_old_index_copyв новый индекс- default_default_audit.- Если данных в журнале много, то копирование может занять значительное время. Данные будут постепенно переноситься в журнал, работа в системе в это время будет доступна. 
 
- Выполните запрос: - POST http://OPEN_SEARCH_HOST:OPEN_SEARCH_PORT/_reindex/ - В теле запроса должен присутствовать следующий JSON: - { "source": { "index": "default_default_audit_old_index_copy" }, "dest": { "index": "default_default_audit" } } 
 
- Проверьте, что данные перенеслись в индекс - default_default_audit.
- Зайдите в раздел "Журнал" и проверьте наличие в журнале записей до обновления. 
- Опционально: Если шаги выполнены корректно, то можно удалить копию индекса - default_default_audit_old_index_copyс помощью запроса:- DELETE http://OPEN_SEARCH_HOST:OPEN_SEARCH_PORT/default_default_audit_old_index_copy