от mitio(7-06-2005)

рейтинг (35)   [ добре ]  [ зле ]

Printer Friendly Вариант за отпечатване


Малко висш пилотаж - изграждане на статистика с Cacti и RRDtool (за начинаещи)
една страница на Университетският Изчислителен Център



 Съдържание:

1.Увод
2.Цел
3.Инсталация
4. Създаване на обект устройсвто.
5. Създаване на 'Date Input Methods'.
6. Създаване на 'Data Templates'.
7. Създаване на 'Data Sources'.
8 Създаване на 'Graph Management'.
9. Заключение.
10.Препратки



1. Увод
     "Know your network!"
Тази статия няма за цел да убеждава читателят в нуждата от статистика. Целта е да се изложи конкретна възможност за колекциониране и визуализиране на статистически данни свързани с вашата мрежа.
- Добре, но защо точно Cacti?
Cacti е пълно, графично решение, което колекционира и визуализира данни. Продукта еopen source и е под GNU лиценз. Моментната версия на продукта е 0.8.6d (april 26th, 2005). Използва се успешно от редица университети и институции сред които Purdue University и Space Science and Engineering Lab - Montana State University. Тази програма е приложена и фунционира и в Софийският Университет.
Голямото преимущество на Cacti идва от използването на RRDtool (Round Robin Database). В действителност Cacti е само web базиран frontend на RRDtool.
За по-нетърпеливите предлагам да разгледат screenshots на Cacti.
- А, защо пък RRDtool? Не може ли MRTG?
RRDtool e наследник на MRTG. Мнозина определят RRD като "industry standard data logging and graphing application". В действителност това е система, която съхранява и визуализира времеви данни. RRD таблиците съхраняват данните в много компактен формат, който не се увеличава във времето.
За по-нетърпеливите предлагам да разгледат gallery на RRDtools. Препратката е към старата версия насайта, но там има много по-добри примери. тук, тук, тук и тук.
- Защо да чета тази статия? Не може ли директно да си прочета документацията на продуктите?
Може. Даже е препоръчително ;). В края на статията има препратки с повечето информация. Целта обаче ми е да предоставя на читателя работещо решение, базирано на моя опит сгорните програми :).
Съдържание

2. Цел
 
         Целта ми е да насоча вниманието на читателят върху продуктите Cacti и RRDtool и възможностите които те предлагат. В статията ще се представи, както споменах, конкретно решение за визуализиране настатистически данни свързани с вашата мрежа - примерно големина трафик. 
- За кого е предназначена статията?
Основната таргет група, са администраторите, които нямат опит в изграждането на статистика и или не са се занимавали с Cacti. А от останалите които вече са се борили с горните два продукта очаквам силна градивна критика. :)
Съдържание

3. Инсталация
          Необходими пакети: httpd php php-mysql php-snmp mysql mysql-server net-snmp rrdtool.
За тези от вас които ползват Fedora, радостна вест е наличието на компилиран RPM пакет за Cact (от секцията за download в официалният сайт на Cacti (sha1 md5) или от репоситорито на DAG (dsa sha1 md5 gpg))
За инсталция ще използваме yum :
# yum install cacti rrdtool 

Остава да се създаде база данни на cacti в MySQL :
 # mysqladmin --user=root create cacti 
# mysql cacti # mysql --user=root mysql
mysql> GRANT ALL ON cacti.* TO cactiuser@localhost IDENTIFIED BY 'somepassword';
mysql> flush privileges;

Настройка на конфигурационният файл /var/www/cacti/include/config.php :
 $database_default = "cacti"; 
$database_hostname = "localhost";
$database_username = "cactiuser";
$database_password = "somepassword";

Ако сте инсталирали cacti от RPM, то собственика на /var/www/cacti/{log,rrd} директориите е потребителят cacti. Ако това не е така, то трябва да ръчно да зададете собственика на тези директории.
И последно остана да се укаже периодът от време, през който cacti ще събира статистическите данни. За целта трябва да се добави в /etc/crontab следният ред :
Остава да отидете на http://VASHIQT-SERVER/cacti/ и да продължите с инсталацията.
 */1 * * * * cacti php /var/www/cacti/poller.php > /dev/null 2 > &1 

