
Kui kasutada ajaseeria andmebaasi (timeseries db, ) peamise hoidlana statistika veebisaidi jaoks, siis vĂ”ib probleemi lahendamise asemel tekkida palju peavalu. Töötab projekti kallal, kus kasutatakse sellist andmebaasi, ja mĂ”nikord on InfluxDB, millest jutt, esitanud tĂ€iesti ootamatuid ĂŒllatusi.
MĂ€rkus: esitatud probleemid puudutavad InfluxDB versiooni 1.7.4.
Miks ajaseeria?
Projekti eesmĂ€rk on jĂ€lgida tehingute toimumist erinevates plokiahelates ja kuvada statistikat. Konkreetsemalt â vaatame stabiilsete mĂŒntide () emissiooni ja hĂ€vitamist. Nende tehingute pĂ”hjal on vaja koostada graafikud ja esitada kokkuvĂ”tte tabelid.
Tehingute analĂŒĂŒsimisel tuli mĂ”te: kasutada InfluxDB ajaseeria andmebaasi peamise hoidlana. Tehingud on ajapunktid ja ajaseeria mudelisse sobivad nad hĂ€sti.
Samuti olid agregatsiooni funktsioonid vĂ€ga mugavad â need sobivad ideaalselt pika perioodi graafikute töötlemiseks. Kasutajale on vajalik graafik aasta kohta, kuid andmebaasis on andmekogum viie minuti ajavahemikku. Tuhandeid punkte saatmine on mĂ”ttetu â peale pika töötlemise ei mahuks need ka ekraanile. Saab kirjutada oma ajavahemiku suurendamise rakenduse vĂ”i kasutada Influxis sisseehitatud agregatsiooni funktsioone. Nende abil saab andmed rĂŒhmitada pĂ€evade kaupa ja saata vajalikud 365 punkti.
Natuke hĂ€iris see, et tavaliselt kasutatakse selliseid andmebaase mÔÔdikute kogumiseks. Serverite jĂ€lgimine, IoT-seadmed, kĂ”ik, kust tuleb miljoneid punkte vormis: [ â ]. Kuid kui andmebaas töötab hĂ€sti suure andmevoo korral, siis miks peaks vĂ€iksem maht probleeme pĂ”hjustama? Selle mĂ”ttega hakkasime InfluxDB-d kasutama.
Mis muud head on InfluxDB-s
Lisaks mainitud agregatsiooni funktsioonidele on veel ĂŒks suurepĂ€rane asi â jĂ€tkuvad pĂ€ringud (). See on andmebaasis sisseehitatud ajakava, mis saab andmeid töödelda vastavalt ajakavale. NĂ€iteks saab iga 24 tunni tagant rĂŒhmitada kĂ”ik pĂ€evased kirjed, arvutada keskmise ja salvestada ĂŒhe uue punkti teise tabelisse ilma oma rattaga tegelema.
Seal on ka hoidmisreeglid () â andmete kustutamise poliitika seadistamine teatud perioodi pĂ€rast. See on kasulik, kui nĂ€iteks tuleb sĂ€ilitada CPU koormuse andmeid nĂ€dalas, mÔÔtes iga sekundi tagant, samas kui paarikuu jooksul selline tĂ€psus pole vajalik. Sellises olukorras saab teha jĂ€rgmist:
- luua pidev pÀring andmete kogumiseks teise tabelisse;
- esimese tabeli puhul mÀÀrata poliitika meeetrikate kustutamiseks, mis on vanemad kui see nÀdal.
Ja Influx hakkab automaatselt andmete suurust vÀhendama ja ebavajalikku eemaldama.
Salvestatud andmetest
Andmeid on mitte palju: umbes 70 tuhat tehingut ja veel miljon punkti turuinfo kohta. Uute kirjade lisamine â mitte rohkem kui 3000 punkti pĂ€evas. Samuti on olemas saidi mÔÔdikud, kuid seal on andmeid vĂ€he ja retention policy jĂ€rgi sĂ€ilitatakse neid mitte rohkem kui kuu.
Probleemid
Teenuse arendamise ja sellele jĂ€rgnenud testimise kĂ€igus tekkis ĂŒha rohkem kriitilisi probleeme InfluxDB kasutamisel.
1. Andmete kustutamine
On tehingute andmete seeria:
SELECT time, amount, block, symbol FROM transactions WHERE symbol='USDT'Tulemus:

