Viha, kauplemine ja depressioon InfluxDB kasutamisel

Viha, kauplemine ja depressioon InfluxDB kasutamisel

Kui kasutada ajaseeria andmebaasi (timeseries db, wiki) 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 (wiki) 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 (doc). 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 (doc) — 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:

  1. luua pidev pÀring andmete kogumiseks teise tabelisse;
  2. 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:

Viha, kauplemine ja depressioon InfluxDB kasutamisel

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 transactions

Kontrollin tabeli kustutamist:

SHOW MEASUREMENTS

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

Viha, kauplemine ja depressioon InfluxDB kasutamisel

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 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 iga mĂŒndi viimased punktid turu andmetega. Minu puhul kaheksa punkti kaheksale mĂŒndile.
  2. Teine pĂ€ring saab ĂŒhe kĂ”ige uuema punkti.
  3. 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:

Viha, kauplemine ja depressioon InfluxDB kasutamisel

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

Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid | ProHoster