По този начин указваме статистика да се събира всяка минута.
Съдържание

4. Създаване на обект устройство.
            Вече инсталирали Cacti, започваме реалната работа :).
Първото нещо, което ще направим е създаването на devices. Отиваме на менюто в ляво Devices и след това на Add. Формата на попълване е нещо то вида на:

filling devices form(натисти за да се уголеми)

Забележете, че ако въпреки възможността за 'Host Template' Linux Router, за извличане на SNMP информация от нашият Linux-ски сървър, ще изберем Generic SNMP-enabled Host.
Това което е дразнещо (за мен) е не толкова липсата на реализация на snmpv3, колкото липсата на възможност да указеш че не искаш snmpv1 или snmpv2. Това обаче се заобикаля, като полето 'SNMP Community' се остави празно.

Съдържание

5. Създаване на 'Date Input Methods'.
            Определено това е най-тежката задача, която трябва да направим. Въпреки съществуващата документация, човек може да си загуби не малко часове докато създаде точният Input Methods.
            И така, отиваме на менюто в ляво Date Input Methods и след това на Add. Формата на попълване е нещо то вида на:

filling dataInputMethod form(натисти за да се уголеми)

Това което буди интерес е полето Input Type, и по специално опциите 'Script/Command' (която ще използваме сега) и 'Script - Script Server (PHP)' (по данни на авторите, използването му драстично ускорява изпълнението на скриптовете).
Внимание! Трябва да се внимава за синтаксиса на полето 'Input String':
 bash <path_cacti>/scripts/snmpv3_data.sh <ipAddress> <securityName> <authKey> <privKey> <interface>
           

Първата променлива ('bash') указва командата която ще изпълни нашият скрипт. Може това да е perl, php и други. е пременлива, връщаща физическият път на програмата (за RPM решението, той е: /var/www/cacti). Следващите променливи (забележете че са заградение в ) се задават като параметри на скрипта ви, в последователността която сте указали.
След като дадете 'Create', страницата ви пренасочва към себе си, но с възможностда въвеждате информация за входящите и изходящи променливи. Това става с натискане на Add на сътветната секция (Input Fields или Output Fields).
За синтаксиса на Input Fields няма да се спираме. Само ще отбележа, че вероятно би ви било интересно възможността за задаване на 'Regular Expression Match'.
Внимание! Отново трябва да обърнем внимание на следващото : Output Fields. Важене синтаксиса на output-а от нашият скрипт. Ako скрипта ни връща само една променлива, то връщаният резултата трябва да бъде в следният формат:
 <value_1>
           

Само стойност (без ). Когато обаче искаме да визуализираме повече данни,имам два избора - или да направим много скриптове (евентуално и Date Input Methods) или да напишем нашият скрипт така, че да връща повече от една стойност. За това обаче трябва да спазим следният синтаксис:
 <fieldname_1>:<value_1> <fieldname_2>:<value_2> ... <fieldname_n>:<value_n>
           

Удачен пример има в документацията на Cacti. Да кажем че имаме скрипт който връща 3 променливи: 1min, 5min и 10min (да речем за отчитане на натовареност). Изходът който трябва да връща скриптани, трябва да е в следният вид:
 1min:0.40 5min:0.32 10min:0.01
           

Ето сега и кода на snmpv3_data.sh:
 #!/bin/bash
 
 # $1 - ipAddress
 # $2 - securityName
 # $3 - authKey
 # $4 - privKey
 # $5 - interface
 
 dateInOctets=`/usr/bin/snmpwalk -v 3 -n '' -u $2 -a MD5 -A $3 -x DES -X $4  -l authPriv $1 IF-MIB::ifInOctets |cut -d" " -f 4`
 dateOutOctets=`/usr/bin/snmpwalk -v 3 -n '' -u $2 -a MD5 -A $3 -x DES -X $4  -l authPriv $1 IF-MIB::ifOutOctets| cut -d" " -f 4`
 
 inOctets=0
 outOctets=0
 
 for Int in ${5} ; do
         curInt=0
         for i in ${dateInOctets} ; do
                 curInt=`expr ${curInt} + 1`
                 if [ ${curInt} -eq ${Int} ] ; then
                         inOctets=`expr ${inOctets} + ${i}`
                 fi
         done
         curInt=0
        for i in ${dateOutOctets} ; do
                 curInt=`expr ${curInt} + 1`
                 if [ ${curInt} -eq ${Int} ] ; then
                         outOctets=`expr ${outOctets} + ${i}`
                 fi
         done
 done
 
 echo  "inOctets:${inOctets} outOctets:${outOctets}"
 
 # maded by Mitio Matanov
 # Wed May 25 00:28:32 EEST 2005
 
           

Забележете, че този скрипт изпълнява заявките към snmp агента в режим (securityLevel - опцията '-l') в authPriv (authenticated and encrypted). Нещото, което го няма реализирано в Cacti (за сега :)), и което ни кара да използваме външен (наш) скрипт за извличане на информацията.
Също така вместо IF-MIB::ifOutOctets, може да използвате IF-MIB::ifHCOutOctets което е 64-bit-отва версия на ifOutOctets - по този начин се избягва превъртането на брояча. (Това превъртане обаче не влия по никакъв начин на записите в RRD базата данни, тъй като от RRDtool са предвидели съществуването на подобни, нежелани, данни и те се игнорират (т.е. не се взимат в предвид))

Съдържание

6. Създаване на 'Data Templates'.
            Вече преборили се с Data Input Methods, изпили по едно кафе или бира, продължаваме напред :).
Трябва да създадем Date Tempalte, който използва нашият Data Input Method. Date Template всъщност е образецът, който ще използваме при създаване на RRD базите от данни.

От менюто в ляво Date Tempalte избираме на Add. Формата на попълване е нещо от вида на:

filling dataTemplate  form(натисти за да се уголеми)

Няма много интересни полета, но все пак заслужава си да се каже по някоя дума. :). Под всяко поле, което попълваме, има checkbox бутон. Ако искаме в създаването на базата от данни да имаме възможност да редактираме това поле, то трябва да отметнем checkbox-а.
Другото интересно е опцията 'Step'. Това е стъпката, през която ще се вика Data Input Method-а (т.е. времето между два updates). Измерва се в секунди.
Интересно е и полето Heartbeat. Това е опция идваща от RRDtool - максималното количество време (в секунди) което трябва да мине между два updates, преди данните да се определят като 'unknown' (или 'nan', както може да се срещне). Препоръчва се да е двойно повече от 'Step'.
Следващата важна общия, това е Data Source Type. Чрез нея оказваме как Cacti (поскоро RRDtool-сът, който Cacti използва) ще третитра постъпващите данни. Възможните стойности са GAUGE, COUNTER, DERIVE, ABSOLUTE. Тук нямаме възможност да използваме реализираният в RRDtool COMPUTE . За нашите цели ще използваме 'data source type'-ът COUNTER. При него се отчита разликата между последните две стойности. Примерно за време x имаме стойност 100000000, а за време x+60 100500000, то в базата данни ще се запише за времето x+60 стойността 500000 (разликата). Повече информация отностно 'data source type' трябва се прочете от документацията на RRDtool за rrdcreate. Полезна е и 'How to measure' секцията в същият документ.
И... последно за тази секция - полето Associated RRA's. Благодарение на тези архиви (archives), големината RRD файла не зависи от броя на записите в него :). Тук много, ама наистина много кратко ще кажа какво е RRA (round robin archives). Архивът RRD се състои от няколко RRA редове (RRA lines). Всеки от тези редове пази информация за AVERAGE, MIN, MAX или LAST за конкретна променлива (data-sources (DS)) за конкретно време.
Примерен RRA ред може да съдържа 120 AVERAGE стойности, за период - последната седмица.
По подразбиране Cacti предлага само 4 типа RRAs: 'Daily (5 Minute Average)', 'Weekly (30 Minute Average)', 'Monthly (2 Hour Average)' и 'Yearly (1 Day Average).
За да съзадеме свой RRA template, отиваме на 'Data Sources', 'RRAs', 'Add'. Ето примерен RRA, който да съдържа информация за ежеминутни данни за последните 2 часа:
filling RRA form(натисти за да се уголеми)

Съдържание

