As jo in tiidreeksdatabase brûke (timeseries db,
Disclaimer: De neamde problemen jilde foar InfluxDB ferzje 1.7.4.
Wêrom tiid rige?
It projekt is om transaksjes op ferskate blockchains te folgjen en statistiken te werjaan. Spesifyk sjogge wy nei de útstjit en ferbaarning fan stabile munten (
By it analysearjen fan transaksjes kaam in idee op: de InfluxDB-tiidreeksdatabase brûke as de haadopslach. Transaksjes binne punten yn 'e tiid en se passe goed yn' e tiidseriemodel.
De aggregaasjefunksjes liken ek heul handich - ideaal foar it ferwurkjen fan charts mei in lange perioade. De brûker hat in diagram foar in jier nedich, en de databank befettet in gegevensset mei in tiidframe fan fiif minuten. It hat gjin sin om him alle hûnderttûzen stippen te stjoeren - útsein lange ferwurking passe se net iens op it skerm. Jo kinne jo eigen ymplemintaasje skriuwe om it tiidframe te fergrutsjen, of de aggregaasjefunksjes brûke ynboud yn Influx. Mei har help kinne jo gegevens per dei groepearje en de fereaske 365 punten stjoere.
It wie in bytsje betiizjend dat sokke databases meastentiids brûkt wurde foar it sammeljen fan metriken. Monitoring fan servers, iot-apparaten, alles wêrfan miljoenen punten fan 'e foarm "streame": [<tiid> - <metryske wearde>]. Mar as de databank goed wurket mei in grutte gegevensstream, wêrom soe dan in lyts folume problemen feroarsaakje? Mei dit yn gedachten namen wy InfluxDB oan it wurk.
Wat oars is handich yn InfluxDB
Neist de neamde aggregaasjefunksjes is d'r in oar geweldich ding - trochgeande queries (
Hast ek behâld belied (
- meitsje in trochgeande query om gegevens te aggregearjen yn in oare tabel;
- foar de earste tabel, definiearje in belied foar it wiskjen fan metriken dy't âlder binne as deselde wike.
En Influx sil selsstannich de grutte fan 'e gegevens ferminderje en ûnnedige dingen wiskje.
Oer bewarre gegevens
Net folle gegevens wurde opslein: sa'n 70 tûzen transaksjes en noch in miljoen punten mei merkynformaasje. Nije yngongen tafoegje - net mear as 3000 punten per dei. Der binne ek metriken foar de side, mar d'r binne net folle gegevens en, neffens it behâldbelied, wurde se net mear as in moanne bewarre.
Problemen
Tidens de ûntwikkeling en folgjende testen fan 'e tsjinst ûntstiene hieltyd mear krityske problemen yn' e wurking fan InfluxDB.
1. Wiskje gegevens
D'r is in searje gegevens mei transaksjes:
SELECT time, amount, block, symbol FROM transactions WHERE symbol='USDT'
Resultaat:
Ik stjoer in kommando om gegevens te wiskjen:
DELETE FROM transactions WHERE symbol=’USDT’
Dêrnei set ik in fersyk om de al wiske gegevens te ûntfangen. En ynstee fan in lege antwurd jout Influx in diel fan 'e gegevens werom dy't wiske wurde moatte.
Ik besykje de hiele tabel te wiskjen:
DROP MEASUREMENT transactions
Ik kontrolearje it wiskjen fan 'e tabel:
SHOW MEASUREMENTS
Ik sjoch net de tabel yn de list, mar in nije gegevens query noch jout deselde set fan transaksjes.
It probleem kaam my mar ien kear op, om't de wiskfal in isolearre gefal wie. Mar dit gedrach fan 'e databank past dúdlik net yn it ramt fan "korrekte" operaasje. Letter fûn ik it iepen op github
As resultaat holp it wiskjen en dan werstelle fan de folsleine databank.
2. Floating point nûmers
Math berekkeningen by it brûken fan ynboude funksjes yn InfluxDB hawwe krektens flaters. Net dat dit wat ûngewoan is, mar it is onaangenaam.
Yn myn gefal hawwe de gegevens in finansjele komponint en ik wol it mei hege krektens ferwurkje. Hjirtroch binne wy fan plan trochgeande fragen te ferlitten.
3. Trochrinnende queries kinne net oanpast wurde oan ferskate tiidsônes
De tsjinst hat in tabel mei deistige transaksjestatistiken. Foar elke dei moatte jo alle transaksjes foar dy dei groepearje. Mar de dei fan elke brûker sil begjinne op in oare tiid, en dêrom sil de set fan transaksjes oars wêze. By UTC ja
Yn InfluxDB kinne jo by groepearjen op tiid ek in ferskowing opjaan, bygelyks foar Moskou-tiid (UTC+3):
SELECT MEAN("supply") FROM transactions GROUP BY symbol, time(1d, 3h) fill(previous)
Mar it resultaat fan 'e query sil ferkeard wêze. Om ien of oare reden sille gegevens groepeare per dei hielendal werom begjinne oant 1677 (InfluxDB stipet offisjeel in tiidspanne fan dit jier):
Om dit probleem om te gean, hawwe wy de tsjinst tydlik oerskeakele nei UTC + 0.
4. Prestaasje
D'r binne in protte benchmarks op it ynternet dy't InfluxDB en oare databases fergelykje. Op it earste each seagen se út as marketingmateriaal, mar no tink ik dat der wat wierheid yn sit.
Ik sil dy myn saak fertelle.
De tsjinst leveret in API-metoade dy't statistiken foar de lêste dei werombringt. By it útfieren fan berekkeningen freget de metoade trije kear de database mei de folgjende fragen:
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
Ferklearring:
- Yn it earste fersyk krije wy de lêste punten foar elke munt mei merkgegevens. Acht punten foar acht munten yn myn gefal.
- It twadde fersyk krijt ien fan de nijste punten.
- De tredde freget in list mei transaksjes foar de lêste XNUMX oeren; d'r kinne ferskate hûnderten fan wêze.
Lit my ferdúdlikje dat InfluxDB automatysk in yndeks bouwt op basis fan tags en tiid, wat queries fersnelt. Yn it earste fersyk symboal is in tag.
Ik haw rinne in stress test op dizze API metoade. Foar 25 RPS toande de server in folsleine lading fan seis CPU's:
Tagelyk levere it NodeJs-proses hielendal gjin lading.
De útfieringssnelheid is al degradearre troch 7-10 RPS: as ien kliïnt in antwurd koe krije yn 200 ms, dan moasten 10 kliïnten in twadde wachtsje. 25 RPS is de limyt wêrop stabiliteit te lijen hat; 500 flaters waarden weromjûn oan kliïnten.
Mei sokke prestaasjes is it ûnmooglik om Influx te brûken yn ús projekt. Boppedat: yn in projekt dêr't tafersjoch moat wurde oantoand oan in protte kliïnten, kinne ferlykbere problemen ferskine en de metrike tsjinner wurdt oerladen.
konklúzje
De wichtichste konklúzje út de opdien ûnderfining is dat jo in ûnbekende technology net yn in projekt kinne nimme sûnder genôch analyze. In ienfâldige screening fan iepen problemen op github koe ynformaasje leverje om foar te kommen dat jo InfluxDB kieze as de haadgegevenswinkel.
InfluxDB soe in goede fit wêze moatte foar de taken fan myn projekt, mar lykas de praktyk hat bliken dien, foldocht dizze databank net oan 'e behoeften en hat in protte bugs.
Jo kinne ferzje 2.0.0-beta al fine yn it projektrepository; wy kinne allinich hoopje dat de twadde ferzje signifikante ferbetterings sil hawwe. Yn 'e tuskentiid sil ik de TimescaleDB-dokumintaasje studearje.
Boarne: www.habr.com