Что такое стек ELK

Название стека представляет собой аббревиатуру первых букв трех открытых проектов, разрабатываемых и поддерживаемых компанией Elastic:

Elasticsearch
Logstash
Kibana

Этот набор компонентов обеспечивает удобное централизованное логирование (ведение журналов) с разных серверов. ELK stack позволяет надежно и безопасно получать данные из любого источника во всех форматах и работать с этими данными: осуществлять поиск по ним, анализировать и визуализировать их в режиме real-time (NRT). В профессиональной среде ELK-стек также называют «эластичный стек», обыгрывая отсылку к названию компании-разработчика.

Что такое Elasticsearch

Elasticsearch (ES) — сердце стека ELK. Это распределенная RESTful-система на основе JSON, которая сочетает в себе функции NoSQL-базы данных (сохраняет все собранные данные), поисковой системы и аналитической системы. Изначально это была утилита полнотекстового поиска поверх поисковой системы Apache Lucene с некоторыми расширенными возможностями (например, легкой репликацией и масштабированием). Эти дополнительные возможности, а также простота использования и высокая работоспособность даже в изначальной конфигурации сделали Elasticsearch крайне удобной для высоконагруженных проектов с большими данными и сложными функциями поиска.

Со временем ES стали использовать не только для поиска, например, по товарам в интернет-магазинах, но и основывать на ней свои разработки по централизованному хранению логов и аналитике — настолько решение стало удобным. К тому же вокруг него сформировалось компетентное и отзывчивое сообщество, которое всегда подскажет, как настроить ваш ES-кластер под любые задачи.

Итак, Elasticsearch — это большое, быстрое и хорошо масштабируемое нереляционное хранилище данных, которое стало отличным инструментом для поиска и аналитики журналов благодаря мощности, простоте, документам JSON без схем, поддержке разных языков и геолокации. Система может быстро обрабатывать большие объемы журналов, индексировать системные логи по мере поступления и выполнять запросы к ним в режиме реального времени.

Какие бизнес-задачи может решать Elasticsearch:

  • агрегировать большие объемы любых данных с разных площадок (например, товары со множества интернет-магазинов), осуществлять фильтрацию и поиск по различным свойствам продукции;
  • автоматически обрабатывать огромные объемы опросников и анкет;
  • быстро вычислять нужные показатели в данных, собранных из различных систем, для комплексной аналитики бизнес-процессов;
  • анализировать большие объемы неструктурированной статистической информации;
  • хранить данные без схемы или создать схему для данных;
  • управлять записью данных через многодокументные API;

Что такое Logstash

Logstash в стеке ELK представляет собой конвейер по парсингу данных (логов событий) одновременно из множества источников ввода и их обработки для дальнейшего использования в Elasticsearch. С помощью этой утилиты в сообщениях системных событий можно выделять поля и их значения, фильтровать и редактировать данные. Настраивается она через конфигурационные файлы.
В Logstash все события с использованием внутренних очередей последовательно проходят через три фазы:
  1. Input — передача журналов для их обработки в машинно-понятный вид. Здесь можно настроить: из какой папки читать новые или постоянно дозаписываемые файлы; на какой порт и по какому протоколу будут приходить логи.

  2. Filter — это поле для управления сообщением, приходящим на Logstash, с набором условий для выполнения определенного действия или события. Здесь можно настроить парсер логов: редактирование значений, добавление и удаление новых параметров, разбор полей.

  3. Output — здесь можно настроить, куда отправлять разобранный лог. Если в Elasticsearch, то нужен JSON-запрос, в котором отправляются поля со значениями. Если это дебаг, то можно выводить в stdout или просто записывать в файл.
Logstash позволяет централизовать обработку большого объема структурированных и неструктурированных данных и событий. Для подключения к различным типам источников ввода и платформ утилита поддерживает более 200 подключаемых плагинов, благодаря которым упрощается доступ к разным данным.
Как проходят данные в Logstash

Что такое Kibana

Компонент Kibana (Кибана) — это web-панель для работы с логами, расширяемый пользовательский интерфейс. Он позволяет визуализировать проиндексированные данные в системе Elasticsearch в виде графиков и диаграмм. Используя гибкие настройки мониторинга, с помощью Кибана можно перемещаться по Elastic Stack, отслеживая пути, по которым запросы проходят через ваше приложение; выполнять сложную аналитику и красочно визуализировать ее; администрировать базу данных. Здесь можно управлять несколькими панелями мониторинга и сохранять их с настройками.
Методы поиска по данным в Kibana в режиме реального времени:
  • Свободный текстовый поиск для поиска определенной строки
  • Поиск на уровне поля для поиска строки в определенном поле
  • Логические утверждения для объединения поисков в логический оператор
  • Поиск близости для поиска терминов в пределах определенной близости символов

