avatar Ubuntu Настройка InfluxDB+Grafana+Collectd на Ubuntu

Оперативное получение информации о состоянии инфраструктуры немыслимо без легкого визуального представления процессов происходящих в системах. Наиболее удобным визуальным представлением данных являются графики, согласитесь смотреть на график намного удобнее чем на сухие цифры, а если данных много, то хоть «вешайся».
Для построения графиков можно использовать Zabbix, но у него есть одна проблема, при сборе более 10 000 различных метрик, ему становится плохо, прием утыкается не в базу, а в сам zabbix-server, эта проблема отлично решается с помощью Grafana у которой для хранения используется InfluxDB, да и графики у grafana намного сочнее, смотрите демо. Чтобы все это превратить в полноценную систему мониторинга, можно прикрутить Collectd. Чем мы сегодня с вами и займемся.

Немного статистики использования данной системы в продакшене
Процессор с 8 ядрами загружен в среднем на 44%
загрузка с момент запросов (построение графиков) 85%
Количество хостов на мониторинге, более 600
Объем данных, за неделю, около 130Гб
Количество собираемых метрик, сейчас не скажу т.к. они еще добавляются

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

Установка и настройка InfluxDB

Поднимем права до root
sudo su


скачаем пакет influxdb
wget https://s3.amazonaws.com/influxdb/influxdb_latest_amd64.deb


Установим его
sudo dpkg -i influxdb_latest_amd64.deb


Запускаем службу
/etc/init.d/influxdb start


Отрываем браузер и заходим в админку базы данных

httр://server_IP_address:8083
По умолчанию, логин root проль root (Естественно их нужно сменить на свои!)


нам необходимо создать базу, чтобы не путаться мы назовем ее collectd (имя можете задать по своему усмотрению) ну и жмем Create Database

Для доступа к базе нам необходимо создать пользователя, этот пользователь нам нужен для того чтобы Grafana могла подключаться и выполнять запросы к базе, для построения графиков, т.к. давать доступ root для всех это глупо и как следствие — не безопасно. Нам необходимо создать отдельного, не привилегированного пользователя, который может читать/записывать данные, но не рулить всей базой и тем более, всем сервером баз данных
В списке баз выбираем базу collectd


Создаем пользователя, назовем его Например!- agent с паролем password без прав админа


Конфигурационный фал influxDB расположен:
/opt/influxdb/shared/config.toml


нам необходимо его немного отредактировать, чтобы разрешить cillectd ходить в базу
Находим строку
[input_plugins.collectd]
Снимаем комментарии на сроках, которые указаны ниже

enabled = true
# address = "0.0.0.0" # If not set, is actually set to bind-address.
port = 25826
database = "collectd"
# types.db can be found in a collectd installation or on github:
# https://github.com/collectd/collectd/blob/master/src/types.db
typesdb = "/usr/share/collectd/types.db" # The path to the collectd types.db file


Где:
Указываем что плагин включен
Указываем порт, с которого запросы будут напрямую попадать в базу
Указываем имя базы, в которую будет производиться запись
Тип базы

перезапустим InfluxDB
/etc/init.d/influxdb restart


На этом настройку базы данных мы закончили.

Установка и настройка Grafana

Есть 2 пути, ставить из tar.gz или ставить deb пакет, второй проще и правильнее, его и выполним.
добавим репозиторий в список
nano /etc/apt/sourse.list


Добавляем запись
deb https://packagecloud.io/grafana/testing/debian/ wheezy main


Нам необходимо добавить ключ
curl https://packagecloud.io/gpg.key | sudo apt-key add -


Обновим систему и установим Grafana
apt-get update
apt-get install grafana


Добавим сервер grafana в автозапуск при старте системы
update-rc.d grafana-server defaults 95 10


Запустим его
/etc/init.d/grafana-server start


По умолчанию web интерфейс висит на порту 3000
заходим httр://server_IP_address:3000
По умолчанию логин admin пароль admin (Естественно их нужно сменить на свои!)


первым делом нам необходимо настроить подключение к базе
В верхнем левом углу жмем на иконку и выбираем Data Sources


Настраиваем подключение к базе

Сейчас расскажу почему именно так я сделал настройки.
Name Production названо так чтобы можно было понять за что отвечает созданный dashbord
Галка по умолчанию указывает на то чтобы подключать всех новых пользователей в нему т.е. все вновые пользователи, когда будут создавать панели графиков будут, по умолчанию, получать графики для Production.
Раздел http settins
URl- т.к. rgafana и influxdb работают у нас на одном сервере то я указал localhost, если конфигурация у вас состоит их нескольких серверов, то указываем IP или DNS имя сервера где работает база данных, API базы InfluxDB, по умолчанию, слушает порт 8086
Type указываем тип базы данных, в нашем случае Influxdb 0.8.x, а именно v0.8.8 (Stable), т.к. Influxdb 0.9.x, на момент написания статьи, находится в состоянии Release Candidate
Access — указываем Proxy
В Grafana существует 2 способа подключения к базе:
Direct -прямой, когда логин и пароль передаются из браузера пользователя который просматривает графики, просмотрев код страницы он может узнать логин и пароль для подключения к базе, а это вообще не по феншую т.к. графики может смотреть кто угодно, но пароль и логин базы, ему знать совершенно не обязательно, а скорее всего и не положено.
Proxy — пароль и логин пользователя от grafana к серверу influxdb передается внутри системы, от пользователя приходят запросы только к серверу grafana, лично мне, кажется что второй вариант более правильный.
InfluxDB Details
Database указываем имя базы данных, которую мы создали ранее — collectd
указываем логин пользователя agent и паролем password
Жмем Update и подключение готово.

