Старт. Предложено ELK

мощный, гибкий, достаточно простой в обращении инструмент сбора, хранения и визуального анализа данных

Отправной точкой для проекта послужило обращение в адрес компании от клиента, представляющего собой крупного инфраструктурного провайдера. Клиент на основе анализа данных, представляющих собой логи, оптимизирует мощности аппаратного и программного обеспечения.  Естественным образом возникла необходимость перевода этой задачи на более высокий качественный уровень с ростом объема информации. Иными словами потребовался мощный, гибкий, достаточно простой в обращении инструмент сбора, хранения и визуального анализа данных. В качестве такого инструмента нами был предложен стэк программных продуктов под общим названием ELK.

ELK расшифровывается как Elasticsearch, Logstash и Kibana. Это по сути три полноценных самостоятельных программных open source продукта, объединенных в одно мощное решение для широкого спектра задач по обработке данных.

Задачи и требования по производительности

Развернуть систему мониторинга с целью:

  1. планирование мощностей (поиск узких мест аппаратного и программного обеспечения)
  2. ретроспективный мониторинг событий от конечного пользовательского оборудования

Система должна удовлетворять следующим требованиям по производительности:

  • До 1000 событий/сек
  • Прирост данных до 3GB/час
  • Хранение до 90 дней
  • Сбор 95% событий за период времени до 24 часов (отображение на экране по умолчанию)
  • Сбор 95% событий с интервалом до 5 мин (отображение на экране по умолчанию)
  • Подключение до 10 клиентов по протоколу HTTP
  • Отказоустойчивость 1 сервера в кластере (2 репликации)
  • На серверах запущены только ELK (отсутствие сторонних приложений)

Требования к аппаратному и программному обеспечению системы:

  • 3 сервера
  • ОС — CentOS 7.2 / RHEL 7.2
  • 8 физических ядер CPU на сервер, (или больше в соответствии физическим ядрам без перераспределения между VM)
  • 48GB RAM на сервер, (без перераспределения RAM между VM)
  • 8TB HDD на сервер, обеспечивающий, по крайней мере, скорость случайных операций ввода-вывода 500 IOPS (70% чтение / 30% запись)
  • Как минимум 1Gb сетевые подключения между серверами

Спецификация физических серверов для развертывания системы:

  • 2xE5-2630v4 10c (или E5-2660v4 14c для более высокой производительности)
  • 4x32GB DDR4 RAM
  • 2x300GB 12G SAS 10K (RAID1)
  • 2xPSU

Развертывание системы

На каждом серверной ноде разворачиваются отдельные экземпляры Elasticsearch, Logstash и Kibana.

Далее порядок развертывания ПО будет рассматриваться на одной ноде.

Все детали применимы к остальным машинам кластера.

Предустановки

1. Стек ПО Elasticsearch, Logstash и Kibana (ELK) устанавливается из одного репозитория. Создадим в системе файл описания репозитория:

2. Импортируем Elasticsearch PGP Key:

3. Для работы Elasticsearch и Logstash необходимо скачать и установить JDK 8.

Установка Elasticsearch

1. Устанавливаем Elasticsearch:

2. Редактируем конфигурацию Elasticsearch:

В секции “Paths” определяем пути к каталогам данных и логов для Elasticsearch:

Для повышения стабильности работы узла, исключив выгрузку JVM на swap раздел, раскоментируем строку bootstrap.memory_lock true секции Memory.
В секции “Network” добавляем строки для CORS-запросов:

В секции “Various” оптимизируем ресурсоемкие операции следующими параметрами (для 8 ядер CPU):

3. Редактируем параметры JVM:

Устанавливаем минимальное и максимальное значение JVM heap size параметрами Xms и Xmx соответственно. В нашем случае эти значения одинаковы и равны 32g:

Для освобождения неиспользуемой памяти выбираем Garbage Collection. В нашем случае используется G1GC. С этой целью в соответствующей секции сделаны изменения:

4. Запускаем и устанавливаем автозапуск Elasticsearch при загрузке системы:

5. Проверяем работоспособность ноды Elasticsearch через простой запрос по HTTP

Установка Kibana

1. Устанавливаем Kibana:

2. Редактируем конфигурацию Kibana:

Делаем возможным удаленное подключение к серверу Kibana:

URL для запросов к экземпляру Elasticsearch:

Определим файл размещения логов Kibana:

3. Запускаем и устанавливаем автозапуск Kibana при загрузке системы:

Установка Logstash

1. Устанавливаем Logstash:

2. Редактируем конфигурацию Logstash:

В секции “Pipeline Settings” определяем параметры:

исходя из количества ядер CPU на узле (8)

исходя из количества экземпляров Elasticsearch (3)

3. Редактируем параметры JVM:

Устанавливаем минимальное и максимальное значение JVM heap size параметрами Xms и Xmx соответственно. В нашем случае эти значения одинаковы и равны 4g:

Как и для Elasticsearch из Garbage Collection выбираем G1GC. С этой целью в соответствующей секции сделаны изменения:

4. Создаем конфигурационный файл:

В секции input, для нашего случая, прописываем путь к каталогу с лог-файлами. В секции output указываем кластер Elasticsearch.

5. Запускаем и устанавливаем автозапуск Logstash при загрузке системы:

Устанавливаем X-Pack в качестве расширения ELK

X-Pack представляет собой PlugIns к Elasticsearch и Kibana. Включает в себя модули гибкого разделения доступа к ресурсам (X-Pack Security), дополнительную графическую информацию уведомления, мониторинга, отчетности на уровне серверов EK, нод и индексов в Kibana. Настройка аутентификации как нативного уровня, т. и с использованием LDAP и AD.

1. Устанавливаем X-Pack для Elasticsearch на каждой ноде:

2. Для автоматического создания индексов X-Pack добавляем следующую строку в elasticsearch.yml:

3. Перезагружаем Elasticsearch:

4. Устанавливаем X-Pack для Kibana на каждой ноде:

5. Перезагружаем Kibana:

Для отключения модулей X-Pack помещаем следующие строки в elasticsearch.yml:

в kibana.yml:

Перезагружаем Elasticsearch и Kibana.
Чтобы снова включить, комментируем строки и перезагружаем сервисы.

Конфигурируем систему для работы в кластере

Редактируем на каждой ноде конфигурационный файл Elasticsearch:

1. В секции “Network” раскоментируем соответствующую строку и пропишем адрес ноды, назначенный для нее в кластере. Для каждой ноды свое значение. Например:

2. В секции “ Cluster” раскоментируем соответствующую строку и пропишем уникальное для нашей сети имя кластера. Например:

3. В секции “ Node” раскоментируем соответствующую строку и пропишем уникальное для нашего кластера имя ноды. Для каждой ноды свое значение. Например:

4. В секции “ Discovery” раскоментируем соответствующую строку и пропишем адреса нод, которые должны обнаруживаться в кластере. Например:

Кроме того, чтобы избежать разбиение нашего кластера на два независимых при сбое системы, необходимо установить следующие параметры (для нашего случая 3 ноды):

5. Сохраняем изменения конфигурационного файла. Перезагружаем Elasticsearch:

Проверяем состояние кластера:

Интерактивное взаимодействие с кластером Elasticsearch

Для интерактивного взаимодействия с кластером Elasticsearch используем приложение “elasticsearch-head”. В предыдущих версиях Elasticsearch это приложение устанавливалось как плагин.
Начиная с версии 5.X разработчики рекомендуют использовать X-Pack для замены «es-head». Поэтому здесь пришлось использовать «es-head» в виде отдельного веб-приложения.
Для обеспечения его работы используется примитивный веб-сервер, написанный на golang.

Создание Dashboard в Kibana

Открываем в браузере вэб-интерфейс Kibana (http://ip_addr_kibana:5601). Определяем имя индекса или шаблон имен нескольких индексов (index-pattern-*). Выбираем поле индекса с временной меткой, которую мы будем использовать для сравнения временных параметров. Нажав “Create”, добавляем индексы. Если индексов больше одного, необходимо один выбрать по умолчанию. На странице Discover мы получаем интерактивный доступ к документам выбранных индексов. Если выбрано поле индекса с временной меткой, визуализация документов дополняется гистограммой.
Далее создаем визуализации и включаем их в дашборд.
Для одного индекса создан дашборд, включающая в себя 13 визуализаций различного типа, в соответствии со спецификацией заказчика.
Средствами модуля “X-Pack Security” дополнительно создана роль для пользователя с правами только для просмотра (исключая просмотр ролей и пользователей).

В /etc/kibana/kibana.yml определяем приложение, запускаемое для всех пользователей после авторизации на сервере Kibana, соответствующей строкой:

Спасибо!

Благодарим за просмотр данной статьи.

Если у Вас возникли какие-либо вопросы — пишите — будем рады ответить!