Почему стек ELK настолько популярен?

Мы живем в мире, управляемом данными, где БД должны последовательно обрабатывать все более огромные объемы информации. Как правило, аналитические процессы замедляются по мере того, как объем данных, обрабатываемых системой, увеличивается. Главное преимущество технологического стека ELK заключается в том, что он помогает нам улучшить эти аналитические процессы.
Преимущества:
  • стек может безопасно и быстро извлекать, анализировать и визуализировать данные в режиме реального времени из любого источника и в любом формате;

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

  • он прост в использовании и настройке, удобен для пользователя;

  • это рентабельный набор программ с открытым исходным кодом;

  • развертывается в любом масштабе независимо от технической инфраструктуры компании;

  • это стабильное, отказоустойчивое решение — при сбое кластерных узлов данные не теряются, а перераспределяются;

  • его можно разнообразно настраивать;

  • официальные клиенты от разработчика на нескольких языках программирования с поддержкой;
  • годы практических внедрений ELK (Elasticsearch, Logstash, Kibana) и очень активное сообщество создали непревзойденное сочетание зрелости и перспективного роста.
Недостатки:
  • в Elasticsearch нет встроенной системы авторизации и управления правами доступа, что может привести к проблемам с ИБ — нужно обязательно защищать паролем базу данных, к которой открывается доступ, поскольку движок поисковой системы по умолчанию связывается с портом 9200 через любые интерфейсы;

  • некоторые пользователи отмечают сложность внутреннего языка запросов QueryDSL;

  • масштабирование может оказаться затратным;

  • из-за использования JVM стек потребляет много ресурсов CPU и RAM, что при очень высоких нагрузках может привести к снижению производительности;

  • Когда размеры индексов в Elasticsearch превышают ограничения хранилища данных узла, индексация начинает давать сбой, что может привести к потере данных.

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

Установка и настройка Elasticsearch, Logstash и Kibana

Стек ELK можно установить различными способами и в самых разных операционных системах и средах: локально, в облаке с помощью Docker и систем управления конфигурацией, с помощью пакетов tarball или .zip или из репозиториев. Многие этапы установки аналогичны от среды к среде, и, поскольку мы не можем охватить все различные сценарии, мы приведем пример установки всех компонентов стека в Linux. В соответствии с требованиями инфраструктуры в стеке могут участвовать и различные другие приложения.

Предварительные требования

Чтобы ВМ машина не тормозила, а работать было комфортно, рекомендуем задействовать следующие системные ресурсы для установки одиночного инстанса с полным набором компонентов ELK-стека:
Системные требования для ELK-стека
На сервере должны быть установлены Java 8, которая требуется для Elasticsearch и Logstash (Java 9 не поддерживается) и Nginx, который будет настроен в качестве обратного прокси для Kibana. Важно обеспечить защиту сервера сертификатом TLS/SSL. Для отправки логов надо предварительно установить агент Filebeat, который стал почти неотъемлемой частью ELK, превратив его в четырехсторонний стек.

Установка Filebeat для отправки логов в Logstash

Устанавливать Filebeat можно и из общего репозитория, и отдельно пакетами. Поставьте первого агента Filebeat на сервер с Nginx для отправки логов веб-сервера на сервер с ELK.
Centos
Ubuntu / Debian
После установки можно использовать шаблон с минимальными настройками в конфигурационном файле /etc/filebeat/filebeat.yml. В этом же каталоге лежит файл filebeat.full.yml, в котором прописаны варианты установок и который можно взять за основу. Файл filebeat.template.json — это шаблон для вывода по умолчанию, который можно изменить или переопределить.

После настроек запустите filebeat и добавьте в автозагрузку:
По умолчанию Filebeat пишет логи в дефолтный системный лог.

Установка Elasticsearch