Чтобы протестировать работу Grafana с InfluxDB нам необходимо сгенерировать какие-то данные, на основе которых можно создать графики, пусть эти графики будут далеки от жизни, а значения будут сгенерированы псевдо-случайным образом, зато можно будет понять как делать запросы и как все это должно выглядеть.

Для быстрого понимания, я набросал скрипт на bash, который генерит случайные данные и записывает их в базу, на основе этих данных можно построить графики, собственно скрипт:


#!/bin/bash
NUM=0
while [ 1 ]; do
NUM=$((NUM+1));
TIME=10
WHERE='http://localhost:8086/db/collectd/series?u=agent&p=password'
echo "Generate data, loop $NUM"

curl -X POST -d '[{"name":"websrv","columns":["connect"],"points":[['$RANDOM']]}]' ''$WHERE''
curl -X POST -d '[{"name":"websrv","columns":["200pages"],"points":[['$RANDOM']]}]' ''$WHERE''
curl -X POST -d '[{"name":"websrv","columns":["500pages"],"points":[['$RANDOM']]}]' ''$WHERE''

curl -X POST -d '[{"name":"dbsrv","columns":["selects"],"points":[['$RANDOM']]}]' ''$WHERE''
curl -X POST -d '[{"name":"dbsrv","columns":["updates"],"points":[['$RANDOM']]}]' ''$WHERE''
curl -X POST -d '[{"name":"dbsrv","columns":["connect"],"points":[['$RANDOM']]}]' ''$WHERE''

curl -X POST -d '[{"name":"filesrv","columns":["connect"],"points":[['$RANDOM']]}]' ''$WHERE''
curl -X POST -d '[{"name":"filesrv","columns":["sendfiles"],"points":[['$RANDOM']]}]' ''$WHERE''
curl -X POST -d '[{"name":"filesrv","columns":["savefiles"],"points":[['$RANDOM']]}]' ''$WHERE''

sleep $TIME
done

Алгоритм работы прост, до безобразия, скрипт в бесконечном цикле, с паузой между циклами 10 сек, подключается к базе InfluxDB с логином и паролем и отправляет данные. Скрипт генерит данные для 3х серверов webserv, dbsrv, filesrv, он записывает данные в поля с именами, за что отвечает значение «columns» и с помощью переменной $RANDOM генерирует случайное значение для этого поля, для каждого запроса данные генерируются заново, ну и заодно я добавил чтобы скрипт выводил номер круга, чтобы было понятно сколько скрипт «намотал кругов».

запускам скрипт
/bin/bash scriptname.sh


Результат работы скрипта выглядят так


После этого лезем в Grafana и пытаемся создать график


В поле Series указываем имя сервера, websrv (работает автодополнение!) значение указываем connect, те что мы сгенерировали скриптом, остальные значения добавляем аналогичным образом, врезультате у нас должен получиться график похожи на это:

Значение других полей наших серверов создадите сами.

Из этого видно что данные в базу пишутся и читаются, ну а графики строятся, нам осталось прикрутить к этому делу collectd

Настройка Collectd
Тут уже все просто, для начала установим cllectd
apt-get install collectd


настраиваем конфигурационный файл
nano  /etc/collectd/collectd.conf


Редактируем следующие строки:
Hostname "srvgrafana"   #Указываем имя хоста, от которого будут идти данные
FQDNLookup false        #Если DNS записи для хоста нет, то отключаем проверку 
AutoLoadPlugin true     #Включаем автозагрузку плагинов
Interval 10             #Указываем интервал обновления-10 сек (данные будут отправляться каждые 10 сек) 

LoadPlugin network      #Снимаем комментарий с этой строки, чтобы загружался плагин network он нам нужен!


Настраиваем сам плагин Nwtwork, он нужен для того чтобы отправлять данные в InfluxDB, создадим запись, подобная запись уже есть в конфиге, но она очень большая, а нам нужно всего 3 строки, вот мы их и добавим в конфиг
<Plugin network>
        Server "localhost" "25826"
</Plugin>

Где:
Server Localhost -адрес сервера где работает IndluxDB порт который мы открыли для записи данных от collectd.
нас осталось посмотреть что у нас с графиками

перезапускаем cillectd
/etc/init.d/collectd restart


Заходим в графана, создаем dashbord и там новый график
Набираем srv, отработает дополнение и выдаст нам различные датчики


Можно выбрать, например, датчик
srvgrafana/interface-eth0/if_packets

Т.к. пакеты будут бегать по сети, то мы сразу увидим готовый график, что-то типа такого:

Вообще, на основе SQL-подобных запросов можно организовывать довольно сложную выборку данных из базы и построения, на основе этих данных, графиков.
На этом с настройкой все
Что качается недостатков системы?!
Нам мой взгляд самым серьезным является отсутствие авторизации на запись данных в influxdb от collectd т.е. все данные отправленные в порт 25826 будут записаны в базу соответсвенно туту есть 2 варианта:
1) Не выставлять порт InfluxDB в интернет
2) Ограничить доступ к порту через iptables разрешив подключаться или определенным IP или диапазону IP адресов

как можно немного улучшить данную систему?!
Чтобы не ходить на порт 3000 или 8083 можно установить Nginx и настроить прксирование через
proxy_pass http://localhost:3000
ну или что-то в таком духе

На этом все.

0 комментариев

Есть что добавить? Регистрируйся и оставляй комментарии!