RRDtool ja võrgugraafik

Allikas: Kuutõrvaja
Redaktsioon seisuga 22. aprill 2013, kell 10:33 kasutajalt Drakan (arutelu | kaastöö) (Andmete uuendamine)

Sissjuhatus

RRDtool on vabavaraline andmete hoidmise ja graafikute loomise vahend. See toetab mistahes arvulisi andmemassiive. Näiteks: võrguliiklus, temperatuur, protsessori kasutus, kõvaketta ruum, aktiivsed võrguühendused, failide arv kettal jms.

Install

Paigaldame serverisse SNMP teenuse. Täpsemalt on selle paigaldamisest juttu palas net-snmp.

Paigaldame ka rakenduse RRDtool.

Andmefaili loomine

Kõige keerulisem osa RRDtooli juures on andmebaasi loomine, mille sees andmeid hoitakse. Järgmised parameetrid tuleb enne andmebaasi loomist välja selgitada:

1. kui tihti andmeid lisatakse? [--step X] (samm on vaikimisi 300 sekundit)
2. mitut erinevat andmejada andmebaasis hoitakse?
3. kui pika aja kohta andmeid hoitakse?

Loome võrguliikluse andmebaasi, kus andmete uuendamine toimub iga 300 sekundi (5 minutit) tagant. Meil on vaja graafikut nii ööpäeva, nädala, kuu kui aasta jaoks.

Käivitamie järgmise käsu:

rrdtool create liiklus.rrd \
  --step 300               \
  DS:in:COUNTER:600:U:U    \
  DS:out:COUNTER:600:U:U   \
  RRA:AVERAGE:0.5:1:288    \
  RRA:AVERAGE:0.5:6:336    \
  RRA:AVERAGE:0.5:24:372   \
  RRA:AVERAGE:0.5:288:365  \
  RRA:MAX:0.5:1:288        \
  RRA:MAX:0.5:6:336        \
  RRA:MAX:0.5:24:372       \
  RRA:MAX:0.5:288:365      \

Selle tulemusel tekib anmebaasifail nimega liiklus.rrd. Nüüd natuke lähemalt, mida me siin tegime.

DS:in:COUNTER:600:U:U ja DS:out:COUNTER:600:U:U

Sedasi tekitatakse baasi andmejada nimega 'in' ja 'out', mis on COUNTER tüüpi, andmepunkt iga 600 sekundi tagant, mille minimaalne ja maksimaale väärtus on teadmata (U). Kui on teada minimaalne või maksimaalne väärtus, võib selle loomulikult ka baasi loomisel paika panna. Selle näite puhul jätame selle aga kujule Unknown (U).

RRA:AVERAGE:0.5:1:288

288 andmeühikut!
1 (iga uuendus) * 300 sekundit (uuenduse samm) * 288 (andmepunkti) = 86400 sekundit
86400 sekundit / 60 => 1440 minutit
1440 minutit / 60 => 24 tundi
24 tundi / 24 => 1 ööpäev

RRA:AVERAGE:0.5:6:336

336 andmeühikut!
6 (uuenduste keskmine) * 300 sekundit (uuenduse samm) * 336 (andmepunkti) = 604800 sekundit
604800 sekundit / 60 => 10080 minutit
10080 minutit / 60 => 168 tundi
168 tundi / 24 => 7 ööpäeva

RRA:AVERAGE:0.5:24:372

336 andmeühikut!
24 (uuenduste keskmine) * 300 sekundit (uuenduse samm) * 372 (andmepunkti) = 2678400 sekundit
2678400 sekundit / 60 => 44640 minutit
44640 minutit / 60 => 744 tundi
744 tundi / 24 => 31 ööpäeva

RRA:AVERAGE:0.5:288:365

365 andmeühikut!
288 (uuenduste keskmine) * 300 sekundit (uuenduse samm) * 365 (andmepunkti) = 31536000 sekundit
31536000 sekundit / 60 => 525600 minutit
525600 minutit / 60 => 8760 tundi
8760 tundi / 24 => 365 ööpäeva

Sarnaselt eelnevale (AVERAGE e. keskmine) on defineeritud ka maksimaalsete väärtuste hoidmine samas ajaskaalas (MAX).

Andmete uuendamine

Andmete uuendamiseks on otstarbekas luua skript, mis küsib operatsioonisüsteemi (või mingi teenuse, nagu näiteks SNMP) käest andmeid ning salvestab need andmebaasi.

Kohandame skriptis failirajad ning võrgukaardi numbri vastavalt serveri konfiguratsioonile parajaks.

#!/bin/sh
 
# sisenevad bitid
sin=`/usr/local/bin/snmpget -v 1 -c <parool> -Oqv localhost IF-MIB::ifInOctets.3`

# väljjuvad bitid
sout=`/usr/local/bin/snmpget -v 1 -c <parool> -Oqv localhost IF-MIB::ifOutOctets.3`
 
# väljastame kontrolliks siseneva ja väljuva liikluse numbrid
echo Snmp in : $sin
echo Snmp out: $sout
 
# uuendame infoga liiklus.rrd faili. viitame rrdupdate käsule läbi täispika kaustapuu!
/usr/local/bin/rrdupdate /home/kasutaja/rrdtool/liiklus.rrd N:$sin:$sout

Pööra tähelepanu ridadele sin ja sout!

 sin=`/usr/local/bin/snmpget -v 1 -c <parool> -Oqv localhost IF-MIB::ifInOctets.3`
 sout=`/usr/local/bin/snmpget -v 1 -c <parool> -Oqv localhost IF-MIB::ifOutOctets.3`

Number kolm (ifInOctets.3) tähistab antud arvuti konfiguratsioonis võrgukaardi numbrit. Oma serveri parameetrite leidmiseks sisesta käsk:

 snmpwalk -v 1 -c <parool> localhost | grep ifDescr

Antud serveri konfiguratsioonile vastavalt oli tulemuseks järgmine:

IF-MIB::ifDescr.1 = STRING: fxp0
IF-MIB::ifDescr.2 = STRING: fxp1

Antud juhul on ifDescr.1 väline (fxp0) ja ifDescr.2 sisemine (fxp1) võrgukaart.

Kõikide võimalike andmete nimetuste ja väärtuste kuvamiseks:

 snmpwalk -v 1 -c <parool> localhost | more

Graafikute loomine

Nüüd paigaldame skripti g.sh, mis loob info järgi rrdtool’i andmefailis graafiku

#!/bin/sh
/usr/local/bin/rrdtool graph /home/kasutaja/public_html/g-p2ev.png -a PNG -A -w 800 -h 300 -s -24h -v "Liiklus" \
   'DEF:in=/home/kasutaja/rrdtool/liiklus.rrd:in:AVERAGE' \
   'DEF:out=/home/kasutaja/rrdtool/liiklus.rrd:out:AVERAGE' \
   'CDEF:kbin=in,1024,/' \
   'CDEF:kbout=out,1024,/' \
   'CDEF:outg=out,-1,/' \
   'CDEF:background=in,POP,LTIME,7200,%,3600,LE,INF,UNKN,IF' \
   'CDEF:backgroundN=background,-1,*' \
   'AREA:background#F3F3F3' \
   'AREA:backgroundN#F3F3F3' \
   'HRULE:262144#FF0000' \
   'HRULE:131072#FF0000' \
   'HRULE:32768#FF0000' \
   'HRULE:-32768#FF0000' \
   'HRULE:-131072#FF0000' \
   'HRULE:-262144#FF0000' \
   'AREA:in#91ACF1' \
   'AREA:outg#FF9090' \
   'LINE1:in#767676' \
   'LINE1:outg#767676' \
   'GPRINT:kbin:LAST:Viimati sisse \:   %3.2lf KB' \
   'GPRINT:kbout:LAST:Viimati välja \:   %3.2lf KB\j' \
   'GPRINT:kbin:AVERAGE:Keskmiselt sisse\: %3.2lf KB' \
   'GPRINT:kbout:AVERAGE:Keskmiselt välja\: %3.2lf KB\j'


/usr/local/bin/rrdtool graph /home/kasutaja/public_html/g-n2dal.png -a PNG -A -w 800 -h 300 -s -168h -v "Liiklus" \
   'DEF:in=/home/kasutaja/liiklus.rrd:in:AVERAGE' \
   'DEF:out=/home/kasutaja/liiklus.rrd:out:AVERAGE' \
   'CDEF:kbin=in,1024,/' \
   'CDEF:kbout=out,1024,/' \
   'CDEF:outg=out,-1,/' \
   'CDEF:background=in,POP,LTIME,172800,%,86400,LE,INF,UNKN,IF' \
   'CDEF:backgroundN=background,-1,*' \
   'AREA:background#F3F3F3' \
   'AREA:backgroundN#F3F3F3' \
   'HRULE:262144#FF0000' \
   'HRULE:131072#FF0000' \
   'HRULE:32768#FF0000' \
   'HRULE:-32768#FF0000' \
   'HRULE:-131072#FF0000' \
   'HRULE:-262144#FF0000' \
   'AREA:in#91ACF1' \
   'AREA:outg#FF9090' \
   'LINE1:in#767676' \
   'LINE1:outg#767676' \
   'GPRINT:kbin:LAST:Viimati sisse \:   %3.2lf KB' \
   'GPRINT:kbout:LAST:Viimati välja \:   %3.2lf KB\j' \
   'GPRINT:kbin:AVERAGE:Keskmiselt sisse\: %3.2lf KB' \
   'GPRINT:kbout:AVERAGE:Keskmiselt välja\:%3.2lf KB\j'

/usr/local/bin/rrdtool graph /home/kasutaja/public_html/g-kuu.png -a PNG -A -w 800 -h 300 -s -672h -v "Liiklus" \
   'DEF:in=/home/kasutjaa/liiklus.rrd:in:AVERAGE' \
   'DEF:out=/home/kasutaja/liiklus.rrd:out:AVERAGE' \
   'CDEF:kbin=in,1024,/' \
   'CDEF:kbout=out,1024,/' \
   'CDEF:outg=out,-1,/' \
   'CDEF:background=in,POP,LTIME,1209600,%,604800,LE,INF,UNKN,IF' \
   'CDEF:backgroundN=background,-1,*' \
   'AREA:background#F3F3F3' \
   'AREA:backgroundN#F3F3F3' \
   'HRULE:262144#FF0000' \
   'HRULE:131072#FF0000' \
   'HRULE:32768#FF0000' \
   'HRULE:-32768#FF0000' \
   'HRULE:-131072#FF0000' \
   'HRULE:-262144#FF0000' \
   'AREA:in#91ACF1' \
   'AREA:outg#FF9090' \
   'LINE1:in#767676' \
   'LINE1:outg#767676' \
   'GPRINT:kbin:LAST:Viimati sisse \:   %3.2lf KB' \
   'GPRINT:kbout:LAST:Viimati välja \:   %3.2lf KB\j' \
   'GPRINT:kbin:AVERAGE:Keskmiselt sisse\: %3.2lf KB' \
   'GPRINT:kbout:AVERAGE:Keskmiselt välja\:%3.2lf KB\j'

