Ako koristite bazu podataka vremenskih serija (timeseries db,
odricanjeNapomena: Prikazani problemi su za InfluxDB 1.7.4.
Zašto vremenske serije?
Projekt je praćenje transakcija u različitim blockchainima i prikaz statistike. Konkretno, posmatramo emisiju i sagorevanje stabilnih kovanica (
Kada smo analizirali transakcije, pojavila se ideja: koristiti bazu podataka vremenskih serija InfluxDB kao glavno skladište. Transakcije su tačke u vremenu i dobro se uklapaju u model vremenske serije.
Funkcije agregacije su također izgledale vrlo zgodno - idealne su za obradu grafikona sa dugim periodom. Korisniku je potreban grafikon za godinu dana, a baza podataka sadrži skup podataka sa vremenskim okvirom od pet minuta. Besmisleno mu je slati svih sto hiljada poena - osim duge obrade, neće stati na ekran. Možete napisati vlastitu implementaciju povećanja vremenskog okvira ili koristiti funkcije agregacije ugrađene u Influx. Uz njihovu pomoć možete grupirati podatke po danima i poslati željenih 365 bodova.
Bilo je malo neugodno što se takve baze podataka obično koriste za prikupljanje metrike. Nadgledanje servera, iot uređaja, svega iz čega “teku” milioni tačaka oblika: [<vrijeme> - <metrička vrijednost>]. Ali ako baza podataka dobro radi s velikim protokom podataka, zašto bi onda mali volumen stvarao probleme? Sa ovom mišlju, uzeli su InfluxDB na posao.
Šta je još zgodno u InfluxDB-u
Pored spomenutih funkcija agregacije, postoji još jedna sjajna stvar - kontinuirani upiti (
Takođe je politike zadržavanja (
- kreirajte kontinuirani upit za agregiranje podataka u drugu tabelu;
- za prvu tabelu, definirajte politiku za brisanje metrike starije od te iste sedmice.
A Influx će smanjiti veličinu podataka i sam obrisati nepotrebne podatke.
O pohranjenim podacima
Nema mnogo podataka pohranjenih: oko 70 hiljada transakcija i još milion tačaka sa tržišnim informacijama. Dodavanje novih unosa - ne više od 3000 bodova dnevno. Postoje i metrike za stranicu, ali tamo ima malo podataka i, prema politici zadržavanja, čuvaju se ne duže od mjesec dana.
Problemi
Tokom razvoja i naknadnog testiranja servisa, sve više kritičnih problema nastajalo je u radu InfluxDB-a.
1. Brisanje podataka
Postoji niz podataka sa transakcijama:
SELECT time, amount, block, symbol FROM transactions WHERE symbol='USDT'
Rezultat:
Šaljem naredbu za brisanje podataka:
DELETE FROM transactions WHERE symbol=’USDT’
Dalje tražim dobijanje već izbrisanih podataka. A Influx, umjesto praznog odgovora, vraća dio podataka koji treba ukloniti.
Pokušavam obrisati cijelu tabelu:
DROP MEASUREMENT transactions
Provjeravam brisanje tabele:
SHOW MEASUREMENTS
Ne vidim tabelu na listi, ali novi upit podataka i dalje vraća isti skup transakcija.
Kod mene se problem pojavio samo jednom, pošto je slučaj brisanja izolovan slučaj. Ali ovakvo ponašanje baze podataka očito se ne uklapa u okvir "ispravnog" rada. Kasnije je github pronađen otvoren
Kao rezultat toga, pomoglo je uklanjanje i naknadno obnavljanje cijele baze podataka.
2. Brojevi s pomičnim zarezom
Matematički proračuni koji koriste InfluxDB ugrađene funkcije daju greške preciznosti. Nije da je bilo nešto neobično, ali neprijatno.
U mom slučaju, podaci imaju finansijsku komponentu i želio bih da ih obradim sa velikom preciznošću. Zbog toga planiramo odustati od kontinuiranih upita.
3. Kontinuirani upiti se ne mogu prilagoditi različitim vremenskim zonama
Servis ima tabelu sa dnevnom statistikom transakcija. Za svaki dan morate grupisati sve transakcije za taj dan. Ali dan za svakog korisnika počinje u različito vrijeme, stoga je skup transakcija drugačiji. UTC je
U InfluxDB, kada grupišete po vremenu, možete dodatno odrediti pomak, na primjer, za moskovsko vrijeme (UTC + 3):
SELECT MEAN("supply") FROM transactions GROUP BY symbol, time(1d, 3h) fill(previous)
Ali rezultat upita će biti netačan. Iz nekog razloga, podaci grupirani po danima počet će već 1677. (InfluxDB službeno podržava vremenski raspon od ove godine):
Da bi se zaobišao ovaj problem, usluga je privremeno prebačena na UTC + 0.
4. Performanse
Na Internetu postoji mnogo mjerila s poređenjem InfluxDB-a i drugih baza podataka. Na prvi pogled su izgledali kao marketinški materijali, ali sada mislim da u njima ima istine.
Dozvolite mi da vam ispričam svoj slučaj.
Usluga pruža API metodu koja vraća statistiku za posljednja XNUMX sata. Tokom izračunavanja, metoda tri puta ispituje bazu podataka sa sljedećim upitima:
SELECT * FROM coins_info WHERE time <= NOW() GROUP BY symbol ORDER BY time DESC LIMIT 1
SELECT * FROM dominance_info ORDER BY time DESC LIMIT 1
SELECT * FROM transactions WHERE time >= NOW() - 24h ORDER BY time DESC
Objašnjenje:
- U prvom zahtjevu dobivamo najnovije bodove za svaki novčić s tržišnim podacima. Osam tačaka za osam novčića u mom slučaju.
- Drugi zahtjev dobija jedan najnoviji poen.
- Treći traži spisak transakcija za posljednja XNUMX sata, može ih biti nekoliko stotina.
Dozvolite mi da pojasnim da se u InfluxDB indeks automatski gradi po oznakama i vremenu, što ubrzava upite. U prvom zahtjevu simbol je oznaka.
Uradio sam stres test za ovu API metodu. Za 25 RPS-a, server je pokazao puno opterećenje od šest CPU-a:
U isto vrijeme, NodeJs proces uopće nije dao nikakvo opterećenje.
Brzina izvršenja je već smanjena za 7-10 RPS: ako je jedan klijent mogao dobiti odgovor za 200 ms, onda je 10 klijenata moralo čekati sekundu. 25 RPS - granica sa koje je stradala stabilnost, klijentima je vraćeno 500 grešaka.
Sa takvim performansama, nemoguće je koristiti Influx u našem projektu. Štaviše, u projektu gde praćenje treba da se demonstrira mnogim klijentima, mogu se pojaviti slični problemi i metrički server će biti preopterećen.
zaključak
Najvažniji zaključak iz stečenog iskustva je da nepoznatu tehnologiju ne možete uzeti u projekat bez dovoljne analize. Jednostavan pregled otvorenih tiketa na githubu mogao bi pružiti informacije da se InfluxDB ne uzima kao glavno skladište podataka.
InfluxDB je trebao dobro odgovarati zadacima mog projekta, ali kao što je praksa pokazala, ova baza podataka ne zadovoljava potrebe i dosta zabrlja.
Verziju 2.0.0-beta već možete pronaći u repozitorijumu projekta, ostaje da se nadamo da će biti značajnih poboljšanja u drugoj verziji. U međuvremenu ću proučiti TimescaleDB dokumentaciju.
izvor: www.habr.com