
Under de senaste Ären har databaser för tidsserier (Time-series databases) gÄtt frÄn att vara en ovanlig företeelse (som tillÀmpades antingen i specifika övervakningssystem eller i Big Data-projekt) till en "massmarknadprodukt". I Ryssland Àr det vÀrt att nÀmna Yandex och ClickHouse för detta. Fram tills dess, om du behövde lagra en stor mÀngd tidsseriedata, var du tvungen att antingen acceptera att bygga en monstruös Hadoop-stack och underhÄlla den, eller att hantera protokoll specifika för varje system.
Det kan verka som om artikeln frÄn 2019 om vilken TSDB som Àr vÀrd att anvÀnda skulle bestÄ av en enda mening: "anvÀnd bara ClickHouse". Men⊠det finns nyanser.
Verkligen, ClickHouse utvecklas aktivt, anvÀndarbasen vÀxer, och stödet Àr mycket aktivt, men har vi inte blivit fÄngar av ClickHouse:s offentliga framgÄng, som överskuggat andra, kanske mer effektiva/pÄlitliga lösningar?
I början av förra Äret började vi omarbeta vÄrt eget övervakningssystem, dÀr vi stötte pÄ frÄgan om att vÀlja en lÀmplig databas för datalagring. Jag vill berÀtta historien om detta val hÀr.
UppgiftsstÀllande
Först och frÀmst - en nödvÀndig inledning. Varför behöver vi överhuvudtaget vÄrt eget övervakningssystem och hur var det uppbyggt?
Vi började erbjuda supporttjÀnster 2008, och 2010 blev det tydligt att aggregera data om processerna i kundens infrastruktur med de lösningar som fanns dÄ blev svÄrt (vi pratar om, för guds skull, Cacti, Zabbix och det framvÀxande Graphite).
VÄra grundkrav var:
- att hantera (vid den tiden - tiotals, och pÄ sikt - hundratals) kunder inom ett system och dessutom ha ett centraliserat system för hantering av aviseringar;
- flexibilitet i hanteringen av aviseringar (eskalering av aviseringar mellan vaktmÀstare, beaktande av scheman, kunskapsdatabas);
- möjlighet till djup detaljering av diagram (Zabbix vid den tiden ritade diagram som bilder);
- lÄngvarig lagring av stora mÀngder data (ett Är eller mer) och möjlighet till snabb hÀmtning.
I den hÀr artikeln Àr vi intresserade av den senaste punkten.
NÀr det gÀller lagring var kraven följande:
- systemet mÄste fungera snabbt;
- det Àr önskvÀrt att systemet har ett SQL-grÀnssnitt;
- systemet mÄste vara stabilt och ha en aktiv anvÀndarbas och support (nÄgon gÄng stötte vi pÄ behovet av att stödja system som MemcacheDB, som slutade utvecklas, eller det distribuerade lagret MooseFS, vars bugtracking sköttes pÄ kinesiska: vi ville inte upprepa den historien för vÄrt projekt);
- överensstĂ€mmelse med CAP-teoremet: Consistency (nĂ„got som krĂ€vs) â data mĂ„ste vara aktuella, vi vill inte att systemet för hantering av aviseringar inte fĂ„r nya data och spottar ut varningar om att ingen data kommit in för alla projekt; Partition Tolerance (nĂ„got som krĂ€vs) â vi vill inte fĂ„ ett Split Brain-system; Availability (inte kritiskt, om det finns en aktiv replik) â vi kan sjĂ€lva vĂ€xla till reservsystemet vid en nödsituation, via kod.
Konstigt nog visade sig MySQL vara den perfekta lösningen för oss vid den tiden. VÄr datastruktur var extremt enkel: server-id, rÀknarens id, tidsstÀmpel och vÀrde; snabb hÀmtning av heta data sÀkerstÀlldes genom storleken pÄ buffer pool, och hÀmtning av historiska data genom SSD.

DÀrmed lyckades vi hÀmta fÀrska tvÄveckorsdata med en detaljeringsgrad ner till sekunden pÄ 200 ms fram till den fullstÀndiga renderingstiden, och vi levde med det systemet ganska lÀnge.
Under tiden gick tiden och mÀngden data vÀxte. Vid 2016 Ärs slut nÄdde datamÀngderna tiotals terabyte, vilket var en betydande kostnad för hyrda SSD-lagringar.
Vid denna tidpunkt hade kolumnbaserade databaser blivit populÀra, som vi började tÀnka pÄ: i kolumnbaserade databaser lagras data, som namnet antyder, i kolumner, och om man ser pÄ vÄra data kan man lÀtt se ett stort antal dubbletter, som i fallet med anvÀndning av en kolumnbaserad databas skulle kunna komprimeras.

