В этой статье мы сосредоточимся на обновлении Elasticsearch 7.17 до Elasticsearch 8.x. Более подробную информацию об обновлении версий в целом, различных доступных методах и обо всем, что необходимо знать перед началом обновления, вы можете найти в нашем полном руководстве здесь: Как обновлять версии Elasticsearch.
Скользящее обновление поддерживается только с версии Elasticsearch 7.17 до версии Elasticsearch 8.x. Для обновления с более ранних версий (7.1, 7.2 и т. д.) до версии 8 требуется полный перезапуск кластера или сначала обновление до версии 7.17 перед обновлением до версии 8.
Подготовка к обновлению узлов Elasticsearch
Узлы Elasticsearch не могут быть понижены после обновления. Перед началом процесса обновления необходимо выполнить следующие действия:
Используйте помощник по обновлению Kibana
Помощник по обновлению Kibana очень полезен, поскольку он может указать:
- Индексы, которые несовместимы с версией 8 и должны быть переиндексированы.
- Настройки в elasticsearch.yml и/или kibana.yml, которые устарели и должны быть обновлены/заменены.
- Настройки кластера, несовместимые с версией 8.
Проверьте журнал устаревания
Вы должны прочитать и устранить все проблемы, отмеченные в журнале исправлений. Эти журналы обычно находятся в:
1 | /var/log/elasticsearch/Your-Cluster-Name_deprecation.log |
Обзор изменений
Документация об изменениях публикуется с каждой новой версией Elasticsearch, чтобы вы знали о функциональности, которая может измениться или исчезнуть. Вы всегда должны проверять эту документацию, чтобы убедиться, что ни один из этих параметров, конфигураций или сопоставлений не используется в вашей системе. Основными вещами, которые могут быть затронуты, являются:
- Конфигурация узла (elasticsearch.yml)
- Сопоставления и шаблоны индексов
- Настройки кластера
- Код, используемый в клиентах Elasticsearch (приложения и скрипты индексирования)
Наиболее важными изменениями в версии 8 являются:
- Doc_types устарели, и все ссылки на них должны быть удалены
- Безопасность включена по умолчанию
- Kibana больше не может использовать пользователя "elastic", у нее должен быть свой собственный пользователь "kibana_system"
- Изменился синтаксис Python-клиента, например, вместо "body" нужно передавать отдельные аргументы для "query", "aggs", "sort" и т. д.
Проверьте совместимость плагинов Elasticsearch
Если вы используете какие-либо плагины Elasticsearch, вам следует проверить их наличие и совместимость с новой версией.
В частности, имейте в виду, что большинство плагинов для хранилища моментальных снимков теперь входят в стандартный дистрибутив и не требуют установки плагинов.
Настройте тестовую среду
Сначала следует опробовать процесс обновления в тестовой или промежуточной среде, чтобы проверить и устранить все проблемы перед обновлением производственного кластера.
Создайте резервную копию данных
Помните, что понизить версию узла Elasticsearch невозможно, поэтому единственный способ практически отменить неудачное обновление - это создать новый кластер со старой версией и восстановить данные из снимков. Поэтому перед началом процесса обновления необходимо сделать снимки всех индексов Elasticsearch.
Проверьте конфигурацию безопасности
Безопасность включена по умолчанию в версии 8, поэтому, если у вас НЕ включена безопасность в версии 7, рекомендуется либо настроить безопасность в версии 7 перед обновлением, либо установить:
1 | xpack.security.enabled: false |
Не рекомендуется пытаться добавить безопасность и обновить систему в одном и том же процессе, поскольку добавление tls-сертификатов приведет к некоторому простою.
Обратите внимание, что Kibana часто требует дополнительной настройки безопасности, которую следует выполнить ДО обновления. Подробнее об этом вы можете прочитать ниже.
После выполнения всех перечисленных выше действий мы готовы обновить Elasticsearch Cluster версии 7.17.5 до Elasticsearch версии 8.3.3.
Правильный порядок обновления узлов
- Начните с обновления узлов, не имеющих права на мастер. Чтобы найти такие узлы, используйте вызов API GET /_nodes/_all,master:false/_none или найдите узлы, настроенные с параметром node.master: false.
- Выполните обновление на каждом уровне, начиная с замороженного уровня. Завершите обновление для всех узлов каждого уровня данных, прежде чем переходить к следующему. Сначала обновите замороженный уровень, затем холодный, теплый и, наконец, горячий. Это гарантирует, что во время обновления данные по-прежнему будут проходить через уровни. Чтобы получить список узлов в определенном ярусе, используйте запрос GET /_nodes. Например, GET /_nodes/data_frozen:true/_none.
- Наконец, обновите узлы, отвечающие требованиям мастера. Получите список этих узлов с помощью запроса GET /_nodes/master:true.
Соблюдение этого порядка гарантирует, что все узлы смогут присоединиться к кластеру во время процесса обновления. Обновленные узлы могут присоединиться к кластеру со старым мастером, но старые узлы могут не присоединиться к кластеру с обновленным мастером.
Обновление узлов в рамках скользящего обновления
Как обновить узлы Elasticsearch в рамках скользящего обновления:
- Убедитесь, что ваш кластер стабилен.
- Вам нужно убедиться, что все реплики доступны, чтобы отключение узла не привело к потере данных.
Отключите ненужную индексацию - Там, где это практически возможно, следует остановить все процессы индексирования, поскольку это повысит стабильность кластера.
Отключить распределение шардов - Важно остановить перераспределение шардов, чтобы при остановке узла для обновления кластер не перераспределил шарды на другой узел (см. команду ниже).
Остановите Elasticsearch - Удалите старые плагины, особенно плагины репозитория.
- Если вы не удалите плагины репозитория перед обновлением, это может быть сложно исправить.
Обновление Elasticsearch - Метод, используемый для обновления, зависит от метода установки.
Обновление плагинов - Elasticsearch не запустится, если плагин не соответствует версии Elasticsearch.
Запустить Elasticsearch - Повторно включите распределение шардов
Используйте команду, приведенную ниже.
Проверьте, что обновленный узел снова присоединился к кластеру. - С помощью приведенной ниже команды вы можете проверить, сколько узлов находится в кластере.
Дождитесь, пока статус кластера станет зеленым - Команда, представленная ниже, также покажет вам прогресс процесса восстановления шардов на обновленном узле, пока кластер не станет зеленым.
Не торопитесь обновлять узлы, дождитесь полного восстановления кластера, прежде чем двигаться дальше. Если кластер не становится зеленым, посмотрите в журналах, чтобы найти любые проблемы, которые могут указывать на проблемы с обновлением или конфигурацией.
Повторите - Повторите весь описанный выше процесс для каждого узла.
Примеры команд
Чтобы остановить узел, выполните команду:
1 | systemctl stop elasticsearch |
Чтобы отключить выделение шардов, выполните команду:
1 2 3 4 5 6 | PUT _cluster/settings { "persistent": { "cluster.routing.allocation.enable": "primaries" } } |
Чтобы удалить плагины, например, s3:
1 | sudo bin/elasticsearch-plugin remove repository-s3 |
Чтобы перезагрузить демон после обновления:
1 2 | systemctl daemon-reload systemctl enable elasticsearch |
Чтобы снова включить распределение шардов, выполните команду:
1 2 3 4 5 6 | PUT _cluster/settings { "persistent": { "cluster.routing.allocation.enable": null } } |
Чтобы получить статус кластера и узнать, сколько узлов в нем находится, воспользуйтесь командой:
1 | GET _cluster/health |
Проблема устаревания Kibana
При обновлении кластера Elasticsearch часто возникает следующая ошибка:
1 | Using ‘elasticsearch.username’ elastic is deprecated |
Чтобы решить эту проблему, выполните следующую команду ДО обновления кластера Elasticsearch:
1 | POST /_security/service/elastic/kibana/credential/token |
Это приведет к следующему результату:
1 2 3 4 5 6 7 | { "created" : true, "token" : { "name" : "token_NHoHZYIB67fR10103kQc", "value" : "AAEFAWVsYXN0aWMva2liYW5hL3Rva2VuX05Ib0haWUlCNjdmUjEwMTAza1FjOkFtMnlQcjB1UmNDZWU3WUIxSVJDa1E" } } |
Затем скопируйте это значение и добавьте приведенную ниже конфигурацию в файл kibana.yml:
1 | elasticsearch.serviceAccountToken:AAEFAWVsYXN0aWMva2liYW5hL3Rva2VuX05Ib0haWUlCNjdmUjEwMTAza1FjOkFtMnlQcjB1UmNDZWU3WUIxSVJDa1E" |
А затем удалите эти строки конфигурации из файла kibana.yml:
1 2 | elasticsearch.username: "elastic" elasticsearch.password: "password" |
После этого следует перезапустить Kibana и убедиться, что она по-прежнему может подключаться и что проблема устранена из помощника по обновлению Kibana.