Viha, kaubandus ja masendus InfluxDB kasutamisel

Viha, kaubandus ja masendus InfluxDB kasutamisel

Kui kasutada ajareal pĂ”hinevat andmebaasi (timeseries db, wiki) 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 (wiki). 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 (dok). 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 (dok) — 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:

  1. create a continuous query to aggregate data into another table;
  2. 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:

Viha, kaubandus ja masendus InfluxDB kasutamisel

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 transactions

Kontrollin tabeli kustutamist:

SHOW MEASUREMENTS

Tabelit 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 ticketi 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 37 varianti 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):

Viha, kaubandus ja masendus InfluxDB kasutamisel

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 1

SELECT * FROM dominance_info ORDER BY time DESC LIMIT 1

SELECT * FROM transactions WHERE time >= NOW() - 24h ORDER BY time DESC

Selgitus:

  1. Esimeses pĂ€ringus saame viimased punktid iga mĂŒndi kohta turuandmetega. Minu puhul oli kaheksa punkti kaheksa mĂŒndi kohta.
  2. Teine pÀring saab kÔige uueima punkti.
  3. 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:

Viha, kaubandus ja masendus InfluxDB kasutamisel

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

Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid | ProHoster