7. Създаване на 'Data Sources'.
            Хех. Има вие още четете. Браво, браво! Радостната вест, е че трудната част мина.От тук нататък са само използване на готовите вече образци (templates). 
Отиваме на 'Data Sources', 'Add'.
За полето 'Selected Data Template' избираме името на template-ът който направихме в предната секция (Ако точно сте следвали примерните графики, това е 'UCC SNMPv3 Data').
А за 'Host' избираме template-а на създаден от нас в секция 4. (Ако пак сме следвали графиките, то това е 'GW FNPP'). Забележете, че по подразбиране имаме Localhost (127.0.0.1)
След 'Create' продължаваме с попълването на необходимата информация. Вижте единпример за 'Data Sources':
filling dataSources form(натисти за да се уголеми)

Тъй като полетата authKey, privKey и securityName не е небоходимо ;) да са публично достояние, съм сложил картинка отгоре :).
Тук има няколко интересни моменти. Такъв е променливите които се използват. |host_description| е стойността на променливата указана в Description-а полето на Host-а (секция 4).
Променливата пък указва пътят до базите данни (това е /rra (специално в компилираният RPM директорият е /var/www/cacti/rra).
Също така е полезно да се знае, че след като създадете 'Data Sources', веднага се създава rrd файл, който обаче е празен (празен обаче не означава, че е с големина 0. Както казах по-горе, базата данни RRD остава постоянна във времето, дори и когато няма данни в нея). Едва след 2 update-а ще имеме някаква информация ( 'data source type'-ът COUNTER изисква поне 2 стойности :)). Така че едва след 2-3 минути ще иматереални данни :).
За тест, може да проврите от конзола състоянито на файла:
 # rrdtool fetch /var/www/cacti/rra/gw_fnpp_inoctets_50.rrd AVERAGE --start -5minutes 
                       outOctets            inOctets
 1117629540: 1.6399165710e+03 3.7027214253e+03
 1117629600: 1.3154775956e+03 5.1096389090e+03
 1117629660: 7.4422540984e+02 2.6793845883e+03
 1117629720: 1.9597743077e+03 2.2392041400e+04
 1117629780: 4.1897202825e+03 6.3886155621e+04
 1117629840: nan nan

Забележете, че за времето 1117629840 (първата стойност на последният ред) е времето (seconds since the Unix Epoch) през което се очаква да е следващият update. Логично ние все още нямаме данниза този период и затова стойността е 'nan'.
Повече информация отностно използването на rrdtool fetch, може да намерите в документацията за rrdfetch.
Съдържание

8 Създаване на 'Graph Management'.
           И... Хайде да визуализираме данните. 'Graph Management', 'Add'. Тук няма нищо трудно или объркващо, така, че направо към примера: 
filling graphManagement form(натисти за да се уголеми)

Интересно обаче би ви било да видите URL-то във вашият брaузер. Трябва да е нещоот вида на:
  http://VASHIQT-SERVER/cacti/graphs.php?action=graph_edit&id=44
           

Интересува ви id-то на графиката (в този пример това е '44'). С негова помощ имате достъп до всички графики свързани с това id:
  http://VASHIQT-SERVER/cacti/graphs.php?local_graph_id=44&rra_id=all
           

Забележете че това са 6 графики - по една за всеки 'Associated RRA' който сме указали в 'Data Templates' (секция 6).
Съдържание

9. Заключение
            Съвсем кратко заключение : 
Както виждате това е едно доста голямо и все пак, невсеобхватно ръководство. В него не са описани всички възможности както на Cacti, така и на RRDtool. Живот и здраве, и при наличие на желаещи, може да продължа темата за Cacti, но този път документа ще е за 'напреднали' :->. Също така не съм описал икак се инсталира и конфигурира SNMP Agent (разбира се това е извън темата, но е полезно/необходимо да се знае.)
В следващите документи ще разгледам други аспекти/възможности за колекциониране и визуализиране на статистически данни.

Съдържание

10. Препратки
          1. Cacti официална страница 
2. Cacti документациа
3. RRDtool официална страница
4. RRDtool документациа
5. Статистикa на трафика на СУ

Съдържание



<< Виртуален тунел на базата на Linux -2 | Как да си направим малък торент тракер на Линукс машината >>