Происходит довольно просто благодаря готовым пакетам, которые существуют под все популярные операционные системы.
Centos
Скопируйте публичный ключ репозитория:
Подключите репозиторий Elasticsearch:
Установите Elasticsearch:
В в завершении установки добавьте Elasticsearch в автозагрузку и запустите его с дефолтными настройками:
Проверьте, запустилась ли служба:
Проверьте, что Elasticsearch работает нормально, выполнив к нему простой запрос о его статусе:
Сервис запущен и отвечает на запросы.
Ubuntu / Debian
Скопируйте публичный ключ репозитория:
Если у вас нет пакета apt-transport-https, то установите:
Добавьте репозиторий Elasticsearch в систему:
Установите Elasticsearch на Debian или Ubuntu:
После установки добавьте elasticsearch в автозагрузку и запустите:
Проверьте, запустился ли он:
Проверьте, что Elasticsearch действительно правильно работает. Выполните к нему запрос о статусе:
Если все в порядке, то переходите к настройке Elasticsearch.
Настройка Elasticsearch
Настройки находятся в файле /etc/elasticsearch/elasticsearch.yml. В самом начале вам понадобятся следующие параметры:
По умолчанию Elasticsearch слушает localhost и это хорошо, потому что данные в него . будут попадать из установленного локально Logstash. Заранее подумайте о том, где вы будете хранить значительные объемы логов. Остальные настройки оставим дефолтными. Перезапустите службу по окончании изменения настроек:
Посмотрите, что получилось:
Elasticsearch на локальном интерфейсе. Видно, что он слушает ipv6, но не видно, что слушает ipv4. Однако не волнуйтесь, его он тоже слушает. Можно переходить к установке Kibana. Если же вы хотите, чтобы Elasticsearch слушал все сетевые интерфейсы, то настройте вот этот параметр:
Обратите внимание, что сразу запускать службу не стоит — вы получите ошибку. Добавьте еще один параметр, чтобы ее избежать, укажите, что хосты кластера следует искать лишь локально:
Автоматическая очистка индексов в Elasticsearch
Еще недавно для автоматической очистки индексов в Elasticsearch нужно было прибегать к сторонним решениям, например, к Curator. Сегодня в стеке есть встроенный инструмент для очистки данных Index Lifecycle Policies, который можно настроить самостоятельно.
Установка Kibana
Чтобы визуализировать данные, полученные из Elasticsearch, установите веб-панель Kibana. Готовые пакеты и репозиторий существуют под все популярные платформы.
Centos
Импортируйте ключ репозитория:
Добавьте конфигурационный файл репозитория:
Запустите установку Kibana:
Добавьте Кибана в автозагрузку и сразу запустите:
Проверьте состояние запущенного сервиса:
Kibana по умолчанию слушает 5601 порт. Она медленно стартует, поэтому не спешите его проверять непосредственно после запуска. Лучше подождать примерно минуту и затем проверить:
Kibana по умолчанию слушает 5601 порт. Она медленно стартует, поэтому не спешите его проверять непосредственно после запуска. Лучше подождать примерно минуту и затем проверить:
Ubuntu/Debian
Здесь установка такая же, как и на Centos — подключите репозиторий и ставьте из deb-пакета. Добавьте публичный ключ:
Добавьте репозиторий Kibana:
Запустите установку Kibana:
Добавьте Кибана в автозагрузку и запустите:
Проверьте состояние:
Kibana по умолчанию слушает 5601 порт. Она медленно стартует, поэтому не спешите его проверять непосредственно после запуска. Лучше подождать примерно минуту и затем проверить:
Настройка Kibana

Настройки Kibana находятся в файле: /etc/kibana/kibana.yml. По умолчанию Kibana не позволяет подключаться удаленно и слушает только localhost. Это нормально, если на этом же сервере у вас будет установлен Nginx в качестве reverse proxy, который будет принимать подключения, а затем проксировать их в Kibana. Это правильный подход в production в том случае, если стеком будет пользоваться распределенная команда. При тестовой установке можно обойтись без Nginx. Для этого разрешите Kibana слушать внешний интерфейс и принимать подключения. Измените параметр server.host, указав ip сервера, например так:
Если надо, чтобы Kibana слушала все интерфейсы, укажите в качестве ip-адреса сервера 0.0.0.0, а после перезапустите:
Зайдите в веб интерфейс по адресу http://10.20.1.23:5601.

Если необходимо, то продолжите настройку и тестирование. По окончании запустите nginx и настройте проксирование.

Если в веб-интерфейсе появляется такое предупреждение:
Добавьте в конфигурационный файл доменное имя (если его используете) или этот параметр:
Настройка безопасности и авторизация в Kibana

При настройках элементов стека вы можете заметить всплывающее сообщение такого вида:
Это предупреждение о том, что не настроена аутентификация и доступ открыт для всех. Если доступ к данным у вас изолирован (например, на уровне firewall), то не обращайте внимания на эти сообщения. Если нет — настройте доступ к Elasticsearch и к данным в Kibana через авторизацию по пользователю и паролю.

