Обновляем ElasticSearch и Kibana с 5 до 7 версии
К сожалению, просто обновить пакеты через yum или apt не достаточно — форматы данных в major-версиях отличаются, а автоматическое обновление данных при установке пакетов не предусмотрено.
Поэтому требуется:
- обновить ELK с 5.x до 5.6.16,
- после этого обновить индексы,
- затем обновить ELK до 6.8.0,
- снова обновить индексы,
- и наконец, обновить ELK до 7.1.1.
Обновлять индексы можно двумя путями:
- вручную с помощью прямых запросов к REST API через curl,
- через Веб-интерфейс, предварительно обновив x-pack для kibana и elasticsearch, чтобы в меню Management появился пункт Upgrade Assistant.
Мы выбрали второй вариант, как более наглядный.
Обновление до 5.6.16
- Останавливаем ElasticSearch и Kibana:
systemctl stop kibana systemctl stop elasticsearch
- Проверяем содержимое файла /etc/yum.repos.d/elasticsearch.repo и убеждаемся, что репозитории для всех версий настроены верно:
[elasticsearch-2.x] name=Elasticsearch repository for 2.x packages baseurl=http://packages.elastic.co/elasticsearch/2.x/centos gpgcheck=1 gpgkey=http://packages.elastic.co/GPG-KEY-elasticsearch enabled=0 [elasticsearch-5.x] name=Elasticsearch repository for 5.x packages baseurl=https://artifacts.elastic.co/packages/5.x/yum gpgcheck=1 gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch enabled=1 autorefresh=1 type=rpm-md [elasticsearch-6.x] name=Elasticsearch repository for 6.x packages baseurl=https://artifacts.elastic.co/packages/6.x/yum gpgcheck=1 gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch enabled=0 autorefresh=1 type=rpm-md [elasticsearch-7.x] name=Elasticsearch repository for 7.x packages baseurl=https://artifacts.elastic.co/packages/7.x/yum gpgcheck=1 gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch enabled=0 autorefresh=1 type=rpm-md
- Обратите внимание, что на этом этапе включён только репозиторий для elasticsearch-5.x (enabled=1), все остальные отключены!
- Обновляем пакеты:
$ yum update -y kibana elasticsearch logstash
- После обновления мы должны получить пакеты версии 5.6.16, т.е. самой последней в ветке 5.x:
$ yum info elasticsearch ... Installed Packages Name : elasticsearch Arch : noarch Version : 5.6.16 ... $ yum info kibana ... Installed Packages Name : kibana Arch : noarch Version : 5.6.16 ...
Обновление x-pack plugin:
- Проверяем что плагин установлен:
$ /usr/share/elasticsearch/bin/elasticsearch-plugin list x-pack $ /usr/share/kibana/bin/kibana-plugin list x-pack@5.6.12
- Если плагин установлен, требуется его удалить (другого способа обновления нет):
$ /usr/share/elasticsearch/bin/elasticsearch-plugin remove x-pack $ /usr/share/kibana/bin/kibana-plugin remove x-pack
- После этого устанавливаем последнюю версию:
$ /usr/share/elasticsearch/bin/elasticsearch-plugin install x-pack $ /usr/share/kibana/bin/kibana-plugin install x-pack
Настройка x-pack:
- Если у вас отключена авторизация внутри elk, то необходимо отключить авторизацию в x-pack:
$ grep ^xpack.security /etc/elasticsearch/elasticsearch.yml xpack.security.enabled: false xpack.security.authc.accept_default_password: true
- Также теперь требуется явно указывать каталог с данными, про значения по умолчанию x-pack не знает:
$ grep ^path.data: /etc/elasticsearch/elasticsearch.yml path.data: /var/lib/elasticsearch
- ..и путь до логов (у нас /var/log/elasticsearch):
$ grep ^path.logs: /etc/elasticsearch/elasticsearch.yml path.logs: /var/log/elasticsearch
Запуск и проверка 5.6.16:
- Теперь можно запустить elasticsearch и kibana:
$ systemctl start kibana $ systemctl start elasticsearch
- Если всё прошло хорошо, то в веб-интерфейсе кибаны появится пункт:
https://domain/app/kibana#/management/elasticsearch/upgrade_assistant/ - Нужно зайти в Cluster Checkup, выполнить проверку и настройку кластера.
- После того как все пункты станут «зелёными», можно обновлять кластер дальше.
Обновление до 6.8.0:
- Останавливаем сервисы:
$ systemctl stop kibana $ systemctl stop elasticsearch
- В /etc/yum.repos.d/elasticsearch.repo: выключаем репозиторий 5.x, включаем 6.x.
- Обновляем пакеты:
$ yum update -y kibana elasticsearch logstash
- После обновления мы должны получить пакеты версии 6.8.0:
$ yum info elasticsearch ... Installed Packages Name : elasticsearch Arch : noarch Version : 6.8.0 ... $ yum info kibana ... Installed Packages Name : kibana Arch : noarch Version : 6.8.0 ...
x-pack:
- Снова удаляем старую версию из ElasticSearch:
$ /usr/share/elasticsearch/bin/elasticsearch-plugin list ES_PATH_CONF must be set to the configuration path $ export ES_PATH_CONF=/etc/elasticsearch $ /usr/share/elasticsearch/bin/elasticsearch-plugin list x-pack WARNING: plugin [x-pack] was built for Elasticsearch version 5.6.16 but version 6.8.0 is required $ /usr/share/elasticsearch/bin/elasticsearch-plugin remove x-pack -> removing [x-pack]... -> preserving plugin config files [/etc/elasticsearch/x-pack] in case of upgrade; use --purge if not needed
- ..и из Кибаны:
$ /usr/share/kibana/bin/kibana-plugin list x-pack@5.6.16 $ /usr/share/kibana/bin/kibana-plugin remove x-pack Removing x-pack... Plugin removal complete
- Плагин x-pack теперь встроен в кибану и эластик, так что устанавливать его отдельно не требуется:
$ /usr/share/kibana/bin/kibana-plugin install x-pack Plugin installation was unsuccessful due to error "Kibana now contains X-Pack by default, there is no longer any need to install it as it is already present."
Запуск и проверка 6.8.0:
- Запускаем ElasticSearch и получаем первую ошибку:
$ systemctl start elasticsearch $ journalctl -u elasticsearch -f ... Jun 12 18:17:48 elk.cdnnow.ru systemd[1]: Started Elasticsearch. Jun 12 18:17:48 elk.cdnnow.ru systemd[1]: elasticsearch.service: main process exited, code=exited, status=1/FAILURE Jun 12 18:17:48 elk.cdnnow.ru systemd[1]: Unit elasticsearch.service entered failed state. Jun 12 18:17:48 elk.cdnnow.ru systemd[1]: elasticsearch.service failed.
- Пробуем запустить вручную из консоли:
$ sudo -u elasticsearch -H /usr/share/elasticsearch/bin/elasticsearch -p /var/run/elasticsearch/elasticsearch.pid --quiet /usr/share/elasticsearch/bin/elasticsearch-env: line 71: /etc/sysconfig/elasticsearch: Permission denied
- Причина найдена — в 6.8.0 поменяли права на файл /etc/sysconfig/elasticsearch:
$ ls -l /etc/sysconfig/elasticsearch* -rw-rw---- 1 root root 2.5K Sep 27 2017 elasticsearch -rw-rw---- 1 root elasticsearch 1.6K May 15 23:13 elasticsearch.rpmnew
- Заменяем старый файл новым:
mv -f /etc/sysconfig/elasticsearch.rpmnew /etc/sysconfig/elasticsearch
- Кроме того, необходимо обновить /etc/elasticsearch/log4j2.properties:
mv -f /etc/elasticsearch/log4j2.properties.rpmnew /etc/elasticsearch/log4j2.properties
- Снова запускаем ElasticSearch и видим в log-файле вторую проблему:
[2019-06-12T15:28:50,865][WARN ][o.e.b.JNANatives ] [unknown] Unable to lock JVM Memory: error=12, reason=Cannot allocate memory [2019-06-12T15:28:50,867][WARN ][o.e.b.JNANatives ] [unknown] This can result in part of the JVM being swapped out. [2019-06-12T15:28:50,867][WARN ][o.e.b.JNANatives ] [unknown] Increase RLIMIT_MEMLOCK, soft limit: 65536, hard limit: 65536 [2019-06-12T15:28:50,867][WARN ][o.e.b.JNANatives ] [unknown] These can be adjusted by modifying /etc/security/limits.conf, for example: # allow user 'elasticsearch' mlockall elasticsearch soft memlock unlimited elasticsearch hard memlock unlimited [2019-06-12T15:28:50,867][WARN ][o.e.b.JNANatives ] [unknown] If you are logged in interactively, you will have to re-login for the new limits to take effect.
- Решение — создаём файл /etc/security/limits.d/elasticsearch.conf:
elasticsearch soft memlock unlimited elasticsearch hard memlock unlimited
- Готово:
$ systemctl restart elasticsearch $ systemctl start kibana
- Ждём несколько минут, пока ES закончит инициализацию.
Устраняем проблемы:
- Открываем https://domain/app/kibana#/management/elasticsearch/upgrade_assistant
- Исправляем все ошибки.
- Проблема: Number of open shards exceeds cluster soft limit. There are [6115] open shards in this cluster, but the cluster is limited to [1000] per data node, for [1000] maximum.
- Решение — повысили лимит до 20000:
$ grep shards /etc/elasticsearch/elasticsearch.yml ... cluster.max_shards_per_node: 20000 ...
- Ошибка в разделе 7.0 Upgrade Assistant => Cluster: Discovery configuration is required in production mode.
- Решение — эту настройку лучше отключить полностью, на одиночном узле приводит к проблемам любое значение, включая рекомендуемое. Например, такой вариант будет нерабочим:
$ cat /etc/elasticsearch/elasticsearch.yml ... discovery.zen.ping.unicast.hosts: ["127.0.0.1"] ...
- Сообщение в 7.0 Upgrade Assistant => Indices: .tasks index must be re-created
- Решение — смело нажимаем Delete.
- В 7.0 Upgrade Assistant => Indices: Index created before 6.0
- Решение — весь следующий раздел.
Реиндексация!
- Перед тем, как нажимать Reindex, рекомендуется удалить все ненужные индексы.
- В процессе реиндекса индексы будут переходить в состояние read-only и данные поступать не будут.
- Необходимо убедиться в том что на диске с индексами есть свободное место:
- Новые индексы создаются путём переноса данных из старых индексов.
- Например: если старый индекс занимал 10 гигабайт, для нового индекса понадобится примерно 8 гигабайт места.
- Если одновременно запустить reindex большого количества индексов, то места может не хватить.
- Напротив каждого индекса нажимаем Reindex.
- Выезжает окно, выбираем все галочки, нажимаем внизу Continue with reindex.
- И потом кнопки Run reindex и Close.
- Процесс будет идти в фоне.
- Так сделать для всех индексов. У нас их было около 700 и реиндексация заняла около 18 часов.
Обновление пакетов до 7.1.1:
- Останавливаем сервисы:
$ systemctl stop kibana $ systemctl stop elasticsearch
- В /etc/yum.repos.d/elasticsearch.repo: выключаем репозиторий 6.x и включаем 7.x.
- Устанавливаем новые версии:
$ yum update -y kibana elasticsearch logstash
- Проверяем:
$ yum info elasticsearch ... Installed Packages Name : elasticsearch Arch : noarch Version : 7.1.1 ... $ yum info kibana ... Installed Packages Name : kibana Arch : noarch Version : 7.1.1 ...
Финальный запуск и проверка:
- Запускаем сервисы:
$ systemctl start elasticsearch $ systemctl start kibana
- Elasticsearch запустился нормально, но Kibana выдала в лог следующую ошибку:
"message":"Status changed from yellow to red - Validation Failed: 1: this action would add [2] total shards, but this cluster currently has [3060]/[1000] maximum shards open;: [index_creation_exception] failed to create index [.kibana_8]"
- Причина проблемы — https://github.com/elastic/elasticsearch/issues/40803
- Исправление:
curl -X PUT localhost:9200/_cluster/settings -H "Content-Type: application/json" -d '{ "persistent": { "cluster.max_shards_per_node": "10000" } }'
- Всё готово — ELK работает на версии 7.1.1.