Saadan kÀsu andmete kustutamiseks:
DELETE FROM transactions WHERE symbol=âUSDTâSeejĂ€rel teen pĂ€ringu juba kustutatud andmete saamiseks. Ja Influx tagastab osade andmete asemel, mis peaksid olema kustutatud, osad andmed.
Proovin kustutada tabeli tÀielikult:
DROP MEASUREMENT transactionsKontrollin tabeli kustutamist:
SHOW MEASUREMENTSTabelit nimekirjas ei nÀe, kuid uus andmete pÀring tagastab ikka sama tehingute komplekti.
Probleem tekkis mul ainult ĂŒks kord, kuna kustutamise juhtum on ainus. Kuid selline kĂ€itumine ei sobi ilmselgelt «korrektse» töö raamidesse. Hiljem leidsin GitHubist avatud peaaegu aasta tagasi selle teema kohta.
Tulemuseks aitas andmete kustutamine ja kogu andmebaasi taastamine.
2. Ujuva komaga arvud
Matemaatiliste arvutuste tegemine InfluxDB sisseehitatud funktsioonide abil toob kaasa tÀpsusvead. See ei ole midagi ebatavalist, kuid ebameeldiv.
Minu juhul on andmed rahalise komponendiga ja sooviks neid töödelda kÔrge tÀpsusega. SeetÔttu plaanin loobuda pidevatest pÀringutest.
3. Pidevaid pÀringuid ei saa kohandada erinevatesse ajavöönditesse
Teenuses on tabel pĂ€evase statistika kohta tehingute kohta. Iga pĂ€ev tuleb rĂŒhmitada kĂ”ik tehingud selle pĂ€eva jooksul. Kuid igaĂŒhe pĂ€ev algab erineval ajal, seega on ka tehingute kogum erinev. UTC jĂ€rgi on nihe, mille jaoks tuleb andmeid koguda.
InfluxDB-s, kui rĂŒhmitada ajaperioodi jĂ€rgi, saab lisaks mÀÀrata nihke, nĂ€iteks Moskva aja (UTC+3) puhul:
SELECT MEAN("supply") FROM transactions GROUP BY symbol, time(1d, 3h) fill(previous)Kuid pĂ€ringu tulemus on vale. Ăhel vĂ”i teisel pĂ”hjusel rĂŒhmitatud pĂ€evased andmed algavad lausa 1677. aastast (InfluxDB toetab ametlikult ajavahemikku alates sellest aastast):

Selle probleemi vÀltimiseks oleme teenuse ajutiselt viinud UTC+0.
4. JÔudlus
Internetis on palju vĂ”rdlusi InfluxDB ja teiste andmebaaside kohta. Esmasel tutvumisel tundusid need turundusmaterjalidena, kuid nĂŒĂŒd arvan, et neis on tĂ”de.
Kannan enda juhtumi.
Teenuses on API meetod, mis tagastab statistika viimase 24 tunni kohta. Arvutuste kÀigus teeb meetod kolm korda andmebaasi pÀringud jÀrgmiste pÀringutega:
SELECT * FROM coins_info WHERE time <= NOW() GROUP BY symbol ORDER BY time DESC LIMIT 1SELECT * FROM dominance_info ORDER BY time DESC LIMIT 1SELECT * FROM transactions WHERE time >= NOW() - 24h ORDER BY time DESCSelgitus:
- Esimeses pĂ€ringus saame iga mĂŒndi viimased punktid turu andmetega. Minu puhul kaheksa punkti kaheksale mĂŒndile.
- Teine pĂ€ring saab ĂŒhe kĂ”ige uuema punkti.
- Kolmas pĂ€ring kĂŒsib viimase 24 tunni tehingute nimekirja, neid vĂ”ib olla mitu sada.
Selgitan, et InfluxDB-s luuakse automaatselt indeks ning see suurendab pĂ€ringute kiirus, kui nitse ja ajaga. Esimeses pĂ€ringus symbol â see on nihe.
Tehtud on stressitest selle API meetodi kohta. 25 RPS korral nÀitas server kÔigi kuue CPU tÀitumist:

Samal ajal ei andnud NodeJs protsess mingeid koormusi.
TĂ€itmise kiirus halvenes juba 7-10 RPS juures: kui ĂŒks klient suutis vastuse saada 200 ms jooksul, pidid 10 klienti ootama ĂŒhe sekundi. 25 RPS on piir, mille juures kannatas stabiilsus, klientidele tagastati 500 vead.
Sellise jĂ”udlusega ei ole Influxi kasutamine meie projektis vĂ”imalik. Veelgi enam: projektis, kus jĂ€lgimist tuleb demonstreerida paljudele klientidele â vĂ”ivad tekkida sarnased probleemid ja mÔÔtmete server saab ĂŒle koormatud.
KokkuvÔte
Oluline jĂ€reldus saadud kogemusest on see, et projekti ei tohi tuua tundmatuid tehnoloogiaid ilma piisava analĂŒĂŒsita. Lihtne avatud piletite skaneerimine GitHubis oleks andnud teavet, et mitte valida InfluxDB pĂ”hivaatage andmete salvestamiseks.
InfluxDB pidi olema oma projekti vajaduste jaoks sobiv, kuid praktika on nÀidanud, et see andmebaas ei vasta nÔudmistele ja teeb palju vigu.
Projektirepositooriumis on juba saadaval versioon 2.0.0-beta, jÀÀb vaid lo hope, et teises versioonis on olulisi parandusi. Samas hakkan uurima TimescaleDB dokumentatsiooni.
Allikas: habr.com
