RRDtool visokių statistikų kaupimui

Posted: 2016-12-17 in Darbeliai
Žymos:, ,

rrdtool 3d logo | Darau, blėNetyčia pakalbėjom su Mindaugu apie visokius sensorius ir jų duomenų kaupimą bei vaizdavimą grafikais. Na, analizus visokius daryt iš sukauptų duomenų ir panašiai. Kadangi mane profesija ir jos nuokrypis įpareigoja, tai turiu tam tikrą nusistatymą šiuo atžvilgiu.

Kažkada visiškai šiaip sau buvau sugalvojęs šiokį tokį orų stotelės projektą su savo dar pirmąja Aviete. Buvau sulipdęs šiokį tokį freimvorkėlį įvairių jutiklių duomenų kaupimui SQLite duombazėj. Paskui braižiau tuos sukauptus duomenis Flask serverėlyje užkurta programulke ir naudojau amCharts — tikrai geras daiktc. Buvo toks užsidegimas užėjęs.

Grįžtant prie duomenų kaupimo tai kažkaip dabar galvoju, kodėl taip norėjau knistis. Nes šiaip prasmės daug nėr. Tiesiog kitą kartą pagauna kažkoks įkvėpimas sulipdyti kažką. Aišku, amCharts grafikėliai naršyklėje atrodo tikrai patraukliai ir smagiai, bet dažnai to tiesiog nereikia.

Tai va dabar ir pakalbėsim apie tokį seną, bet vis dar naudingą RRDtool. Tik iš karto perspėju: aš čia RRDtool vartotojo vadovų neversiu, tik pabandysiu trumpai supažindinti, paaiškinti principą, o toliau, jei dar neteko naudotis, galėsite griūti stačia galva patys.

RRD šiame pavadinime reiškia „round robin database“. Toks kompiuterastinis terminas tas „round robin“. Šiuo atveju reiškia maždaug taip: iš anksto sugalvojam, kiek duomenų kaupsim. Tiksliau, kiek laiko: dieną, savaitę, metus ar dešimtmetį. Negalim „neribotai“. Turim sugalvoti iš anksto. Tai „round robin“ tą ir reiškia: jei susikuriam kaupimą dienai, t.y. parai, tai tik paskutinės paros duomenis ir turėsime. Nauji duomenys perrašomi ant senų, kai pirma para sukaupiama. Taip ratuku ir sukasi. Tai va tą „round robin“ ir reiškia. Ribotas atminties kiekis naudojamas tam tikro istorinio laikotarpio duomenų saugojimui.

Didelis privalumas yra duomenų bazės dydis: jis nekinta. Iš anksto susiplanuojam, sukuriam ir viskas. Diskas neužsikiš. Aišku, trūkumas tas, kad reikia apgalvoti, kokio senumo duomenis reikės kaupti ir ar nesigailėsite pamažinę.

Taigi RRDtool savo duomenų bazėje kaupia įrašus tam tikram laikotarpiui. Dar vienas ir labai svarbus suvokti parametras — duomenų kaupimo dažnumas. Na, kas kiek laiko naujas įrašas įkapsės. Šitą irgi būtina susiplanuoti. Standartinis RRDtool intervalas yra 300 sekundžių, t.y. penkios minutės. Na, šitas daiktas buvo suprojektuotas maršrutizatorių ir komutatorių informacijai kaupti ir analizuoti traukiant duomenis per SNMP. Dažniausiai ten penkių minučių užtenka. Ar užtekdavo.

Tai va. Pirmi du dalykai, apie kuriuos reikia galvoti prieš sukuriant RRDtool duombazę: istorinis laikotarpis duomenukams ir jų kapsėjimo dažnis.

Dabar lendam biškį giliau. Reikia suprasti, kad RRDtool duombazė — tai ne įprasta duombazė su įrašais. Principas panašus tik tuo, kad ji sudaryta iš įrašų, bet tų įrašų tipas yra tik skaičiukai, be to, jiems iš karto taikomos agregavimo funckijos: skirtumai, min/max, vidurkis. Sakykim, kad jeigu į duombazę reikia įrašinėti įrašus kas penkias minutes, bet tas įrašymas biškį vėluoja, arba biškį pasiskubina, tai RRDtool reikšmes interpoliuoja. Šioje duombazėje negalite tikėtis išsaugoti tobulai tikslių reikšmių, kurias įrašėte. Ir tai nėra blogai, nes tikslas yra ne tas!

Toliau. Įrašomi skaičiukai gali būti keleto tipų. Bet ne skaitinių tipų, o prasminių. Šiaip visi skaičiukai šioje duombazėje yra slankaus kablelio ir ten daugiau nėr ką žinot apie tai. O prasminiai tipai yra tokie:

  • COUNTER: skaitliukas, didėjanti reikšmė. Panašu į kilometrų skaitliuką mašinoj arba į išsiųstų/priimtų baitų skaitliukus tinklo adapteryje. RRDtool ima prieš tai buvusią reikšmę, ją atima iš einamosios (paskaičiuoja skirtumą) ir padalina iš laiko intervalo. Taip iš kilometrų padaromas greitis arba tinklo sparta iš baitų skaitliukų.
  • GAUGE: matuoklis, einamoji reikšmė. Panašu į spidometrą mašinoje, termometro parodymus ar kitą einamąją reikšmę. Reikšmės įrašomos tokios, kokios yra, tik interpoliuojamos, jei ne visai pataikoma į intervalą.
  • DERIVE: išvestinė, skaitliukas, kuris gali ir mažėti. Durnas toks tipas, sunku net normalų pavyzdį sugalvot. Man į galvą ateina saulės batareika, kur skaitliukas pradeda suktis į priešingą pusę, kai pagamini daugiau energijos, nei gali suvartoti. Arba vandens pompa, kuri nespėja vandens išsiurbti ir pradeda jis kilti 😀
  • ABSOLUTE: vėlgi skaitliukas, bet laikoma, kad jis nusimuša kaskart nuskaičius. Būna kartais tokių įrenginių, jie didina reikšmę tol, kol jos nenuskaitai, tada pradeda skaičiuot iš naujo. Taigi panašu į COUNTER, tik kad nereikia skirtumų skaičiuoti, laikoma, kad kiekviena reikšmė yra skirtumas nuo nulio, tereikia ją padalinti iš laiko intervalo.

Aš jums pateiksiu pavyzdį su temperatūra, kur kišim GAUGE tipo skaičiukus. Bet iki to dar prieisim. Dabar dar reikia aptarti duomenų kaupimą.

Kuriant RRDtool duombazę galima iš karto sukurti joje keletą archyvų. Tie „archyvai“ yra istorinio laikotarpio kaupyklos. Visa RRDtool duombazė fiziškai guli viename faile, bet jame galima sukurti keletą archyvų. Įdomus dalykas su tais archyvais yra tas, kad juos galima suplanuoti skirtingų detalumų. Paaiškinsiu.

Pavyzdukas

Taigi aš užkūriau savo vyno šildyklę ir nusprendžiau termometrų parodymus bei lempelės degiojimą kaupti RRD duombazėj. Radijo bangomis duomenukai atskrenda kas pusę minutės. Ganėtinai detalus intervalas, realiai tokio net ir nereikėtų. Bet tingėjau perprogramuot, kai jau viskas veikė 🙂 Taigi reikia bent vieną archyvą sukurti pagal šitą modelį, kaspusęminutinį. Na, arba būtų galima įrašinėti tik kas kažkelintą duomenų pirstelėjimą, sakykim, kas dešimtą ir įrašinėti kas penkias minutes. Na, bet ok, dėl įdomumo įrašinėsiu kas pusę minutės, nes tada detaliai būna aišku ir kada lempelė degiojasi, kitaip galėčiau pražiopsot.

Pagalvojau, kad detalius duomenis galėčiau kaupti savaitę. Tiek man tikrai užteks, jei norėsiu pasižiūrėt dieną-kitą į praeitį. Kapsint duomenims kas pusę minutės savaitei reikės 20160 įrašų (86400÷30×7=20160). Jei neaišku, tai paroj yra 86400 sekundžių.

Bet tai nereiškia, kad nenorėčiau duomenų pasižiūrėt ir po mėnesio. Na, mėnesiui man užteks tikslumo kas penkias minutes. Taigi sukursiu dar vieną archyvą, kuris automatiškai vidurkins dešimt atėjusių įrašų. Kodėl dešimt? Todėl, kad pagrindiniai įrašai ateina kas 30 sekundžių, o 300 sekundžių yra 5 minutės, taigi dešimt įrašų suvidurkinus gaunasi vienas penkiaminutinis. Penkiaminutinius įrašus kaupsiu 30 dienų. Taigis 86400÷300×30 gausis 8640 įrašų.

Metai. Dėl visa ko. Užteks vidurkinti pusvalandžio duomenis, taigi vidurkinsiu 60 įrašų (na, 30×60=1800 sekundžių, pusė valandos). Paroj yra 48 pusvalandžiai, taigi 48×365 — reikės 17520 įrašų.

Taigi man reikės RRDtool duombazės su trimis skirtingo detalumo archyvais GAUGE tipo duomenims. Kaupsiu tris reikšmes: balkono termometro, spintelės termometro ir relės junginėjimo reikšmes. Tokius reikalavimus atitinkančią duombazikę sukuria va toks skriptukas:

rrdtool create vyno-temperatura.rrd \
	--start now --step 30 \
	DS:V:GAUGE:120:-50:50 \
	DS:L:GAUGE:120:-50:50 \
	DS:H:GAUGE:120:0:1 \
	RRA:AVERAGE:0.5:1:20160 \
	RRA:AVERAGE:0.5:10:8640 \
	RRA:AVERAGE:0.5:60:17520

Paaiškinimai. „DS“ yra „data source“, t.y. duomenų šaltinis lietuviškai. V, L ir H — mano pavadinimai laukeliams. GAUGE jau aiškinau. Toliau, 120 yra sekundžių kiekis, po kurio laikoma, kad duomenys jau „nuplaukė“ ir duombazė tame intervale užpildoma nuliukais. -50 ir 50 — mažiausia ir didžiausia numatoma duomenų šaltinio reikšmė. Tikėtina, kad temperatūra į šias ribas sutilps. O šildyklės atveju tai 0 „įjungta“ ir 1 „išjungta“. Atitinkamas ir intervalas. Tiesa, RRDtool dėl nevisiško pusės minutės pirsčiojimo tikslumo šias reikšmes vidurkins ir interpoliuos, bet rezultate suma vis tiek bus apie vienetą.

Toliau — mano minėtieji trys archyvai, vidurkio (AVERAGE) tipo. 0.5 yra kažkoks ten magiškas skaičius, apie kurį kiek bandžiau suprast, tai supratau tiek, kad geriau tokį ir palikt. Paskui kitas skaičius — kiek „pirsčiojimų“ vidurkint. Na, tai savaitę kaupsim po vieną individualų pirstelėjimą, paskui po dešimt vidurkinsim mėnesį (5 min. intervalas) ir pusvalandinius gabalus, t.y. po 60 pusminučių, kaupsim metus. Sukurtas failas yra maždaug megabaito dydžio ir nesikeis. Jėga.

Dabar šitą daiktą reikia pildyti. Visos aš programulkės jums nepateiksiu, bet pas mane sukasi Python skriptukas, kuris eteriu atskriejusias reikšmes nuskaito per nuoseklųjį įvadą ir jas įrašinėja į RRD duombazę:

RRD_FILE = "vyno-temperatura.rrd"
from rrdtool import update as rrd_update
...
while True:
    ...
    rrd_update(RRD_FILE, "N:%f:%f:%d" % (t1, t2, h))

...

Maždaug taip. Be abejo, reikėjo susiinstaliuoti RRD palaikymą Pitonui.

O dabar — smagioji dalis. Ta pati rrdtool komanda moka iš duomenų braižyti grafikus. Pavyzdžiui, štai vienas paros grafikas:

Vyno šildyklės vienos dienos grafikas | Darau, blė

Oranžinė spalva — vidinė spintelės temperatūra, kuri palaikoma ties 3 laipsniais. Žydra — balkono temperatūra, kur ta spintelė stovi. Per vidurį mėlynas spyglynas — relės junginėjimosi grafikas. Kaip minėjau, reikšmės truputį interpoliuojamos, tai matosi, kad relė būna įjungta gerokai mažiau, nei trečdalį laiko. T.y. dauguma linijų yra ties 0,5 žyme ir dar iškarpytos. Man šito pakanka.

Savaitės grafikėlis:

Vyno šildyklės temperatūrų grafikas savaitei | Darau, blė

Kad man būtų paprasčiau braižytis šitą grafiką, o paros grafiką kas valandą galėtų crontabas perpaišyti, pasirašiau skriptuką:

#!/bin/bash
START=$1
END=$2
WIDTH=$3
HEIGHT=$4
NAME=$5
rrdtool graph $NAME \
	--start -$START --end -$END \
	--full-size-mode --width=$WIDTH --height=$HEIGHT \
	DEF:Vidaus=vyno-temperatura.rrd:V:AVERAGE \
	DEF:Lauko=vyno-temperatura.rrd:L:AVERAGE \
	DEF:Heat=vyno-temperatura.rrd:H:AVERAGE \
	LINE2:Vidaus#FF7F00 \
	LINE2:Lauko#AAAAFF \
	AREA:Heat#2F107F

Crontabe guli eilutė:

0 * * * * cd /media/HARDS/VYNAS && ./graf.sh 1d 30 2400 1200 diena.png >> /dev/null 2>&1

Čia dar truputuką paaiškinsiu, kas ten per argumentai. 1d — imti iš praeities vienos dienos duomenis. Skripte pridedamas minusiukas, tipo „minus viena diena“. Tas pats ir su grafiko pabaiga. Kadangi duomenukai ateina kas pusę minutės, atimu 30 sekundžių, kad nebūtų paskutinio tuščio įrašo. Na, toliau plotis, aukštis, failo pavadinimas. Kaip matote, kiekvienai linijai nurodomas failo pavadinimas DEF operatoriuje. Tai reiškia, kad grafikus galima braižyti ir jungti iš keleto duombazių — labai patogu.

Grafikus galima visaip papildyti užrašais, legendomis ir dar visokiu velniu. Bet čia jau jums atrasti, rrdtool dokumentacija tikrai gera.

Ką galiu jums iš savo patirties papasakot… Šitos „duombazės“ yra labai paprastos: laiko žymė ir vienas ar daugiau skaičiukų. Viskas. Na, užduodami tiems atseit „stulpeliams“ pavadinimai, bet tai viskas.

Jei kursite, sakykim, visokių jutiklių tinklą ir norėsite tuos duomenis kaupti, tai aš labai griežtai rekomenduoju kiekvienam įrenginiui kurti atskirą RRD failą. Visų pirma, jei sukūrėte RRD failą, po to jį modifikuoti yra ganėtinai bjauru. Yra komanda rrdtune, galima ir datasource’us pridėt, ir šalint, ir archyvus keisti. Bet nuoširdžiai sakau, kur kas paprasčiau kiekvienam įrenginiui sukurti po atskirą failiuką. Grafikams ir kitiems analizams daryti po to galima viską apjungiant. Vėlgi, jei, pavyzdžiui, turite mikrovaldiklį, prie kurio galite papildomai pridėti termometrų ar kitų jutiklių, tada geriau kurkite po atskirą failą kiekvienam iš jutiklių. Mano vyno spintelės projektas yra kaip ir vienas ir baigtinis, tai viskas eina į vieną failą.

Be abejo, ką aš pasakiau, nėra aksioma. Lengvai galite imti ir naudoti rrdtune ir tiesiog pagal jutiklius ar įrenginius praplėtinėt failus. Bet turėkite omeny, kad kiekvienam „stulpeliui“ reikės duoti skirtingą pavadinimą, keisti visus rrdupdate skriptukus ir pan. Mano galva, vieno tipo jutiklių ar kitų skaitliukų plėtimui kiekio prasme paprastesnis variantas yra atskirais failais. Galbūt tie jutiklių kiekiai taip paprastai ir nesikeičia, bet visada geriau pokyčiams pasiruošti ir juos apgalvoti iš anksto.

Tai va, sėkmės eksperimentuose ir analizuose, blė!

Nuorodėlės:

Komentarai
  1. Vytenis parašė:

    O turi kokį nors monitoringą? turiu galvoje, jei temperatūra nukris iki -100 arba pakils iki 100*C. Ar viskas apsiriboja grafikais, kai pažiūri tai ir žinai?

Parašykite komentarą

Įveskite savo duomenis žemiau arba prisijunkite per socialinį tinklą:

WordPress.com Logo

Jūs komentuojate naudodamiesi savo WordPress.com paskyra. Atsijungti /  Pakeisti )

Google photo

Jūs komentuojate naudodamiesi savo Google paskyra. Atsijungti /  Pakeisti )

Twitter picture

Jūs komentuojate naudodamiesi savo Twitter paskyra. Atsijungti /  Pakeisti )

Facebook photo

Jūs komentuojate naudodamiesi savo Facebook paskyra. Atsijungti /  Pakeisti )

Connecting to %s

Brukalų kiekiui sumažinti šis tinklalapis naudoja Akismet. Sužinokite, kaip apdorojami Jūsų komentarų duomenys.