/usr/local/bin/rrdtool graph /home/kasutaja/public_html/g-aasta.png -a PNG -A -w 800 -h 300 -s -8064h -v "Liiklus" \
   'DEF:in=/home/kasutaja/liiklus.rrd:in:AVERAGE' \
   'DEF:out=/home/kasutaja/liiklus.rrd:out:AVERAGE' \
   'CDEF:kbin=in,1024,/' \
   'CDEF:kbout=out,1024,/' \
   'CDEF:outg=out,-1,/' \
   'HRULE:262144#FF0000' \
   'HRULE:131072#FF0000' \
   'HRULE:32768#FF0000' \
   'HRULE:-32768#FF0000' \
   'HRULE:-131072#FF0000' \
   'HRULE:-262144#FF0000' \
   'AREA:in#91ACF1' \
   'AREA:outg#FF9090' \
   'LINE1:in#767676' \
   'LINE1:outg#767676' \
   'GPRINT:kbin:LAST:Viimati sisse \:   %3.2lf KB' \
   'GPRINT:kbout:LAST:Viimati välja \:   %3.2lf KB\j' \
   'GPRINT:kbin:AVERAGE:Keskmiselt sisse\: %3.2lf KB' \
   'GPRINT:kbout:AVERAGE:Keskmiselt välja\:%3.2lf KB\j'

Muudame vastavalt leiduvad rajad failis õigeks. Rajad, mida vaja muuta on

/usr/local/bin/rrdtool graph /home/kasutaja/public_html/g-p2ev.png -a PNG -A -w 800 -h 300 -s -24h -v "Liiklus" \
   'DEF:in=/home/kasutaja/rrdtool/liiklus.rrd:in:AVERAGE' \
   'DEF:out=/home/kasutaja/rrdtool/liiklus.rrd:out:AVERAGE' \

Esimene on graafikupildi asukoht ja kaks teist on liiklus.rrd ehk rrdtooli andmebaasifaili asukoht.

CRON

Lisame cron’i graafikuloomis skriptide käivitamise, avame /etc/crontab, lisame read

*/1     *       *       *       *       root    /usr/home/kasutaja/liiklus.sh > /dev/null
*/5     *       *       *       *       root    /usr/home/kasutaja/g.sh > /dev/null

Nagu näha, küsime snmp’ga infot ja lisame rrdtool’i andmebaasi seda iga minut, aga graafikud joonistame iga 5 minuti järel. Praegu on see halb, et korraga loome iga kord päeva, kuu, nädala ja aasta graafiku. Võib näiteks g.sh lüüa lahti kolmeks skriptiks, mida omakorda gron käivitab vastavalt kord päev, kord nädalas, kord aastas ;)

Tulemuseks saame neli pilti. Toome esile siin päevagraafiku.

G-p2ev.png

Loome mingi html faili, mis näitab tekitatud pilte

Kogu edasine info netis http://people.ee.ethz.ch/~oetiker/webtools/rrdtool/

Andkefailide konvert enne teisele arhidektuurile tõstmist

rrdtool puhul pole võimalik kasutada samu rrd faile nii 32 kui 64bitistel masinatel ja vahepeal tuleb need ümber konvertida ja taastada. Arendajate poolt arutatakse ka uue formaadi loomist mille puhul sarnaseid konvertimisi enam ei peaks tegema kuid hetkel seda ametlikus releasis veel pole.

Esimeses masinas konverdime kõik failid xml formaati järgneva skriptiga

#!/bin/sh
for g in $( ls /usr/local/var/rrdfailid ) ; do
 name=`echo $g | awk '{sub(/rrd/,"xml");print}'`
  echo $g
  echo $name
   rrdtool dump /usr/local/var/rrdfailid/$g /usr/local/var/rrdfailid/$name
done

Kopeerime failid üle teise arvutisse kus Kustutame esimesena eksisteerivad rrdfailid ja seejäärel loome neist uued rrdfailid.

#!/bin/sh
for g in $( ls /usr/local/var/rrdfailid ) ; do
 name=`echo $g | awk '{sub(/xml/,"rrd");print}'`
  echo $g
  echo $name
   rrdtool restore /usr/local/var/rrdfailid/$g /usr/local/var/munin/rrdfailid/$name
done

Ja seejärel võime eemaldada kopeeritud failid


Lingid

http://oss.oetiker.ch/rrdtool/

http://en.wikipedia.org/wiki/RRDtool

http://eccentric.cx/misc/rrdcalc.html