Старт. Предложено ELK
мощный, гибкий, достаточно простой в обращении инструмент сбора, хранения и визуального анализа данных
Отправной точкой для проекта послужило обращение в адрес компании от клиента, представляющего собой крупного инфраструктурного провайдера. Клиент на основе анализа данных, представляющих собой логи, оптимизирует мощности аппаратного и программного обеспечения. Естественным образом возникла необходимость перевода этой задачи на более высокий качественный уровень с ростом объема информации. Иными словами потребовался мощный, гибкий, достаточно простой в обращении инструмент сбора, хранения и визуального анализа данных. В качестве такого инструмента нами был предложен стэк программных продуктов под общим названием ELK.
ELK расшифровывается как Elasticsearch, Logstash и Kibana. Это по сути три полноценных самостоятельных программных open source продукта, объединенных в одно мощное решение для широкого спектра задач по обработке данных.
Задачи и требования по производительности
Развернуть систему мониторинга с целью:
- планирование мощностей (поиск узких мест аппаратного и программного обеспечения)
- ретроспективный мониторинг событий от конечного пользовательского оборудования
Система должна удовлетворять следующим требованиям по производительности:
- До 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) устанавливается из одного репозитория. Создадим в системе файл описания репозитория:
1 2 3 4 5 6 7 8 9 |
[root@centos ~]# vi /etc/yum.repos.d/elasticsearch.repo [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 |
2. Импортируем Elasticsearch PGP Key:
1 |
[root@centos ~]# rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch |
3. Для работы Elasticsearch и Logstash необходимо скачать и установить JDK 8.
1 2 |
[root@centos ~]# wget --no-cookies --no-check-certificate --header "Cookie: \ gpw_e24=http%3A%2F%2Fwww.oracle.com%2F; oraclelicense=accept-securebackup-cookie" \ "http://download.oracle.com/otn-pub/java/jdk/8u73-b02/jdk-8u73-linux-x64.rpm" [root@centos ~]# rpm -Uvh jdk-8u73-linux-x64.rpm |
Установка Elasticsearch
1. Устанавливаем Elasticsearch:
1 |
[root@centos ~]# yum –y update && yum –y install elasticsearch |
2. Редактируем конфигурацию Elasticsearch:
1 |
[root@centos ~]# vi /etc/elasticsearch/elasticsearch.yml |
В секции “Paths” определяем пути к каталогам данных и логов для Elasticsearch:
1 2 |
path.data: /home/elasticsearch/data path.logs: /home/elasticsearch/logs |
Для повышения стабильности работы узла, исключив выгрузку JVM на swap раздел, раскоментируем строку bootstrap.memory_lock true секции Memory.
В секции “Network” добавляем строки для CORS-запросов:
1 2 3 4 |
http.cors.enabled: true http.cors.allow-origin: "*" http.cors.allow-methods : OPTIONS, HEAD, GET, POST, PUT, DELETE http.cors.allow-headers : X-Requested-With,X-Auth-Token,Content-Type, Content-Length, Authorization |
В секции “Various” оптимизируем ресурсоемкие операции следующими параметрами (для 8 ядер CPU):
1 2 |
thread_pool.bulk.size: 8 thread_pool.bulk.queue_size: 500 |
3. Редактируем параметры JVM:
1 |
[root@centos ~]# vi /etc/elasticsearch/jvm.options |
Устанавливаем минимальное и максимальное значение JVM heap size параметрами Xms и Xmx соответственно. В нашем случае эти значения одинаковы и равны 32g:
1 2 |
-Xms32g -Xmx32g |
Для освобождения неиспользуемой памяти выбираем Garbage Collection. В нашем случае используется G1GC. С этой целью в соответствующей секции сделаны изменения:
1 2 3 4 5 |
## GC configuration #-XX:+UseConcMarkSweepGC #-XX:CMSInitiatingOccupancyFraction=75 #-XX:+UseCMSInitiatingOccupancyOnly -XX:+UseG1GC |
4. Запускаем и устанавливаем автозапуск Elasticsearch при загрузке системы:
1 2 |
[root@centos ~]# systemctl start elasticsearch [root@centos ~]# systemctl enable elasticsearch |
5. Проверяем работоспособность ноды Elasticsearch через простой запрос по HTTP
1 |
[root@centos ~]# curl -X GET http://localhost:9200 |
Установка Kibana
1. Устанавливаем Kibana:
1 |
[root@centos ~]# yum –y update && yum –y install kibana |
2. Редактируем конфигурацию Kibana:
1 |
[root@centos ~]# vi /etc/kibana/kibana.yml |
Делаем возможным удаленное подключение к серверу Kibana:
1 |
server.host: 0.0.0.0 |
URL для запросов к экземпляру Elasticsearch:
1 |
elasticsearch.url: http://localhost:9200 |
Определим файл размещения логов Kibana:
1 |
logging.dest: /var/log/kibana.log |
3. Запускаем и устанавливаем автозапуск Kibana при загрузке системы:
1 2 |
[root@centos ~]# systemctl start kibana [root@centos ~]# systemctl enable kibana |
Установка Logstash
1. Устанавливаем Logstash:
1 |
[root@centos ~]# yum –y update && yum –y install logstash |
2. Редактируем конфигурацию Logstash:
1 |
[root@centos ~]# vi /etc/logstash/logstash.yml |
В секции “Pipeline Settings” определяем параметры:
1 |
pipeline.workers: 8 |
исходя из количества ядер CPU на узле (8)
1 |
pipeline.output.workers: 3 |
исходя из количества экземпляров Elasticsearch (3)
3. Редактируем параметры JVM:
1 |
[root@centos ~]# vi /etc/logstash/jvm.options |
Устанавливаем минимальное и максимальное значение JVM heap size параметрами Xms и Xmx соответственно. В нашем случае эти значения одинаковы и равны 4g:
1 2 |
-Xms4g -Xmx4g |
Как и для Elasticsearch из Garbage Collection выбираем G1GC. С этой целью в соответствующей секции сделаны изменения:
1 2 3 4 5 6 |
## GC configuration #-XX:+UseParNewGC #-XX:+UseConcMarkSweepGC #-XX:CMSInitiatingOccupancyFraction=75 #-XX:+UseCMSInitiatingOccupancyOnly -XX:+UseG1GC |
4. Создаем конфигурационный файл:
1 |
[root@centos ~]# vi /etc/logstash/conf.d/index_name.conf |
В секции input, для нашего случая, прописываем путь к каталогу с лог-файлами. В секции output указываем кластер Elasticsearch.
5. Запускаем и устанавливаем автозапуск Logstash при загрузке системы:
1 2 |
[root@centos ~]# systemctl start logstash [root@centos ~]# systemctl enable logstash |
Устанавливаем X-Pack в качестве расширения ELK
X-Pack представляет собой PlugIns к Elasticsearch и Kibana. Включает в себя модули гибкого разделения доступа к ресурсам (X-Pack Security), дополнительную графическую информацию уведомления, мониторинга, отчетности на уровне серверов EK, нод и индексов в Kibana. Настройка аутентификации как нативного уровня, т. и с использованием LDAP и AD.
1. Устанавливаем X-Pack для Elasticsearch на каждой ноде:
1 2 |
[root@centos ~]# cd /usr/share/elasticsearch [root@centos ~]# bin/elasticsearch-plugin install x-pack |
2. Для автоматического создания индексов X-Pack добавляем следующую строку в elasticsearch.yml:
1 |
action.auto_create_index: .security,.monitoring*,.watches,.triggered_watches,.watcher-history* |
3. Перезагружаем Elasticsearch:
1 |
[root@centos ~]# systemctl restart elasticsearch |
4. Устанавливаем X-Pack для Kibana на каждой ноде:
1 2 |
[root@centos ~]# cd /usr/share/kibana [root@centos ~]# bin/kibana-plugin install x-pack |
5. Перезагружаем Kibana:
1 |
[root@centos ~]# systemctl restart kibana |
Для отключения модулей X-Pack помещаем следующие строки в elasticsearch.yml:
1 2 3 4 |
xpack.security.enabled: false xpack.monitoring.enabled: false xpack.graph.enabled: false xpack.watcher.enabled: false |
в kibana.yml:
1 2 3 4 |
xpack.security.enabled: false xpack.monitoring.enabled: false xpack.graph.enabled: false xpack.reporting.enabled: false |
Перезагружаем Elasticsearch и Kibana.
Чтобы снова включить, комментируем строки и перезагружаем сервисы.
Конфигурируем систему для работы в кластере
Редактируем на каждой ноде конфигурационный файл Elasticsearch:
1 |
[root@centos ~]# vi /etc/elasticsearch/elasticsearch.yml |
1. В секции “Network” раскоментируем соответствующую строку и пропишем адрес ноды, назначенный для нее в кластере. Для каждой ноды свое значение. Например:
1 |
network.host: [10.0.0.1, localhost] |
2. В секции “ Cluster” раскоментируем соответствующую строку и пропишем уникальное для нашей сети имя кластера. Например:
1 |
cluster.name: claster-elk |
3. В секции “ Node” раскоментируем соответствующую строку и пропишем уникальное для нашего кластера имя ноды. Для каждой ноды свое значение. Например:
1 2 3 |
node.name: ${HOSTNAME} или node.name: node-elk-1 |
4. В секции “ Discovery” раскоментируем соответствующую строку и пропишем адреса нод, которые должны обнаруживаться в кластере. Например:
1 |
discovery.zen.ping.unicast.hosts: ["10.0.0.1", "10.0.0.2", "10.0.0.3"] |
Кроме того, чтобы избежать разбиение нашего кластера на два независимых при сбое системы, необходимо установить следующие параметры (для нашего случая 3 ноды):
1 2 3 |
discovery.zen.minimum_master_nodes: 2 gateway.recover_after_nodes: 2 gateway.expected_nodes: 3 |
5. Сохраняем изменения конфигурационного файла. Перезагружаем Elasticsearch:
1 |
[root@centos ~]# systemctl restart elasticsearch |
Проверяем состояние кластера:
1 |
[root@centos ~]# curl -XGET 'http://localhost:9200/_cluster/state?pretty' |
Интерактивное взаимодействие с кластером 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, соответствующей строкой:
1 |
kibana.defaultAppId: "dashboard/Dashboard_Name_Default" |
Спасибо!
Благодарим за просмотр данной статьи.
Если у Вас возникли какие-либо вопросы – пишите – будем рады ответить!