05. [20p] Baze de date Round Robin (RRD)

Procesul de monitorizare presupune colectarea continuă de date la intervale regulate de timp. În timp, volumul de date crește foarte mult, iar spațiul ocupat de acestea devine o problemă. Luând în calcul și faptul că granularitatea datelor colectate la un moment dat în timp poate să scadă o dată cu trecerea timpului (ex.: nu ne interesează traficul pe o interfață de acum un an la o granularitate de un minut, ci la o oră este rezonabil) a fost proiectat un nou tip de bază de date: Round Robin Database (RRD).

Dimensiunea acesteia este cunoscuta de la momentul creării, în funcție de numărul de tipuri de date colectate și de granularitatea acestora. După cum îi spune și numele, aceasta stochează datele într-un spațiu finit, iar când acel spațiu alocat este epuizat, datele inițiale se vor suprascrie. Înainte de suprascriere se face o arhivare a datelor suprascrise (de cele mai multe ori se folosește media aritmetică pe intervalul de timp respectiv).

Utilitarul cu ajutorul căruia vom crea și popula bazele de date se numește rrdtool. Acesta permite 3 operații:

  • create (creare bază de date)
  • update (inserare valori bază de date)
  • graph (generează un grafic funcție de timp pe baza valorilor introduse)

Pe stația monitor instalăm utilitarul rrdtool:

root@monitor:~# apt-get install rrdtool

Pentru a crea o bază de date, comanda rrdtool create primește următorii parametri:

  • timpul de început/referință
  • pasul cu care datele vor fi introduse în baza de date (la nivel de secundă)
  • variabilele ce vor reține datele efective
  • tipul de arhivare folosit și momentul la care să se facă arhivarea

Vom crea o bază de date ce are ca timp de început/referință ora curentă a stației monitor. rrdtool are nevoie de această valoare în numărul de secunde trecut de la 1 Ianuarie 1970. Acesta poate fi obținut cu comanda date:

root@monitor:~# date +%s
1394405025

Pasul folosit va fi de 5 secunde (în practică se folosește pasul de 300 de secunde, dar acum dorim să colectăm mai multe date într-un interval scurt de timp pentru a putea genera un grafic relevant):

root@monitor:~#   rrdtool create target.rrd \
         --start 1394405025 \
         --step 5 \
         DS:speedIn:COUNTER:10:U:U \
         DS:speedOut:COUNTER:10:U:U \
         RRA:AVERAGE:0.5:2:60 \
         RRA:AVERAGE:0.5:60:12

După cum se observă am creat 2 variabile de tipul COUNTER care se numesc speedIn și speedOut (pentru alte tipuri de variabile vezi Curs 03 - Monitorizarea rețelei). Valoarea lor maximă este nespecficată (U - undefined). Valoarea 10 reprezintă numărul de secunde cât așteaptă după date noi, iar dacă este depășit se inserează o valoarea specială UNKNOWN pentru a nu afecta mediile calculate. Tipul de arhivare configurat este AVERAGE și o dată la 2 valori, realizează media acestora după care vechile valori vor fi suprascrise. Sunt păstrate 60 astfel de medii, în final aceste 60 medii fiind suprascrise și ele. Timpul acoperit de această arhivare este de 10 minute (5 secunde x 2 x 60).

O altă arhivare configurată este dată media a 60 de valori (deci 300 de secunde), fiind ținute 12 de astfel de medii. Această arhivare acoperă 300 secunde x 12 = 60 minute. Deci baza noastră de date ne poate oferi statistici ale traficului pe o interfață de rețea la diferite nivele de granularitate (în ultimele 10 minute este calculată media la nivel de 10 secunde, iar în ultima oră este calculată media la 1 minut).

Copiați și completați scriptul de mai jos pentru a obține valorile pentru variabilele octetsIn și octetsOut. Acestea reprezintă numărul de octeți (trimiși și primiți) de pe interfața eth0 a stației gateway (Hint: snmpwalk, IF-MIB::ifInOctets urmat de numărul instanței). Scriptul colectează numărul de octeți din 5 în 5 secunde și îl introduce în baza de date target.rrd (rrdtool update target.rrd $(date +%s):inOctets:outOctets):

in-out-octets
#!/bin/bash
 
rm -rf target.rrd
 
# Init timestamp.
timestamp=$(date +%s)
 
# Align timestamp to multiple of 5 seconds.
timestamp=$(($timestamp/5*5))
init_timestamp=$timestamp
 
rrdtool create target.rrd \
         --start $timestamp \
         --step 5 \
         DS:speedIn:COUNTER:10:U:U \
         DS:speedOut:COUNTER:10:U:U \
         RRA:AVERAGE:0.5:2:60 \
         RRA:AVERAGE:0.5:60:12
 
for i in $(seq 1 24); do
   sleep 5
   timestamp=$(($timestamp + 5))
 
   outOctets=$(...)
   inOctets=$(...)
 
   rrdtool update target.rrd  $timestamp:$inOctets:$outOctets
done
 
echo --start $init_timestamp --end $timestamp

Comanda rrdtool update primește timestamp-ul ($data) la care se inserează datele urmat de valorile de introdus pentru fiecare variabilă declarată la creare, în ordinea specificată la acel moment (''speedIn'' și pe urmă ''speedOut'').

Înainte de a executa scriptul porniți descărcarea unei imagini CD pe stația ''gateway'':<code bash>
root@gateway:~# wget http://cdimage.debian.org/debian-cd/7.4.0/amd64/iso-cd/debian-7.4.0-amd64-CD-1.iso
</code>

Pe stația monitor porniți scriptul de colectare de statistici și actualizare a bazei de date RRD. Acesta va rula timp de 2 minute și va avea următorul output indicând timestamp-ul de început și final al bazei de date:<code bash>
root@monitor:~# ./updateRRD
--start 1394411440 --end 1394411560
</code>

Pentru a afișa conținutul bazei de date putem folosi comanda ''rrdtool fetch'' (''start'' și ''end'' le preluați din scriptul de mai sus):<code bash>
root@monitor:~#  rrdtool fetch target.rrd AVERAGE  --start 1394411440 --end 1394411560
                        speedIn            speedOut

1394411445: -nan -nan
1394411450: 2.4706470000e+06 4.8070000000e+04
1394411455: 1.4958000000e+06 2.7601200000e+04
[...]
</code>

În final vom genera un grafic folosind comanda ''rrdtool graph'' (''start'' și ''end'' le preluați din scriptul de mai sus):<code>
root@monitor:~# rrdtool graph speed.png \
      --start 1394411440 --end 1394411560 \
      DEF:myspeedIn=target.rrd:speedIn:AVERAGE \
      DEF:myspeedOut=target.rrd:speedOut:AVERAGE \
      LINE2:myspeedIn#FF0000 \
      LINE3:myspeedOut#00FF00
</code>
Va rezulta fișierul ''speed.png'' în care vom avea trasat cu roșu (''#FF0000'') traficul de download și cu verde traficul de upload (''#00FF00''). Se observă că traficul de download (''speedIn'') este mult mai mare întrucât descărcăm acea imagine de CD. Pentru a vizualiza fișierul copiați-l pe mașina locală folosind comanda ''scp'':<code>
student@mjolnir~$ scp root@192.168.1.4:speed.png . </code>

saisp/labs/03/contents/05.txt · Last modified: 2014/04/05 12:08 by mihai.carabas
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0