
Kui kasutada ajareal pĂ”hinevat andmebaasi (timeseries db, ) peamise salvestusena statistika veebisaidile, vĂ”ib ĂŒlesande lahendamise asemel tekkida palju peavalu. Töödan projektiga, kus kasutatakse sellist andmebaasi, ja mĂ”nikord on InfluxDB, millest jutt, toonud kaasa ootamatuid ĂŒllatusi.
MĂ€rkus: esitatud probleemid kuuluvad versioonile InfluxDB 1.7.4.
Miks ajaread?
Projekt seisneb tehingute jÀlgimises erinevates plokiahelates ja statistika kuvamises. Konkreetsemalt jÀlgime stabiilsete virtuaalsete coinide emissiooni ja pÔletamist (). Nende tehingute pÔhjal on vaja koostada diagramme ja esitada kokkuvÔtteid.
Tehingute analĂŒĂŒsimise kĂ€igus tuli idee: kasutada ajareal pĂ”hinevat andmebaasi InfluxDB peamise salvestusena. Tehingud on ajamomendid ja sobivad hĂ€sti ajarealise mudeli sisse.
Veel funktsioone koondamise osas tundusid vĂ€ga mugavad â pika perioodi jooksul graafikute töötlemiseks on need ideaalsed. Kasutajale on vajalik aastane graafik, kuid andmebaasis on komplektandmeid viie minuti ajaraami kohta. Terve sada tuhat punkti temale saatmine on mĂ”ttetuks â peale pika töötlemise ei mahuks need ka ekraanile. Saab kirjutada oma ajaraami suurendamise rakenduse vĂ”i kasutada Influxi sisseehitatud koondamisfunktsioone. Nende abil saab andmeid rĂŒhmadesse koondada pĂ€evade kaupa ja saata vajalikud 365 punkti.
Natuke segadust tekitas see, et tavaliselt kasutatakse selliseid andmebaase mÔÔdikute kogumiseks. Serverite jĂ€lgimine, IoT-seadmed, kĂ”ik, kust voolab miljoneid punkte, mis nĂ€evad vĂ€lja: [<aeg> â <mÔÔdiku vÀÀrtus>]. Kuid kui andmebaas töötab hĂ€sti suure andmevooga, siis miks peaks vĂ€ikse koguse puhul probleeme tekkima? Selle mĂ”ttega vĂ”tsime InfluxDB tööle.
Mis veel on InfluxDB-s mugav
Lisaks mainitud koondamisfunktsioonidele on veel ĂŒks suurepĂ€rane asi â tĂ”ukekĂŒsimused (). See, it's a built-in scheduler in the database that can handle data on a schedule. For instance, you can group all entries for the day every 24 hours, calculate the average, and record a new point in another table without writing your own cycles.
Samuti on olemas retention policies () â setting up data deletion after a certain period. This is useful when, for example, you need to keep CPU load data for a week with measurements every second, but such precision isn't necessary over a couple of months. In such a situation, you can do the following:
- create a continuous query to aggregate data into another table;
- define a deletion policy for metrics older than that week for the first table.
And Influx will automatically reduce the data size and delete unnecessary records.
About stored data
There's not a lot of data stored: about 70,000 transactions and another million points with market information. New records are added at a rate of no more than 3,000 points per day. There are also metrics on the site, but thereâs not much data there, and according to the retention policy, they are stored for no longer than a month.
Probleemid
Teenuse arendamise ja jĂ€rgneva testimise kĂ€igus tekkis ĂŒha kriitilisemaid probleeme InfluxDB kasutamisel.
1. Andmete kustutamine
On olemas andmesari tehingutega:
SELECT time, amount, block, symbol FROM transactions WHERE symbol='USDT'Tulemus:

Saadan kÀsu andmete kustutamiseks:
DELETE FROM transactions WHERE symbol='USDT'PĂ€rast seda teen pĂ€ringu juba kustutatud andmete saamiseks. Influx tagastab tĂŒhja vastuse asemel osa andmetest, mis pidid olema kustutatud.
Proovin kustutada terve tabeli:
DROP MEASUREMENT transactionsKontrollin tabeli kustutamist:
SHOW MEASUREMENTSTabelit loendis ei nÀe, kuid uus andmepÀring tagastab endiselt sama tehingute kogumi.
Probleem tekkis mul vaid ĂŒks kord, kuna kustutamise juhtum oli harv. Kuid selline kĂ€itumine andmebaasis ei vasta selgelt "korrektse" töö raamistikule. Hiljem leidsin githubist avatud peaaegu aasta taguse selle teema kohta.
KokkuvÔttes aitas andmete eemaldamine ja kogu andmebaasi taastamine.
2. Ujuvkoma numbrid
Matemaatilised arvutused InfluxDB sisseehitatud funktsioone kasutades toovad esile tÀpsusvead. See ei ole just midagi ebatavalist, kuid ebameeldiv.
Minu puhul on andmed rahaga seotud, ning soovin neid töötleda kÔrge tÀpsusega. Selle tÔttu on plaanis loobuda pidevatest pÀringutest.
3. Pidevaid pÀringuid ei saa kohandada erinevatesse ajavöönditesse.
Teenuses on tabel pĂ€evast statistikat tehingute kohta. Iga pĂ€eva jaoks tuleb rĂŒhmitada kĂ”ik tehingud nende ööpĂ€eva jooksul. Kuid iga kasutaja jaoks algab pĂ€ev erineval ajal, seega on ka tehingute kogum erinev. UTC jĂ€rgi on olemas nihet, mille jaoks tuleb andmeid agregatsiooni vĂ”tta.
InfluxDB-s, kui ajaperioodi jĂ€rgi rĂŒhmitatakse, saab tĂ€iendavalt mÀÀrata nihke, nĂ€iteks Moskva aja (UTC+3) jaoks:
SELECT MEAN("supply") FROM transactions GROUP BY symbol, time(1d, 3h) fill(previous)Kuid pĂ€ringu tulemus saab olema vale. Ăhel vĂ”i teisel pĂ”hjusel rĂŒhmitatud pĂ€evaste andmete algus kuupĂ€ev on lausa 1677. aasta (InfluxDB toetab ametlikult ajavahemikku alates sellest aastast):

Selle probleemi vĂ€ltimiseks viidi teenus ajutiselt ĂŒle UTC+0-le.
4. JÔudlus
Internetis on palju bĂ€nkmĂ€rke, mis vĂ”rdlevad InfluxDB-d ja teisi andmebaase. Esimese tutvustuse ajal tundusid need turundusmaterjalidena, kuid nĂŒĂŒd arvan, et neis on tĂ”etera.
Jagage oma juhtumit.
Teenusel on API meetod, mis tagastab statistika viimase 24 tunni jooksul. Arvutuste kĂ€igus kĂŒsib meetod andmebaasi kolm korda 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 viimased punktid iga mĂŒndi kohta turuandmetega. Minu puhul oli kaheksa punkti kaheksa mĂŒndi kohta.
- Teine pÀring saab kÔige uueima punkti.
- Kolmas pĂ€ring kĂŒsib viimase 24 tunni tehingute loendi, neid vĂ”ib olla mitusada.
TĂ€psustan, et InfluxDB-s luuakse siltide ja aja jĂ€rgi automaatselt indeks, mis kiirendab pĂ€ringuid. Esimeses pĂ€ringus symbol â see on silt.
Tegin selle API meetodi jaoks stressitesti. 25 RPS juures nÀitas server tÀielikku kuue CPU koormust:

Samal ajal ei avaldanud NodeJs protsess mingit koormust.
TĂ€ideviimise kiirus langes 7-10 RPS: kui ĂŒks klient sai vastuse 200 ms jooksul, pidid 10 klienti ootama ĂŒhe sekundi. 25 RPS â piir, mille puhul kannatas stabiilsus, kliendid said tagasi 500 veateateid.
Sellise jĂ”udlusega on meie projektis Influxi kasutamine vĂ”imatu. Veelgi enam: projektis, kus jĂ€lgimist tuleb nĂ€idata paljudele klientidele, vĂ”ivad tekkida sarnased probleemid ja mÔÔtmete server koormatakse ĂŒle.
KokkuvÔte
Peamine jĂ€reldus saadud kogemusest on see, et ei tohiks vĂ”tta projekti tundmatut tehnoloogiat ilma piisava analĂŒĂŒsita. Lihtne avatud piletite skaneerimine GitHubis oleks vĂ”inud anda teavet, et mitte vĂ”tta InfluxDB-d pĂ”hivaatamisruumina.
InfluxDB pidi hĂ€sti sobima minu projekti ĂŒlesannete jaoks, kuid praktika on nĂ€idanud, et see andmebaas ei vasta vajadustele ja tekitab palju vigu.
Projektirepos on juba saadaval versioon 2.0.0-beta, jÀÀb loota, et teises versioonis on olulised tÀiustused. Senikaua Ôpin TimescaleDB dokumentatsiooni.
Allikas: habr.com