Men det kritiska systemet för företagets verksamhet fortsatte att fungera stabilt, och vi ville inte experimentera med att byta till nÄgot annat.
à r 2017 pÄ konferensen Percona Live i San Jose gjorde Clickhouse-utvecklarna förmodligen sin första stora presentation. Vid första anblick verka systemet vara produktion-klar (Yandex.Metrica Àr trots allt en tuff produktion), supporten var snabb och enkel, och framförallt, driften var okomplicerad. FrÄn och med Är 2018 pÄbörjade vi övergÄngsprocessen. Men vid den tiden fanns det mÄnga 'mogna' och vÀlbeprövade TSDB-system, och vi beslutade att avsÀtta betydande tid för att jÀmföra alternativ, för att sÀkerstÀlla att det inte fanns nÄgra alternativ till Clickhouse som uppfyllde vÄra krav.
Utöver de redan angivna kraven pÄ lagringssystemet tillkom nya:
- det nya systemet ska ge Ätminstone samma prestanda som MySQL, pÄ samma hÄrdvarukonfiguration;
- lagringssystemet för den nya plattformen ska ta upp betydligt mindre utrymme;
- DBMS:en ska fortfarande vara enkel att hantera;
- vi ville minimera förÀndringarna i applikationen vid byte av DBMS.
Vilka system började vi övervÀga
Apache Hive/Apache Impala
Den gamla pÄlitliga Hadoop-stacken. I grund och botten Àr detta ett SQL-grÀnssnitt byggt ovanpÄ lagring av data i egna format pÄ HDFS.
Fördelar.
- Vid stabil drift Àr det mycket enkelt att skala data.
- Det finns kolumnbaserade lösningar för datalagring (mindre utrymme).
- Mycket snabb exekvering av parallella uppgifter med tillrÀckliga resurser.
Nackdelar.
- Det Àr Hadoop, och det Àr komplicerat att hantera. Om vi inte Àr redo att ta ett fÀrdigt molnlösning (vilket vi inte Àr kostnadsmÀssigt), mÄste hela stacken byggas och underhÄllas av administratörer, vilket vi verkligen vill undvika.
- Data aggregeras .
Men:

