Idő alapú adatbázisok - InfluxDB
Szecsődi Imre
Idő alapú adatbázis
- Olyan adatbázis, ami idő alapú adatokra van optimalizálva
- Az adatok az idővel vannak indexelve
- Lekérdezések általában időintervallumokra vannak megfogalmazva
Adatok
Adatok
Adatok
Relációs adatbázisok?
- Miért nem használunk relációs adatbázist?
- Fogunk egy oszlopot és abba beleírjuk az időt, és már kész is vagyunk
- Több ok is van, nézzük meg ezeket
Skálázhatóság
- Van 2000 VM amit meg akarunk figyelni
- 1000 mérés szerverenként
- minden 10 másodpercben
- = 17,280,000,000 különböző pont naponta
- Ez nagyon sok adat amit egy táblában tárolni kell
Régi adatok kidobása
- Nagyon sok adatot rögzítünk, nagy pontossággal
- Ahogy egyre távolabb kerülünk az adatok létrejöttétől, egyre kevésbé van szükségünk a nagy pontosságú adatokra, ezért azokat összegezzük, és kidobjuk a pontos adatokat
- Ilyen időintervallumok lehetnek 10 perc, 1óra stb...
- Relációs adatbázisnál naiv megoldás, mikor megtelik a figyelt intervallum, akkor minden új pont írásra végzünk egy törlést
- Ez nagyon költséges az adatbázisnak
Gyors lekérdezés
- Szeretnénk egy hét adatát lekérdezni, akkor azt egyszerűen megtehetjük, hiszen az idő szerint van indexelve minden
- Ugyanígy egyszerűen kérdezhetjük le a legfrissebb adatokat egy ablakon belül
InfluxDB felépítés
- Go nyelven íródott
- Két adatbázisból áll össze
- TSDB - tárolja az idővel indexelt adatokat
- Inverted index - tárolja a információt, amit alapján a metadata össze lesz kapcsolva az idő alapú adatokkal, amit le akarunk kérdezni
- Az adatok tömörítve vannak, attól függően hogy milyen a típusuk, pl. String Snappy
InfluxDB tárolás
- A Shardok idő alapon vannak elkészítve, pl. napi szinten
- Az adatok Shardokba vannak szervezve, ezzel egyszerűsítve, a régi adatok kitakarítását
- Az adatokat HTTP kérések segítségével visszük be vagy olvassuk ki
- Beviteli formátum a "Line protocol", ami nem tartalmaz sémát
- Meg kell még adni, mennyi idő után legyenek az adatok törölve az adatbázisból
InfluxDB Line Protocol
weather,location=us-midwest temperature=82 1465839830100400200
| -------------------- -------------- |
| | | |
| | | |
+-----------+--------+-+---------+-+---------+
|measurement|,tag_set| |field_set| |timestamp|
+-----------+--------+-+---------+-+---------+
- Measurement - mért dolog neve, String
- Tags - Kulcs érték párok ahol az érték String
- Fields - kulcs érték párok, a mért értőkről
- Típusok: Int64, Float64, Bool, String
- Timestamp - idő megadva nano másodpercben
InfluxDB Storage Engine
- Time Structured Merge Tree
- Hasonlít a (LSM Tree-hez, amit a HBASE használ)
- Komponensek
- Write-Ahead Log - előbb loggoljuk az adatot, aztán fogjuk csak kiírni az adatbázisba
- In memory index - ide írjuk is felírjuk az érkező adatot
- Index fájlok - periodikusan kiírjuk az indexeket fájlokba, ami a memóriával össze van kövtve
InfluxQL
- InfluxDB lekérdező nyelve
- Kicsit egyszerűbb mint az átlag SQL, de nagy részben hasonló
- https://docs.influxdata.com/influxdb/v1.7/query_language/
Select
> SELECT * FROM "h2o_feet"
name: h2o_feet
--------------
time level description location water_level
2015-08-18T00:00:00Z below 3 feet santa_monica 2.064
2015-08-18T00:00:00Z between 6 and 9 feet coyote_creek 8.12
[...]
2015-09-18T21:36:00Z between 3 and 6 feet santa_monica 5.066
2015-09-18T21:42:00Z between 3 and 6 feet santa_monica 4.938
- Select-ben adjuk meg a mezőket amit le akarunk kérdezni
- From-ban adjuk meg a mérést amiből le akarunk kérdezni
Where
> SELECT "water_level" FROM "h2o_feet" WHERE "location" = 'santa_monica'
name: h2o_feet
--------------
time water_level
2015-08-18T00:00:00Z 2.064
2015-08-18T00:06:00Z 2.116
[...]
2015-09-18T21:36:00Z 5.066
2015-09-18T21:42:00Z 4.938
- Where felírható mezőkre, tag-re valamit timestap-re
Group by - Tag
> SELECT MEAN("water_level") FROM "h2o_feet" GROUP BY "location"
name: h2o_feet
tags: location=coyote_creek
time mean
---- ----
1970-01-01T00:00:00Z 5.359342451341401
name: h2o_feet
tags: location=santa_monica
time mean
---- ----
1970-01-01T00:00:00Z 3.530863470081006
- Group by felírható tag-re, hogy az alapján végezzen csoportsítást
Group by - Time
> SELECT COUNT("water_level")
FROM "h2o_feet"
WHERE time >= '2015-08-18T00:00:00Z' AND time <= '2015-08-18T00:30:00Z'
GROUP BY time(12m),"location"
name: h2o_feet
tags: location=coyote_creek
time count
---- -----
2015-08-18T00:00:00Z 2
2015-08-18T00:12:00Z 2
2015-08-18T00:24:00Z 2
name: h2o_feet
tags: location=santa_monica
time count
---- -----
2015-08-18T00:00:00Z 2
2015-08-18T00:12:00Z 2
2015-08-18T00:24:00Z 2
Insert
INSERT mymeas value=1.0
INSERT mymeas value=1
INSERT mymeas value="stringing along"
INSERT mymeas value=true
- Az Insert kulcsszó után elég csak beírni a mért adatokat a Line Protocol formában
- Tag megadása nem kötelező, de jól jön csoportosításnál
- Idő megadása sem kötelező, ilyenkor a szerver idő lesz használva
Delete / Drop
> DELETE FROM "h2o_feet"
> DELETE FROM "h2o_quality" WHERE "randtag" = '3'
> DELETE WHERE time < '2016-01-01'
> DROP SERIES FROM "h2o_feet"
> DROP SERIES FROM "h2o_feet" WHERE "location" = 'santa_monica'
> DROP SERIES WHERE "location" = 'santa_monica'
- Preferált a Drop használata, de Delete is használható
Grafana
- Grafana egy gyönyörű, könnyen használható és funkciókkal telepakolt dashboard és gráf szerkesztő
- Adatok vizualizálására van használva, InfluxDB-vel párosítva lehetőséget ad valós idejű adatok megjelenítésére
Grafana
Köszönöm a figyelmet!
InfluxDB
By Imre Secodi
InfluxDB
- 342