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

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