Добавьте в файл elasticsearch.yml параметр:
Перезапустите службу Elasticsearch:
Если вы не настраивали работу кластера по ssl-протоколу, то вероятно получите ошибку. Чтобы настройки xpack.security заработали, добавьте:
Снова запустите Elasticsearch еще раз. Сейчас он запустится, но без доступа. Kibana выдаст ошибку:
Вам надо подготовить учетные данные, которые вы будете использовать для доступа к Elasticsearch. Для этого запустите утилиту elasticsearch-setup-passwords, которая по умолчанию должна быть в /usr/share/elasticsearch/bin.
Сохраните показанные пароли, они понадобятся для организации доступа к кластеру остальным компонентам стека. Далее сгенерируйте пароль и настройте парольный доступ к кластеру для Kibana. Для этого добавьте в kibana.yml:
Теперь перезапустите службу и зайдите в веб-интерфейс. Должно появиться окно авторизации. Используйте свою учетную запись Elastic. В веб-интерфейсе вы сможете управлять пользователями и ролями в разделе Stack Management -> Users.

Теперь настройте Logstash для авторизации, ведь пока что он не может отправлять данные и выдает ошибки в логе. Откройте конфигурационный файл Logstash, который отвечает за output и добавьте в него учетные данные для доступа в кластер. Это будет выглядеть приблизительно так:
Теперь данные будут поступать из Logstash в Elasticsearch с авторизацией по пользователю и паролю.
Проксирование подключений к Kibana через Nginx

Ниже представлен примерный конфигурационный файл Nginx для проксирования запросов к Kibana с ограничением доступа по паролю:
Создайте файл для пользователей и паролей:
Установите утилиту htpasswd, если ее нет в системе:
Затем появится запрос на ввод пароля. Мы создали файл kibanauser с информацией о пользователе и пароле для ограничения доступа к веб-панели Kibana.
Установка Logstash

Так же, как Elasticsearch и Kibana, устанавите Logstash из того же репозитория. Добавьте в автозагрузку.
Centos
Ubuntu/Debian
Добавьте в автозагрузку, но пока не запускайте:
Настройка Logstash

Все конфигурационные файлы Logstash находятся в /etc/logstash, настройки, которые определяют параметры запуска, находятся в /etc/logstash/startup.options, jvm.options, параметры работы самого сервиса — в logstash.yml, а конвейеры описываются в файлах в /etc/logstash/conf.d (здесь пока ничего нет). Вы можете по-разному расположить фильтры, как вам удобно: описать подключения к сервисам в одном файле или разделить файлы по назначению — input, output и filter.
Подключитесь к Filebeat:
Здесь достаточно указать, что вы принимаете информацию на 5044 порт. Чтобы передавать логи по защищенным соединениям с использованием ssl-сертификатов, добавьте параметры ssl. Logstash может сам брать данные с локального узла:
Beats и file здесь — это названия плагинов. Полный их список для inputs, outputs и filter, а также параметры доступны на официальном сайте. После установки Logstash некоторые плагины будут доступны, а получить их список можно следующей командой:
Сверьте список с сайтом, обновите имеющиеся и поставьте нужный вам плагин:
Если систем много, то для создания пакета и распространения на другие системы можно использовать logstash-plugin prepare-offline-pack.

Далее опишите передачу данных в Elasticsearch:
Теперь фильтры. Создайте файл, который будет обрабатывать данные типа nginx-access:
Для анализа данных в Logstash можно применять несколько фильтров. Одним из лучших сообщество считает Grok. По умолчанию в Logstash около 120 шаблонов, которые можно посмотреть в github.com. Если их не хватает, можно добавить свои правила, указав прямо в строке match или прописав в отдельном файле — в этом случае надо задать правилу уникальное имя и указать Logstash, где их искать (если не установлена переменная patterns_dir):
Проверить корректность правил можно на сайтах grokdebug.herokuapp.com и grokconstructor.appspot.com.

Далее создайте фильтр для отбора события NGINXACCESS для nginx в простом формате — имя шаблона и регулярное выражение (последние две строки скриншота — это одна строка кода).
Перезапустите:
Убедитесь в журналах, что все работает:

Заключение

Стек ELK (Logstash, Elasticsearch, Kibana) — это современное решение для управления журналами и аналитики, которое позволяет инженерам преодолевать трудности мониторинга высокораспределенных, динамических и шумных сред. Это мощная платформа, которая собирает и обрабатывает данные из нескольких источников, сохраняет их в одном централизованном хранилище, которое может масштабироваться по мере роста данных, и предоставляет набор инструментов для анализа собранной информации. Стек популярен благодаря своей функциональности, простоте использования, рентабельности и хорошей поддержке активного сообщества.
Коммерческое предложение

Не пропустите последние новости. Подписывайтесь!