![]() |
Настройка системы мониторинга интерфейсов сети с помощью netmond и rrdtool
Опять статья Кропачева Артемия (aka neon), сентябрь 2006.
Думаю будет полезна администраторам, ибо часто нужно знать что творится у вас в сети и при ходе из строя сервером можно заметить, где обрыв и когда произошел. Мониторинг интерфейсов сети с помощью netmond и rrdtool Введение С ростом размера компьютерной сети, увеличением количества работающих серверов и сервисов, увеличением числа обслуживаемых клиентов и пользователей, а так же увеличением их критичности всё более актуальной задачей является необходимость своевременного устранения сбоев, а, следовательно, своевременного их нахождения, другими словами - мониторинг сети. На мой взгляд, наиболее часто встречающимися задачами мониторинга локальной сети являются:
Существует большое количество уже готовых систем мониторинга: nagios, mrtg, zabbix,cacti. Настройка "полной" системы мониторинга является достаточно сложной задачей и выходит за рамки данной статьи. Любой системный администратор рано или поздно и ввиду различных задач сталкивается с необходимостью анализа закономерностей сетевого трафика в течении часов, суток, месяцев и т.п. Пожалуй, наиболее удобным способом является просмотр графиков пакетных и байтовых нагрузок на каналах. Данная статья ставит своей задачей донести до читателя мой личный опыт по отображению статистики на интерфейсах серверов и оборудования в наглядном виде (графики). Эта проблема может быть решена большим количеством способов (например cacti, mrtg), но я реализовал именно этот, чем и хочу поделиться. Используемое программное обеспечение Для решения поставленной задачи потребуются:
Установка Чтобы приступить к настройке системы ставим необходимое программное обеспечение. Вся установка велась из портов FreeBSD. Если у кого-то есть желание ставить из исходников или пакетов - пожалуйста.
Настройка netmond Конфигурационный файл netmond лежит в файле /usr/local/etc/netmon.conf.sample. Переименовываем его в netmon.conf и редактируем: # mv /usr/local/etc/netmon.conf.sample /usr/local/etc/netmon.conf # vi /usr/local/etc/netmon.conf Ниже будет дан пример конфигурационного файла с описанием. Код:
RootDir "/var/netmon" # Каталог для сохранения данных
Параметр Saving изменён с 300 на 60. Необходимо для правильного сохранения минутных статистик в базу rrdtool. Переменная RootDir содержит путь до каталога куда netmond будет сохранять полученные данные прописанными методами сохранения. Следует предусмотреть достаточный объём свободного места на разделе (Файл rrdtool для одного интерфейса в нашем случае будет занимать порядка 3,5 Мб). В примере конфига добавлено для примера два объекта мониторинга: коммутатор Cisco и сервер на базе FreeBSD. В свойствах объекта мониторинга задаётся его IP адрес, метод опроса, и методы сохранения данных. Мы используем встроенный метод опроса router, который считывает по SNMP статистику с интерфейсов и некоторую другую информацию. Методу передаётся 1 параметр (выражение в кавычках после названия метода)- строка community (что то типа пароля для доступа к данным по SNMP). В параметрах объектов описано так несколько интерфейсов: один по названию (по IfName), второй по номеру (по IfIndex). Кому как удобнее пользоваться. Например, при установке службы SNMP в MS Windows у интерфейсов вообще ifName отсутствует, так что приходится пользоваться только вторым способом. Для каждого интерфейса прописано 2 метода сохранения данных: "make_dir" и "save_rrd_if". Метод сохранения данных "save_rrd_if" передаёт данные собранные встроенным методом опроса "router" (показатели счётчиков байт, пакетов, дропов, ошибок), имя файла rrdtool базы куда надо данные поместить (берётся из переменной netmond "DATADIR"), а так же параметры базы rrdtool необходимые для её создания и последующего обновления на вход скрипта /usr/local/sbin/rrdsave. Если файл базы не существует скрипт его создаёт, если существует - то добавляет/обновляет в нём данные. Опишу подробнее строки с данными (после директивы Data):
Скрипт для сохранения данных в rrdtool Далее необходимо создать скрипт сохранения данных в базу rrd /usr/local/sbin/rrdsave. Вот его листинг: Код:
#!/usr/local/bin/perlКод:
# chmod 755 /usr/local/sbin/rrdsaveПриложение готово к запуску, запускаем кому как удобно: Код:
# /usr/local/sbin/netmondКод:
# cd /var/netmon && lsКод:
# chmod -R 755 /var/netmonКод:
# cd /var/netmonКод:
# rrdtool fetch rrdint AVERAGE, где rrdfilename - имя созданного файла.Код:
ifoperstatus ifinoctets ifoutoctets ifinerrors ifouterrors ifindrops ifoutdrops ifinucastpkts ifoutucastpkts ifinncastpkts ifoutncastpktsКод:
# rrdtool info rrdintКод:
filename = "rrdint"Приведу немного изменённую цитату с soft.risp.ru: Netmond хранит все накопленные данные о текущем состоянии сети у себя в памяти, в специально предназначенных контейнерах - переменных VARIABLE. Значения VARIABLE могут вводиться в программу по результатам работы системы сбора данных, а выводиться с помощью разнообразных методов сохранения SAVE. Однако вывод данных с помощью SAVE выполняется только по инициативе самого Netmond (периодически или в зависимости от каких-то условий) совершенно конкретных значений, предусмотренных конфигурацией программы. Что может быть очень удобно при решении задач накопления и долговременного хранения данных, но, например, практически не пригодно для задачи получения мгновенной актуальной картины состояния всей сети в реальном времени. Для решения задачи вывода любых данных в произвольные моменты времени в Netmond встроен специальный сервер NetState, который обеспечивает авторизованным сетевым клиентам асинхронный доступ ко всему массиву переменных VARIABLE на чтение. Весь массив переменных VARIABLE представляется в виде иерархии имен переменных и их владельцев, разделенных специальным символом `!': Обьект!Подобьект!Переменна я = Значение Возможно получение текущих и предыдущих значений переменных, а также выбор интересующих переменных по REGEX-маскам на их имена. Netstate сервер удобен для проверки правильности работы программы, а так же получения всех текущих переменных, например текущее показание счётчика байт на интерфейсе, состояние объекта (UP,DOWN), значение пользовательских переменных и т.п. Подключение к netstate выполняется по команде: Код:
# telnet 127.0.0.1 3333NetState server ready (timeout 30 sec.) Compress: ZLIB 1.2.2 ! В процессе отладки системы неплохо бы узнать основные команды. Приведу их в примерах Any ;* - покажет все переменные которые держит в памяти netmond. Object NAME - покажет имена всех объектов. Приведу часть вывода сервера на эту команду: !OBJECT Server-Proxy!NAME = "Server-Proxy" !OBJECT Catalyst11!NAME = "Catalyst11" !OBJECT Catalyst25!NAME = "Catalyst25" !OBJECT Catalyst34!NAME = "Catalyst34" !OBJECT Catalyst45!NAME = "Catalyst45" !OBJECT Catalyst46!NAME = "Catalyst46" Interface STATUS - покажет статус интерфейсов (DOWN,UP) Object Cisco - покажет переменные которые есть у объекта "Cisco" Interface Cisco!1 - покажет данные по интерфейсу "1" у объекта "Cisco" Any Cisco!1!IfIndex - покажет значение переменной IfIndex на интерфейсе/сервисе "1" объекта "Cisco". Продолжение следует... |
Настройка агентов SNMP
Еще хотелось бы отметить, что для работы процесса съёма статистики с сетевого оборудования (сервера, коммутаторы, маршрутизаторы) необходимо настроить их SNMP программное обеспечение и определить comminuty string, которым уже будет пользоваться Method router. Приведу примеры минимальной настройки для оборудования и некоторых сервисов для снятия статистики по SNMP.
Проверка работы SNMP агентов После запуска агентов SNMP необходимо выполнить проверку работы. Я делаю это через snmpwalk из пакета Net-SNMP вот так: % snmpwalk -v версия_протокола cc communitystring IP % snmpwalk -v 1 -c public 172.21.81.3 Если данные идут, значит служба работает как надо. Если не идут: либо не правильно задана community string, либо агент snmp не запущен, либо данному хосту нельзя забирать данные по SNMP. Для того чтобы определить IfIndex для интерфейсов, например в MS Windows, я делаю следующее: читаю ifTable (кому удобнее можете все данные по snmp прочитать) нахожу там что-то вроде: Код:
IF-MIB::ifNumber.0 = INTEGER: 2Мониторинг интерфейсов, имеющих IfIndex больше 65535 С такой задачей я столкнулся только при мониторинге серверов MS Windows. Причина в том, что netmond отказывается принимать интерфейсы в конфигурационном файле, имеющие IfIndex больше 65535, узнать об этом можно будет после запуска в файле /var/log/messages будет строка вроде "interface index out of range". Лекарство нашлось только маленькой правкой кода netmond в файле parseconf.y. Находим там поиском 2 строки содержащие "interface index out of range" и правим в условиях: if ($2 < 1 || $2 > 65535) цифру 65535 на что то вроде 655350 (может не совсем правильно, но я сделал так). После этого пересобираем netmond. Код:
# cd /usr/ports/net-mgmt/netmondДля того чтобы сохранять какие-то другие числовые параметры (загрузка CPU Cisco маршрутизаторов, свободная память, количество процессов и т.п.) в rrdtool необходимо сначала их получать, то есть написать соответствующий метод опроса (см. http://soft.risp.ru), чтобы определить переменную в netmond. Если числовое значение считывается по SNMP через известный идентификатор, то можно в конфигурационном файле netmond прописать: Код:
Save "save_var" {Код:
# rrdtool fetch testvar AVERAGEТаким образом, мы имеем систему сбора числовых параметров и сохранения их в rrdtool базу. Теперь самое дело отобразить полученные значения. Отображение можно сделать средствами командной строки (подробнее man rrdgraph). Я приведу пример скрипта для построения графиков байтовой загрузки для файлов интерфейсов, созданных методом "save_rrd_if": Код:
#!/bin/shКод:
% /path/to/script /путь_до_создаваемого_изображения /путь_до_rrd_файла начальное_время_на_графике конечное_время_на_графикеКод:
% script /tmp/graph.png /var/netmon/Cisco/Interface1/rrdint -1d nowЧтобы построить график, например, по моноадресным пакетом, достаточно будет поменять 2 строки, задать другой источник данных (другой столбец в нашем случае): Находим строки: DEF:ifin=$2:ifinoctets:AVERAGE \ DEF:ifout=$2:ifoutoctets:AVERAGE \ Меняем на: DEF:ifin=$2: ifinucastpkts:AVERAGE \ DEF:ifout=$2: ifoutucastpkts:AVERAGE \ Название столбцов можно посмотреть у файла через rrdtool fetch или rrdtool info. Чтобы построить данные из одного столбца, или одной переменной (как у нас в примере testvar) скрипт придётся модифицировать. Покажу пример как это сделать: Код:
#!/bin/shПример Web оболочки для работы с графиками Описанный выше способ построения графиков не всегда удобен. Некоторые задачи администрирования требуют просмотра многих графических зависимостей за короткий промежуток времени, поэтому мне пришлось написать под свои нужды некоторый web интерфейс на Perl и Java- Script для удобной работы с графиками загрузки интерфейсов сети. Скачать пример можно вот с http://slil.ru/23560451 (~13 Kb). Данный архив содержит 2 каталога (cgi-bin,data) и описание по установке. Принцип работы скрипта сводится к следующему: получив запрос от пользователя скрипт подключается к netstate порту у netmond и считывает имена всех интерфейсов, объектов и сервисов, а так же DATADIR для них. Скрипт на основании этих данных строит дерево объктов мониторинга с интерфейсами и пользователю остаётся лишь выбрать требуемый интерфейс для просмотр графика. Настройка скрипта отображения данных: Код:
Копируем содержимое каталога cgi-bin (файл shownetmon) в соответствующий каталог web сервера.В заключении хотел бы отметить нагрузку на компьютер, создаваемую созданной системой. Данная система разворачивалась на компьютерах с различной тактовой частотой CPU. Как показал опыт Intel Pentium 166 мог сохранять и отображать статистику примерно по 200 интерфейсам. Компьютер на базе Intel 867 Мгц справляется без труда с 500 интерфейсами (больше просто не было), не нагружая систему больше 1%. Лишь на момент сохранения нагрузка слегка возрастает на 1-5 секунд. Если учесть, что обновление данных в базах rrdtool идёт раз в минуту, можно сказать, что полученная система требует куда меньше ресурсов системы, чем старушка mrtg. Кропачев Артемий (aka neon), сентябрь 2006 |
Молодец!
|
| Время: 21:58 |