Hastigheten uppnĂ„s genom att öka antalet berĂ€kningsservrar. Enkelt uttryckt, om vi Ă€r ett stort företag, arbetar med analys och det Ă€r kritiskt för affĂ€ren att aggregera informationen sĂ„ snabbt som möjligt (Ă€ven pĂ„ bekostnad av att anvĂ€nda en stor mĂ€ngd berĂ€kningsresurser) â kan detta vara vĂ„rt val. Men vi var inte redo att kraftigt öka hĂ„rdvaruflottan för att uppnĂ„ snabbhet i uppgifternas utförande.
Druid/Pinot
Mycket mer specifikt om TSDB, men Ă„terigen â Hadoop-stacken.
Det finns .
Om man sammanfattar: Druid/Pinot ser bÀttre ut Àn Clickhouse i fall dÀr:
- Du har en heterogen datakaraktĂ€r (i vĂ„rt fall registrerar vi bara tidsserier av servermetrik, och i grunden handlar det om en tabell. Men det kan finnas andra fall: tidsserier frĂ„n utrustning, ekonomiska tidsserier osv. â var och en med sin egen struktur, som mĂ„ste aggregeras och bearbetas).
- Det finns mycket av dessa data.
- Tabeller och data med tidsserier dyker upp och försvinner (det vill sÀga att en datamÀngd har kommit, har analyserats och sedan tagits bort).
- Det finns inget tydligt kriterium för hur data kan partitioneras.
I motsatta fall presterar ClickHouse bÀttre, och det Àr vÄrt fall.
ClickHouse
- SQL-liknande.
- Enkel att hantera.
- Folk sÀger att den fungerar.
Kommer med pÄ testlistan.
InfluxDB
Utomland alternativ till ClickHouse. Nackdelar: Hög tillgÀnglighet finns endast i den kommersiella versionen, men det mÄste jÀmföras.
Kommer med pÄ testlistan.
Cassandra
à ena sidan vet vi att den anvÀnds för att lagra metrisk tidsserie av system för övervakning som till exempel eller OkMeter. Men det finns specifika aspekter.
Cassandra Àr inte en kolumndatabas i den traditionella bemÀrkelsen. Den ser mer ut som en radbaserad databas, men i varje rad kan det finnas ett varierande antal kolumner, vilket gör det lÀtt att organisera en kolumnrepresentation. DÀrför Àr det förstÄeligt att med en begrÀnsning pÄ 2 miljarder kolumner kan du lagra viss data i kolumner (som tidsserier). Till exempel har MySQL en begrÀnsning pÄ 4096 kolumner och det Àr lÀtt att stöta pÄ felkod 1117 om man försöker göra samma sak.
Cassandra-motorn Ă€r inriktad pĂ„ lagring av stora mĂ€ngder data i ett distribuerat system utan en master, och i den ovan nĂ€mnda CAP-teorin handlar Cassandra mer om AP, det vill sĂ€ga tillgĂ€nglighet av data och motstĂ„ndskraft mot partitionering. DĂ€rför kan detta verktyg vara utmĂ€rkt om det endast behövs skriva till denna databas och sĂ€llan lĂ€sa frĂ„n den. HĂ€r Ă€r det logiskt att anvĂ€nda Cassandra som ett "kallt" lagringsalternativ. Det vill sĂ€ga som en lĂ„ngsiktig och pĂ„litlig plats för att lagra stora mĂ€ngder historiska data som sĂ€llan krĂ€vs, men som kan hĂ€mtas vid behov. För att ge en fullstĂ€ndig bild kommer vi dock att testa det ocksĂ„. Men som jag nĂ€mnde tidigare, finns det ingen önskan att aktivt omarbeta koden för den valda databaslösningen, sĂ„ vi kommer att testa det pĂ„ ett begrĂ€nsat sĂ€tt â utan att anpassa databasstrukturen efter Cassandras specifikationer.
Prometheus
Och av ren nyfikenhet beslöt vi oss för att testa prestandan hos Prometheus-lagringen â helt enkelt för att förstĂ„ om vi Ă€r snabbare eller lĂ„ngsammare Ă€n de nuvarande lösningarna och hur mycket.
Metodik och testresultat
SÄ, vi testade 5 databaser i följande 6 konfigurationer: ClickHouse (1 nod), ClickHouse (distribuerad tabell pÄ 3 noder), InfluxDB, Mysql 8, Cassandra (3 noder) och Prometheus. Testplanen Àr följande:
- vi laddar upp historiska data för en vecka (840 miljoner vÀrden per dag; 208 tusen mÀtningar);
- vi genererar en skrivbelastning (vi övervÀgde 6 belastningslÀgen, se nedan);
- parallellt med skrivningen gör vi periodiska förfrÄgningar, som simulerar anvÀndarfrÄgor som arbetar med grafer. För att inte komplicera för mycket valde vi att anvÀnda data frÄn 10 mÀtningar (just sÄ mÄnga finns pÄ CPU-grafen) under en vecka.
Vi belastar genom att simulera beteendet hos vÄr övervakningsagent, som skickar vÀrden till varje mÀtning var 15:e sekund. Vi Àr intresserade av att variera:
- det totala antalet mÀtningar som data skrivs till;
- intervallet för att skicka vÀrden till en mÀtning;
- batchstorleken.
Om batchstorleken. Eftersom nÀstan alla vÄra testdatabaser inte rekommenderas att belasta med enskilda insÀttningar, behöver vi en relay som samlar in de inkommande mÀtningarna och grupperar dem nÄgot och sedan skriver till databasen med batchinsert.
För att bÀttre förstÄ hur vi senare ska tolka de erhÄllna data, tÀnk pÄ att vi inte bara skickar en massa metrik, utan att metrik Àr organiserade i servrar - med 125 metrik per server. HÀr Àr servern bara en virtuell entitet - för att förstÄ att, till exempel, 10000 metrik motsvarar ungefÀr 80 servrar.
Och med hÀnsyn till allt detta, vÄra 6 lastlÀgen för databasen vid skrivning:

Det finns tvÄ saker att notera. För det första, för Cassandra visade sig dessa batchstorlekar vara för stora, dÀr anvÀnde vi vÀrdena 50 eller 100. För det andra, eftersom Prometheus fungerar strikt i pull-lÀge, det vill sÀga att den sjÀlv gÄr och hÀmtar data frÄn metrik-kÀllor (och Àven pushgateway, trots namnet, förÀndrar i grunden inte situationen), implementerades motsvarande belastningar med en kombination av statiska konfigurationer.
Testresultaten Àr följande:



Vad som Àr vÀrt att notera: fantastiskt snabba urval frÄn Prometheus, fruktansvÀrt lÄngsamma urval frÄn Cassandra, oacceptabelt lÄngsamma urval frÄn InfluxDB; nÀr det kommer till skrivhastighet vann ClickHouse överlÀgset, och Prometheus deltog inte i tÀvlingen eftersom den gör insÀttningar sjÀlv internt och vi mÀter ingenting.
I slutÀndan: ClickHouse och InfluxDB visade sig vara bÀst, men en kluster av Influx kan bara byggas pÄ grundval av Enterprise-versionen som kostar pengar, medan ClickHouse Àr gratis och tillverkas i Ryssland. Det Àr rimligt att valet i USA, förmodar jag, Àr i riktning mot InfluxDB, medan vi föredrar ClickHouse.
KĂ€lla: habr.com
