ElasticSearch и Kibana

26 июля 2019

Обновляем 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.


← Назад в Блог

Подпишитесь на новые статьи: