ELK — стэк технологий Elasticsearch, Logstash и Kibana. Elasticsearch — это распределенный RESTful поиск. Logstash позволяет принимать на вход данные из разных источников, преобразовывать их и складывать в нужное место, например, в Elasticsearch. Kibana позволяет визуализировать данные. В каком-то виде этот стэк позволяет собрать самостоятельный полноценный пайплайн: от сбора и организации данных до их визуализации и анализа (в том числе есть и инструменты машинного обучения).
Правилом хорошего тона является установка инструментов не через распаковку архивов, а при помощи установки пакетов. У Elasticsearch есть такая возможность. Зайдите на каждую (!) машину и выполните следующие команды:
$ wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
$ sudo apt-get install apt-transport-https
$ echo "deb https://artifacts.elastic.co/packages/5.x/apt stable main" | sudo tee -a /etc/apt/sources.list.d/elastic-5.x.list
$ sudo apt-get update && sudo apt-get install elasticsearch
Установим сразу же плагин x-pack, позволяющий использовать в том числе machine learning прямо в elasticsearch.
$ cd /usr/share/elasticsearch/bin/
$ sudo ./elasticsearch-plugin install x-pack
Вероятно, вывалится ошибка, ссылающаяся на Java. И правильно, мы же в предыдущей лабе ее установили только на мастере. Установите ее на оставшихся нодах.
Hint: для того чтобы была возможность переходить от одной машины к другой напрямую, добавьте свой private_key
, при помощи которого вы изначально заходите на ваш мастер, в директорию: ~/.ssh/
Как правило, после этого еще требуется поменять права на этот файл:
$ chmod 0600 <путь к вашему ключу>
После этого вы сможете просто набрать с этой машины, например:
$ ssh node2
И окажетесь на втором сервере. Соответственно, чтобы переходить с любой машины на любую, нужно положить свой ключ в соответствующую папку на всех серверах.
Конфиг-файл Elasticsearch находится отдельно на каждой машине здесь: /etc/elasticsearch/elasticsearch.yml
.
Для того чтобы работать в режиме кластера, нам нужно будет прописать в конфиг-файле одно и то же название кластера. Если все машины находятся внутри одной сети, то кластер самоорганизуется за счет самостоятельного общения нод.
При попытке попасть в указанную папку может появиться ошибка permission denied
. Для того чтобы от нее избавиться, нужно поменять на нее права.
$ sudo chmod -R 0755 /etc/elasticsearch/
И после этого:
$ cd /etc/elasticsearch/
$ sudo nano elasticsearch.yml
В нем следует раскомментить и поменять следующие параметры:
cluster.name
: <назовите как-то ваш кластер> — это название вы будете использовать на всех машинах,node.name
: <назовите как-то вашу ноду> — у каждой ноды должно быть свое уникальное название,network.host
: 0.0.0.0http.port
: 9200discovery.zen.ping.unicast.hosts
: ["node1", "node2", "node3"] — имена хостов, к которым можно обращаться, когда нода будет искать кластер. На каждой ноде этот список будет своим (все минус нода, на которой мы меняем конфиг).
Этот файл можно сохранить и скопировать на все остальные ноды. Нужно будет изменить только node.name
.
Давайте теперь проверим, что всё работает. Запустим на каждой ноде команду:
$ sudo -i service elasticsearch start
А затем:
$ curl -XGET 'localhost:9200/?pretty'
В ответ должны получить что-то подобное:
{
"name" : "node4",
"cluster_name" : "newprolab",
"cluster_uuid" : "FKE_a3UTSrifc28ppmkrcQ",
"version" : {
"number" : "5.6.3",
"build_hash" : "1a2f265",
"build_date" : "2017-10-06T20:33:39.012",
"build_snapshot" : false,
"lucene_version" : "6.6.1"
},
"tagline" : "You Know, for Search"
}
Если встречаете Failed to connect to localhost port 9200: Connection refused
, то скорее всего у вас Elasticsearch еще просто не стартовал, немного подождите.
Если ссылается на missing authentication token
, то нужно в конфиг добавить вот эти 2 строчки:
xpack.security.enabled: false
xpack.security.authc.token.enabled: false
После этого понадобится на каждой ноде сделать рестарт:
$ sudo -i service elasticsearch restart
Проделав это всё на каждой ноде, давайте поймем собрался ли из них кластер Elasticsearch. На любой из нод запустите:
$ curl -XGET 'localhost:9200/_cluster/health?pretty'
В ответ должны получить что-то такое:
{
"cluster_name" : "newprolab",
"status" : "green",
"timed_out" : false,
"number_of_nodes" : 4,
"number_of_data_nodes" : 4,
"active_primary_shards" : 11,
"active_shards" : 8,
"relocating_shards" : 0,
"initializing_shards" : 0,
"unassigned_shards" : 0,
"delayed_unassigned_shards" : 0,
"number_of_pending_tasks" : 0,
"number_of_in_flight_fetch" : 0,
"task_max_waiting_in_queue_millis" : 0,
"active_shards_percent_as_number" : 100.0
}
Проверьте, чтобы number_of_nodes
был равен реальному количеству ваших нод. Если всё так, то кластер elasticsearch собран.
Устанавливать Kibana на каждой машине не требуется, но в документации указано, что если вы будет использовать ее в продакшене на кластере, то лучше одну ноду из Elasticsearch кластера вынести и сделать ее Coordinating only node
.
Будем двигаться по порядку. Устанавливаем Kibana аналогично — через пакет. Будем делать это на мастер-ноде, поскольку у нее есть статичный ip, на который мы будем через браузер заходить для запуска Kibana.
$ wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
$ sudo apt-get install apt-transport-https
$ echo "deb https://artifacts.elastic.co/packages/5.x/apt stable main" | sudo tee -a /etc/apt/sources.list.d/elastic-5.x.list
$ sudo apt-get update && sudo apt-get install kibana
Теперь зайдем в конфигурационный файл Elasticsearch и добавим туда следующие строки, чтобы сделать мастер-ноду только координирующей нодой в elasticsearch-кластере:
node.master: false
node.data: false
node.ingest: false
Сделаем рестарт Elasticsearch сервера.
$ sudo -i service elasticsearch restart
Убедимся, что нода изменила свой статус.
$ curl -XGET 'localhost:9200/_cluster/health?pretty'
Установим плагин x-pack.
$ cd /usr/share/kibana/bin/
$ sudo ./kibana-plugin install x-pack
Зайдем в конфиг Kibana:
$ cd /etc/kibana/
Разкомментим порт и поменяем имя сервера на:
server.port: 5601
server.host: 0.0.0.0
Стартанем Kibana:
$ sudo -i service kibana start
После чего зайдем через браузер на порт 5601. Логин: elastic. Пароль: changeme. Kibana работает.
Logstash тоже устанавливается только на одну машину.
$ wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
$ sudo apt-get install apt-transport-https
$ echo "deb https://artifacts.elastic.co/packages/5.x/apt stable main" | sudo tee -a /etc/apt/sources.list.d/elastic-5.x.list
$ sudo apt-get update && sudo apt-get install logstash
Установим опять же x-pack и сразу же плагин для приема сообщений из Kafka:
$ cd /usr/share/logstash/bin
$ sudo ./logstash-plugin install x-pack
$ sudo ./logstash-plugin install logstash-input-kafka
Стартанем Logstash:
$ sudo -i service logstash start
А это и есть ваша лаба. Подключите ELK к вашем потоку данных в Kafka. Постройте свою первую визуализацию логов.
Проверка осуществляется из Личного кабинета , используя REST API ElasticSearch. Он подключится к указанному вами хосту на 9200 порте. Индекс в ElasticSearch должен совпадать с логином ЛК.