Ilska, förhandling och depression vid arbete med InfluxDB

Ilska, förhandling och depression vid arbete med InfluxDB

Om man anvÀnder en tidsseriedatabas (timeseries db, wiki) som huvudsakligt lagringsutrymme för en webbplats med statistik, kan man istÀllet för att lösa problemet fÄ mycket huvudvÀrk. Jag arbetar med ett projekt dÀr en sÄdan databas anvÀnds, och ibland har InfluxDB, som vi kommer att diskutera, bjudit pÄ helt ovÀntade överraskningar.

Ansvarsfriskrivning: de angivna problemen gÀller version InfluxDB 1.7.4.

Varför tidsserie?

Projektet handlar om att spĂ„ra transaktioner i olika blockkedjor och visa statistik. Specifikt — vi ser pĂ„ emission och brĂ€nning av stablecoins (wiki). Baserat pĂ„ dessa transaktioner mĂ„ste vi bygga diagram och visa sammanfattningstabeller.

Vid analysen av transaktionerna kom tanken att anvÀnda tidsseriedatabasen InfluxDB som huvudsakligt lagringsutrymme. Transaktionerna Àr punkter i tid och passar vÀl in i tidsseriemodellen.

Aggregationens funktioner verkade ocksĂ„ mycket praktiska — de passar perfekt för att bearbeta diagram över lĂ€ngre perioder. AnvĂ€ndaren behöver ett diagram för Ă„ret, men i databasen finns en dataset med fem minuters tidsram. Att skicka alla hundratusen punkter Ă€r meningslöst — förutom den lĂ„nga behandlingen fĂ„r det inte ens plats pĂ„ skĂ€rmen. Man kan skriva sin egen implementation för att öka tidsramen, eller anvĂ€nda de inbyggda aggregationsfunktionerna i Influx. Med hjĂ€lp av dem kan vi gruppera data per dag och skicka de 365 nödvĂ€ndiga punkterna.

Det kĂ€ndes lite förvirrande att sĂ„dana databaser vanligtvis anvĂ€nds för att samla in mĂ€tvĂ€rden. Övervakning av servrar, IoT-enheter, allt som "flödar" in miljontals punkter av typen: [<tidsstĂ€mpel> — <mĂ„ttvĂ€rde>]. Men om databasen fungerar bra med stora datamĂ€ngder, varför skulle ett litet antal orsaka problem? Med den tanken tog vi InfluxDB i bruk.

Vad som Àr mer praktiskt med InfluxDB

Förutom de nĂ€mnda aggregationsfunktionerna finns det ocksĂ„ en fantastisk sak — kontinuerliga frĂ„gor (dokument). Det Ă€r en inbyggd schemalĂ€ggare i databasen som kan bearbeta data enligt schema. Till exempel kan man gruppera alla poster för dagen var 24:e timme, berĂ€kna medelvĂ€rdet och skriva en ny punkt i en annan tabell utan att behöva skriva egna lösningar.

Det finns ocksĂ„ bevarande policyer (dokument) — instĂ€llning för att radera data efter en viss period. AnvĂ€ndbart nĂ€r man till exempel vill lagra CPU-belastningen under en vecka med mĂ€tningar varje sekund, men för en tidsperiod pĂ„ nĂ„gra mĂ„nader Ă€r denna precision inte nödvĂ€ndig. I en sĂ„dan situation kan man göra sĂ„hĂ€r:

  1. skapa en kontinuerlig frÄga för att aggregera data till en annan tabell;
  2. för den första tabellen definiera en politik för att radera mÀtvÀrden som Àr Àldre Àn just den veckan.

Och Influx kommer sjÀlvstÀndigt att minska datastorleken och radera det onödiga.

Om de lagrade data

Det finns inte mycket data: cirka 70 000 transaktioner och ytterligare en miljon punkter med marknadsinformation. NyinlĂ€ggning av poster — högst 3000 punkter per dag. Det finns ocksĂ„ mĂ€tvĂ€rden för webbplatsen, men dĂ€r Ă€r datan begrĂ€nsad och enligt retention-policy lagras de högst en mĂ„nad.

Problem

Under utvecklingen och efterföljande test av tjÀnsten uppstod det allt mer kritiska problem med driften av InfluxDB.

1. Raderingsproblem

Det finns en serie data med transaktioner:

SELECT time, amount, block, symbol FROM transactions WHERE symbol='USDT'

Resultatet:

Ilska, förhandling och depression vid arbete med InfluxDB

Jag skickar kommandot för att radera data:

DELETE FROM transactions WHERE symbol='USDT'

DÀrefter gör jag en förfrÄgan för att fÄ tillbaka redan raderade data. Och Influx istÀllet för ett tomt svar returnerar delar av de data som borde ha raderats.

Jag försöker radera hela tabellen:

DROP MEASUREMENT transactions

Jag kontrollerar raderingen av tabellen:

SHOW MEASUREMENTS

Jag ser inte tabellen i listan, men den nya datan returnerar fortfarande samma uppsÀttning transaktioner.

Problemet uppstod bara en gĂ„ng för mig, eftersom fallet med radering Ă€r unikt. Men detta beteende av databasen passar tydligt inte inom ramen för ”korrekt” drift. Senare hittade jag ett öppet ticket frĂ„n nĂ€stan ett Ă„r sedan om detta Ă€mne.

Som ett resultat, hjÀlpte det att radera och sedan ÄterstÀlla hela databasen.

2. Flyttal

Matematiska berÀkningar med inbyggda funktioner i InfluxDB ger noggrannhetsfel. Inte sÄ att det Àr nÄgot ovanligt, men det Àr obehagligt.

I mitt fall har datan en finansiell komponent och jag skulle vilja bearbeta dem med hög precision. PÄ grund av det övervÀger jag att överge kontinuerliga frÄgor.

3. Kontinuerliga frÄgor kan inte anpassas till olika tidszoner

TjÀnsten har en tabell med daglig statistik över transaktioner. För varje dag behöver alla transaktioner för den dagen grupperas. Men dagen börjar vid olika tidpunkter för varje anvÀndare, vilket innebÀr att uppsÀttningen av transaktioner ocksÄ Àr olika. Enligt UTC finns det 37 alternativ för förskjutning, för vilka data mÄste aggregeras.

I InfluxDB kan du vid tidsgruppering dessutom ange en förskjutning, till exempel för Moskvatid (UTC+3):

SELECT MEAN("supply") FROM transactions GROUP BY symbol, time(1d, 3h) fill(previous)

Men resultatet av frÄgan kommer att vara inkorrekt. Av nÄgon anledning börjar de grupperade dagliga data sÄ tidigt som 1677, dÄ InfluxDB officiellt stöder tidsintervallet frÄn det Äret:

Ilska, förhandling och depression vid arbete med InfluxDB

För att kringgÄ detta problem har tjÀnsten tillfÀlligt överfört till UTC+0.

4. Prestanda

Det finns mÄnga benchmarktester pÄ nÀtet som jÀmför InfluxDB med andra databaser. Vid första ögonkastet verkade de vara marknadsföringsmaterial, men nu anser jag att det finns en del sanning i dem.

Jag berÀttar om mitt fall.

TjÀnsten tillhandahÄller en API-metod som returnerar statistik för de senaste 24 timmarna. Vid berÀkningarna gör metoden tre anrop till databasen med följande frÄgor:

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

Förklaring:

  1. I den första frĂ„gan fĂ„r vi de senaste punkterna för varje mynt med marknadsdata. Åtta punkter för Ă„tta mynt i mitt fall.
  2. Den andra frÄgan fÄr den senaste punkten.
  3. Den tredje frÄgan begÀr en lista över transaktioner för de senaste 24 timmarna, som kan vara flera hundra.

Jag vill klargöra att i InfluxDB bygger index automatiskt pÄ taggar och tid, vilket snabbar upp frÄgorna. I den första frÄgan symbol Àr en tagg.

Jag genomförde ett stresstest för denna API-metod. För 25 RPS visade servern full belastning pÄ sex CPU:er:

Ilska, förhandling och depression vid arbete med InfluxDB

Under tiden gav NodeJs-processen ingen belastning.

Svarshastigheten försÀmrades redan vid 7-10 RPS: om en klient kunde fÄ svar pÄ 200 ms, skulle 10 klienter vÀnta i en sekund. 25 RPS Àr grÀnsen dÀr stabiliteten pÄverkades, och kunderna fick 500-fel.

Med sĂ„dan prestanda Ă€r det omöjligt att anvĂ€nda Influx i vĂ„rt projekt. Dessutom, i ett projekt dĂ€r övervakning mĂ„ste visas för mĂ„nga kunder — kan liknande problem uppstĂ„ och metrics-servern blir överbelastad.

Utdata

Den viktigaste slutsatsen frÄn den erhÄllna erfarenheten Àr att man inte ska anvÀnda en okÀnd teknik i ett projekt utan tillrÀcklig analys. En enkel genomgÄng av öppna Àrenden pÄ github skulle kunna ge information för att inte vÀlja InfluxDB som huvudsakligt datalager.

InfluxDB borde ha passat bra för behoven i mitt projekt, men som praktiken visat sig, uppfyller denna databas inte behoven och har mÄnga problem.

I projektets repository kan man redan hitta version 2.0.0-beta, och man fÄr hoppas att den andra versionen kommer med betydande förbÀttringar. Under tiden ska jag gÄ och studera dokumentationen för TimescaleDB.

KĂ€lla: habr.com

Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar đŸ”„ Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster