Mur ottimizzazzjonijiet f'VictoriaMetrics. Alexander Valyalkin

Nissuġġerixxi li taqra t-traskrizzjoni tar-rapport tard tal-2019 minn Alexander Valyalkin "Mur ottimizzazzjonijiet f'VictoriaMetrics"

VictoriaMetrics — DBMS veloċi u skalabbli għall-ħażna u l-ipproċessar tad-dejta fil-forma ta’ serje ta’ żmien (ir-rekord jifforma ħin u sett ta’ valuri li jikkorrispondu għal dan iż-żmien, pereżempju, miksuba permezz ta’ stħarriġ perjodiku tal-istatus tas-sensuri jew ġbir ta’ metriċi).

Mur ottimizzazzjonijiet f'VictoriaMetrics. Alexander Valyalkin

Hawnhekk hawn link għall-filmat ta' dan ir-rapport - https://youtu.be/MZ5P21j_HLE

Slajds

Mur ottimizzazzjonijiet f'VictoriaMetrics. Alexander Valyalkin

Għidilna dwarek innifsek. Jien Alexander Valyalkin. Hawn kont tiegħi GitHub. Jien passjonat dwar Go u l-ottimizzazzjoni tal-prestazzjoni. Ktibt ħafna libreriji utli u mhux daqshekk utli. Jibdew bi jew fast, jew bi quick prefiss.

Bħalissa qed naħdem fuq VictoriaMetrics. X'inhu u x'qed nagħmel hemmhekk? Se nitkellem dwar dan f'din il-preżentazzjoni.

Mur ottimizzazzjonijiet f'VictoriaMetrics. Alexander Valyalkin

Il-qosor tar-rapport huwa kif ġej:

  • L-ewwel, ngħidlek x'inhi VictoriaMetrics.
  • Imbagħad ngħidlek x'inhuma s-serje tal-ħin.
  • Imbagħad ngħidlek kif taħdem database tas-serje tal-ħin.
  • Sussegwentement, ngħidlek dwar l-arkitettura tad-database: fiex tikkonsisti.
  • U mbagħad ejja ngħaddu għall-ottimizzazzjonijiet li VictoriaMetrics għandha. Din hija ottimizzazzjoni għall-indiċi maqlub u ottimizzazzjoni għall-implimentazzjoni tal-bitset f'Go.

Mur ottimizzazzjonijiet f'VictoriaMetrics. Alexander Valyalkin

Xi ħadd fl-udjenza jaf x'inhi VictoriaMetrics? Ara naqra, ħafna nies diġà jafu. Hija aħbar tajba. Għal dawk li ma jafux, din hija database tas-serje tal-ħin. Hija bbażata fuq l-arkitettura tal-ClickHouse, fuq xi dettalji tal-implimentazzjoni tal-ClickHouse. Pereżempju, fuq bħal: MergeTree, kalkolu parallel fuq il-qlub tal-proċessuri kollha disponibbli u ottimizzazzjoni tal-prestazzjoni billi taħdem fuq blokki tad-dejta li jitqiegħdu fil-cache tal-proċessur.

VictoriaMetrics jipprovdi kompressjoni tad-dejta aħjar minn databases oħra ta’ serje ta’ żmien.

Tiskala vertikalment - jiġifieri, tista 'żżid aktar proċessuri, aktar RAM fuq kompjuter wieħed. VictoriaMetrics se tuża b'suċċess dawn ir-riżorsi disponibbli u se ttejjeb il-produttività lineari.

VictoriaMetrics tiskala wkoll orizzontalment - jiġifieri, tista 'żżid nodi addizzjonali mal-cluster VictoriaMetrics, u l-prestazzjoni tagħha tiżdied kważi b'mod lineari.

Kif bdejt, VictoriaMetrics hija database veloċi, għax ma nistax nikteb lil ħaddieħor. U huwa miktub f'Go, għalhekk qed nitkellem dwarha f'din il-laqgħa.

Mur ottimizzazzjonijiet f'VictoriaMetrics. Alexander Valyalkin

Min jaf x'inhi serje tal-ħin? Jaf ukoll ħafna nies. Serje ta’ żmien hija serje ta’ pari (timestamp, значение), fejn dawn il-pari huma magħżula skond il-ħin. Il-valur huwa numru b'punt li jvarja - float64.

Kull serje ta' żmien hija identifikata b'mod uniku b'ċavetta. Fiex tikkonsisti din iċ-ċavetta? Tikkonsisti f'sett mhux vojt ta' pari ewlenin-valur.

Hawn eżempju ta 'serje ta' żmien. Iċ-ċavetta ta 'din is-serje hija lista ta' pari: __name__="cpu_usage" huwa l-isem tal-metrika, instance="my-server" - dan huwa l-kompjuter li fuqu tinġabar din il-metrika, datacenter="us-east" - dan huwa ċ-ċentru tad-dejta fejn jinsab dan il-kompjuter.

Spiċċajna b'isem ta' serje taż-żmien li jikkonsisti fi tliet pari ta' valuri ewlenin. Din iċ-ċavetta tikkorrispondi għal lista ta 'pari (timestamp, value). t1, t3, t3, ..., tN - dawn huma timestamps, 10, 20, 12, ..., 15 — il-valuri korrispondenti. Dan huwa l-użu tal-cpu f'ħin partikolari għal serje partikolari.

Mur ottimizzazzjonijiet f'VictoriaMetrics. Alexander Valyalkin

Fejn jistgħu jintużaw is-serje tal-ħin? Xi ħadd għandu xi idea?

  • F'DevOps, tista 'tkejjel CPU, RAM, netwerk, rps, numru ta' żbalji, eċċ.
  • IoT - nistgħu nkejlu t-temperatura, il-pressjoni, il-koordinati ġeografiċi u xi ħaġa oħra.
  • Finanzi wkoll - nistgħu nissorveljaw il-prezzijiet għal kull xorta ta 'ħażniet u muniti.
  • Barra minn hekk, is-serje tal-ħin tista 'tintuża fil-monitoraġġ tal-proċessi ta' produzzjoni fil-fabbriki. Għandna utenti li jużaw VictoriaMetrics biex jimmonitorjaw turbini tar-riħ, għar-robots.
  • Is-serje tal-ħin huma wkoll utli għall-ġbir ta 'informazzjoni minn sensuri ta' apparati varji. Per eżempju, għal magna; għall-kejl tal-pressjoni tat-tajers; għall-kejl tal-veloċità, id-distanza; għall-kejl tal-konsum tal-gażolina, eċċ.
  • Is-serje tal-ħin tista 'tintuża wkoll biex timmonitorja l-inġenji tal-ajru. Kull inġenju tal-ajru għandu kaxxa sewda li tiġbor serje tal-ħin għal diversi parametri tas-saħħa tal-ajruplan. Is-serje tal-ħin jintużaw ukoll fl-industrija tal-ajruspazju.
  • Il-kura tas-saħħa hija pressjoni tad-demm, polz, eċċ.

Jista 'jkun hemm aktar applikazzjonijiet li nsejt dwarhom, imma nispera li tifhem li s-serje tal-ħin jintużaw b'mod attiv fid-dinja moderna. U l-volum tal-użu tagħhom qed jikber kull sena.

Mur ottimizzazzjonijiet f'VictoriaMetrics. Alexander Valyalkin

Għaliex għandek bżonn database tas-serje tal-ħin? Għaliex ma tistax tuża database relazzjonali regolari biex taħżen is-serje tal-ħin?

Minħabba li s-serje tal-ħin normalment ikun fiha ammont kbir ta 'informazzjoni, li hija diffiċli biex tinħażen u tiġi pproċessata f'databases konvenzjonali. Għalhekk, dehru databases speċjalizzati għas-serje tal-ħin. Dawn il-bażijiet jaħżnu b'mod effettiv il-punti (timestamp, value) biċ-ċavetta mogħtija. Jipprovdu API għall-qari tad-dejta maħżuna b'ċavetta, b'par ta' valur-ċavetta wieħed, jew b'pari ta' valur-ċavetta multipli, jew permezz ta' regexp. Pereżempju, trid issib it-tagħbija tas-CPU tas-servizzi kollha tiegħek f'ċentru tad-dejta fl-Amerika, imbagħad trid tuża din il-psewdo-mistoqsija.

Tipikament, id-databases tas-serje tal-ħin jipprovdu lingwi ta’ mistoqsijiet speċjalizzati minħabba li l-SQL tas-serje tal-ħin mhuwiex adattat ħafna. Għalkemm hemm databases li jappoġġjaw SQL, mhuwiex adattat ħafna. Mistoqsija lingwi bħal PromQL, InfluxQL, Fluss, Q. Nittama li xi ħadd sema' mill-inqas waħda minn dawn il-lingwi. Ħafna nies probabbilment semgħu dwar PromQL. Din hija l-lingwa tal-mistoqsijiet tal-Prometheus.

Mur ottimizzazzjonijiet f'VictoriaMetrics. Alexander Valyalkin

Hekk tidher arkitettura moderna tad-database tas-serje tal-ħin billi tuża VictoriaMetrics bħala eżempju.

Tikkonsisti f'żewġ partijiet. Din hija ħażna għall-indiċi maqlub u ħażna għall-valuri tas-serje tal-ħin. Dawn ir-repożitorji huma separati.

Meta jasal rekord ġdid fid-database, l-ewwel naċċessaw l-indiċi maqlub biex insibu l-identifikatur tas-serje taż-żmien għal sett partikolari label=value għal metrika partikolari. Insibu dan l-identifikatur u nsalvaw il-valur fil-maħżen tad-dejta.

Meta tasal talba biex tiġi rkuprata data minn TSDB, l-ewwel immorru għall-indiċi maqlub. Ejja nġibu kollox timeseries_ids rekords li jaqblu ma’ dan is-sett label=value. U mbagħad niksbu d-dejta kollha meħtieġa mill-maħżen tad-dejta, indiċjati minn timeseries_ids.

Mur ottimizzazzjonijiet f'VictoriaMetrics. Alexander Valyalkin

Ejja nħarsu lejn eżempju ta' kif database ta' serje ta' żmien tipproċessa mistoqsija ta' selezzjoni li tkun deħlin.

  • L-ewwelnett hi tikseb kollox timeseries_ids minn indiċi maqlub li jkun fih il-pari mogħtija label=value, jew tissodisfa espressjoni regolari partikolari.
  • Imbagħad jirkupra l-punti tad-dejta kollha mill-ħażna tad-dejta f'intervall ta 'ħin partikolari għal dawk misjuba timeseries_ids.
  • Wara dan, id-database twettaq xi kalkoli fuq dawn il-punti tad-dejta, skont it-talba tal-utent. U wara dan jirritorna t-tweġiba.

F'din il-preżentazzjoni se ngħidlek dwar l-ewwel parti. Din hija tfittxija timeseries_ids b'indiċi maqlub. Tista' tara dwar it-tieni parti u t-tielet parti aktar tard Sorsi VictoriaMetrics, jew stenna sakemm nipprepara rapporti oħra :)

Mur ottimizzazzjonijiet f'VictoriaMetrics. Alexander Valyalkin

Ejja nimxu fuq l-indiċi maqlub. Ħafna jistgħu jaħsbu li dan huwa sempliċi. Min jaf x'inhu indiċi invertit u kif jaħdem? Oh, mhux daqshekk nies aktar. Ejja nippruvaw nifhmu x'inhu.

Huwa fil-fatt sempliċi. Huwa sempliċiment dizzjunarju li jimmappa ċavetta għal valur. X'inhi ċavetta? Din il-koppja label=valuefejn label и value - dawn huma linji. U l-valuri huma sett timeseries_ids, li jinkludi l-par mogħti label=value.

Indiċi maqlub jippermettilek issib kollox malajr timeseries_ids, li taw label=value.

Jippermettilek ukoll issib malajr timeseries_ids serje tal-ħin għal diversi pari label=value, jew għall-koppji label=regexp. Kif jiġri dan? Billi ssib l-intersezzjoni tas-sett timeseries_ids għal kull par label=value.

Mur ottimizzazzjonijiet f'VictoriaMetrics. Alexander Valyalkin

Ejja nħarsu lejn diversi implimentazzjonijiet tal-indiċi maqlub. Nibdew bl-implimentazzjoni naive sempliċi. Hija tidher bħal din.

Funzjoni getMetricIDs jieħu lista ta' kordi. Kull linja fiha label=value. Din il-funzjoni tirritorna lista metricIDs.

Kif taħdem? Hawnhekk għandna varjabbli globali msejħa invertedIndex. Dan huwa dizzjunarju regolari (map), li se mmappja s-sekwenza għal slice ints. Il-linja fiha label=value.

Implimentazzjoni tal-funzjoni: tikseb metricIDs għall-ewwel label=value, imbagħad ngħaddu minn kull ħaġa oħra label=value, aħna nġibuha metricIDs għalihom. U sejjaħ il-funzjoni intersectInts, li se jiġu diskussi hawn taħt. U din il-funzjoni tirritorna l-intersezzjoni ta 'dawn il-listi.

Mur ottimizzazzjonijiet f'VictoriaMetrics. Alexander Valyalkin

Kif tistgħu taraw, l-implimentazzjoni ta 'indiċi maqlub mhix ikkumplikata ħafna. Iżda din hija implimentazzjoni naive. X'iżvantaġġi għandha? L-iżvantaġġ ewlieni tal-implimentazzjoni naive huwa li tali indiċi maqlub jinħażen fir-RAM. Wara li nibdew mill-ġdid l-applikazzjoni nitilfu dan l-indiċi. M'hemm l-ebda iffrankar ta' dan l-indiċi fuq disk. Indiċi maqlub bħal dan mhux probabbli li jkun adattat għal database.

It-tieni żvantaġġ huwa wkoll relatat mal-memorja. L-indiċi maqlub irid jidħol fir-RAM. Jekk jaqbeż id-daqs ta 'RAM, allura ovvjament se noħorġu - mill-iżball tal-memorja. U l-programm mhux se jaħdem.

Mur ottimizzazzjonijiet f'VictoriaMetrics. Alexander Valyalkin

Din il-problema tista 'tiġi solvuta bl-użu ta' soluzzjonijiet lesti bħal LevelDBJew RocksDB.

Fil-qosor, għandna bżonn database li tippermettilna nagħmlu tliet operazzjonijiet malajr.

  • L-ewwel operazzjoni hija r-reġistrazzjoni ключ-значение għal din id-database. Hija tagħmel dan malajr ħafna, fejn ключ-значение huma kordi arbitrarji.
  • It-tieni operazzjoni hija tfittxija ta 'malajr għal valur bl-użu ta' ċavetta partikolari.
  • U t-tielet operazzjoni hija tfittxija ta 'malajr għall-valuri kollha permezz ta' prefiss partikolari.

LevelDB u RocksDB - dawn id-databases ġew żviluppati minn Google u Facebook. L-ewwel daħal LevelDB. Imbagħad il-guys minn Facebook ħadu LevelDB u bdew itejbuh, għamlu RocksDB. Issa kważi d-databases interni kollha jaħdmu fuq RocksDB ġewwa Facebook, inklużi dawk li ġew trasferiti għal RocksDB u MySQL. Semmewh MyRocks.

Indiċi maqlub jista' jiġi implimentat bl-użu ta' LevelDB. Kif tagħmel dan? Aħna niffrankaw bħala ċavetta label=value. U l-valur huwa l-identifikatur tas-serje taż-żmien fejn il-par ikun preżenti label=value.

Jekk ikollna ħafna serje ta 'żmien b'par partikolari label=value, allura jkun hemm ħafna ringieli f'din id-database bl-istess ċavetta u differenti timeseries_ids. Biex tikseb lista ta 'kollha timeseries_ids, li jibdew b'dan label=prefix, nagħmlu skan tal-firxa li għaliha din id-database hija ottimizzata. Jiġifieri, nagħżlu l-linji kollha li jibdew bihom label=prefix u tikseb dak meħtieġ timeseries_ids.

Mur ottimizzazzjonijiet f'VictoriaMetrics. Alexander Valyalkin

Hawn kampjun ta' implimentazzjoni ta' kif tkun tidher f'Go. Għandna indiċi maqlub. Dan huwa LevelDB.

Il-funzjoni hija l-istess bħal għall-implimentazzjoni naive. Hija tirrepeti l-implimentazzjoni naive kważi linja b'linja. L-uniku punt huwa li minflok iduru map aħna aċċess għall-indiċi maqlub. Aħna nġibu l-valuri kollha għall-ewwel label=value. Imbagħad ngħaddu mill-pari kollha li fadal label=value u tikseb is-settijiet korrispondenti ta 'metricIDs għalihom. Imbagħad insibu l-intersezzjoni.

Mur ottimizzazzjonijiet f'VictoriaMetrics. Alexander Valyalkin

Jidher li kollox huwa tajjeb, iżda hemm żvantaġġi għal din is-soluzzjoni. VictoriaMetrics inizjalment implimentat indiċi invertit ibbażat fuq LevelDB. Imma fl-aħħar kelli nċedi.

Għaliex? Minħabba li LevelDB huwa aktar bil-mod mill-implimentazzjoni naive. F'implimentazzjoni naive, mogħtija ċavetta partikolari, aħna immedjatament irkupraw il-porzjon kollu metricIDs. Din hija operazzjoni mgħaġġla ħafna - il-porzjon kollu huwa lest għall-użu.

F'LevelDB, kull darba li tissejjaħ funzjoni GetValues trid tgħaddi mill-linji kollha li jibdew bihom label=value. U ikseb il-valur għal kull linja timeseries_ids. Ta’ tali timeseries_ids iġbor biċċa minn dawn timeseries_ids. Ovvjament, dan huwa ħafna aktar bil-mod milli sempliċement aċċess għal mappa regolari biċ-ċavetta.

It-tieni żvantaġġ huwa li LevelDB huwa miktub f'C. Is-sejħa tal-funzjonijiet C minn Go mhix veloċi ħafna. Huwa jieħu mijiet ta 'nanosekondi. Dan mhuwiex mgħaġġel ħafna, għax meta mqabbel ma 'sejħa ta' funzjoni regolari miktuba f'go, li tieħu 1-5 nanosekondi, id-differenza fil-prestazzjoni hija għexieren ta 'drabi. Għal VictoriaMetrics dan kien difett fatali :)

Mur ottimizzazzjonijiet f'VictoriaMetrics. Alexander Valyalkin

Allura ktibt l-implimentazzjoni tiegħi stess ta 'l-indiċi maqlub. U sejjaħha mergeset.

Mergeset huwa bbażat fuq l-istruttura tad-dejta MergeTree. Din l-istruttura tad-dejta hija mislufa minn ClickHouse. Ovvjament, mergeset għandu jiġi ottimizzat għal tiftix mgħaġġel timeseries_ids skond iċ-ċavetta mogħtija. Mergeset huwa miktub kollu f'Go. Inti tista tara Sorsi VictoriaMetrics fuq GitHub. L-implimentazzjoni ta' mergeset tinsab fil-folder /lib/mergeset. Tista' tipprova tara x'qed jiġri hemmhekk.

L-API mergeset hija simili ħafna għal LevelDB u RocksDB. Jiġifieri, jippermettilek li tissejvja malajr rekords ġodda hemmhekk u malajr tagħżel ir-rekords bi prefiss partikolari.

Mur ottimizzazzjonijiet f'VictoriaMetrics. Alexander Valyalkin

Aħna ser nitkellmu dwar l-iżvantaġġi ta 'mergeset aktar tard. Issa ejja nitkellmu dwar x'problemi qamu ma 'VictoriaMetrics fil-produzzjoni meta jimplimenta indiċi invertit.

Għaliex qamu?

L-ewwel raġuni hija r-rata għolja ta' ċaqliq. Tradott għar-Russu, din hija bidla frekwenti fis-serje tal-ħin. Dan huwa meta serje ta 'żmien tispiċċa u tibda serje ġdida, jew jibdew ħafna serje ta' żmien ġodda. U dan jiġri spiss.

It-tieni raġuni hija n-numru kbir ta 'serje ta' żmien. Fil-bidu, meta l-monitoraġġ kien qed jikseb popolarità, in-numru ta 'serje ta' żmien kien żgħir. Pereżempju, għal kull kompjuter għandek bżonn tissorvelja CPU, memorja, netwerk u tagħbija tad-disk. 4 serje tal-ħin għal kull kompjuter. Ejja ngħidu li għandek 100 kompjuter u 400 serje tal-ħin. Dan huwa ftit li xejn.

Maż-żmien, in-nies dehru li setgħu jkejlu informazzjoni aktar granulari. Per eżempju, kejjel it-tagħbija mhux tal-proċessur kollu, iżda separatament ta 'kull qalba tal-proċessur. Jekk għandek 40 qalba tal-proċessur, allura għandek 40 darba aktar serje ta 'żmien biex tkejjel it-tagħbija tal-proċessur.

Imma dan mhux kollox. Kull qalba tal-proċessur jista 'jkollha diversi stati, bħal idle, meta tkun idle. U taħdem ukoll fl-ispazju tal-utent, taħdem fl-ispazju tal-kernel u stati oħra. U kull stat bħal dan jista 'jitkejjel ukoll bħala serje ta' żmien separata. Dan iżid ukoll in-numru ta 'ringieli b'7-8 darbiet.

Minn metrika waħda sirna 40 x 8 = 320 metrika għal kompjuter wieħed biss. Immultiplika b'100, niksbu 32 minflok 000.

Imbagħad daħal Kubernetes. U marret għall-agħar minħabba li Kubernetes jista 'jospita ħafna servizzi differenti. Kull servizz f'Kubernetes jikkonsisti f'ħafna imżiewed. U dan kollu jeħtieġ li jiġi mmonitorjat. Barra minn hekk, għandna skjerament kostanti ta 'verżjonijiet ġodda tas-servizzi tiegħek. Għal kull verżjoni ġdida, trid tinħoloq serje ta' żmien ġdida. Bħala riżultat, in-numru ta 'serje ta' żmien jikber b'mod esponenzjali u aħna ffaċċjati bil-problema ta 'numru kbir ta' serje ta 'żmien, li tissejjaħ kardinalità għolja. VictoriaMetrics tlaħħaq magħha b'suċċess meta mqabbla ma 'databases oħra ta' serje ta 'żmien.

Mur ottimizzazzjonijiet f'VictoriaMetrics. Alexander Valyalkin

Ejja nagħtu ħarsa aktar mill-qrib lejn ir-rata għolja ta' ċaqliq. X'jikkawża rata għolja ta' ċaqliq fil-produzzjoni? Minħabba li xi tifsiriet ta 'tikketti u tikketti qed jinbidlu kontinwament.

Per eżempju, ħu Kubernetes, li għandu l-kunċett deployment, jiġifieri meta tiġi implimentata verżjoni ġdida tal-applikazzjoni tiegħek. Għal xi raġuni, l-iżviluppaturi Kubernetes iddeċidew li jżidu l-id tal-iskjerament mat-tikketta.

Għal xiex wassal dan? Barra minn hekk, ma 'kull skjerament ġdid, is-serje ta' żmien l-antik kollha jiġu interrotti, u minflokhom, serje ta 'żmien ġdida tibda b'valur ta' tikketta ġdid. deployment_id. Jista 'jkun hemm mijiet ta' eluf u anke miljuni ta 'ringieli bħal dawn.

L-importanti dwar dan kollu huwa li n-numru totali ta 'serje ta' żmien jikber, iżda n-numru ta 'serje ta' żmien li bħalissa huma attivi u li jirċievu data jibqa 'kostanti. Dan l-istat jissejjaħ rata għolja ta' lenbija.

Il-problema ewlenija ta 'rata għolja ta' ċaqliq hija li tiżgura veloċità kostanti ta 'tfittxija għas-serje ta' żmien kollha għal sett partikolari ta 'tikketti fuq ċertu intervall ta' żmien. Tipikament dan huwa l-intervall tal-ħin għall-aħħar siegħa jew l-aħħar jum.

Mur ottimizzazzjonijiet f'VictoriaMetrics. Alexander Valyalkin

Kif issolvi din il-problema? Hawn l-ewwel għażla. Dan biex jaqsam l-indiċi maqlub f'partijiet indipendenti matul iż-żmien. Jiġifieri, jgħaddi xi intervall ta 'żmien, nispiċċaw naħdmu bl-indiċi invertit kurrenti. U toħloq indiċi maqlub ġdid. Jgħaddi intervall ta’ ħin ieħor, noħolqu ieħor u ieħor.

U meta jittieħdu kampjuni minn dawn l-indiċijiet invertiti, insibu sett ta 'indiċijiet maqluba li jaqgħu fl-intervall mogħti. U, għaldaqstant, nagħżlu l-id tas-serje tal-ħin minn hemm.

Dan jiffranka r-riżorsi għaliex m'għandniex għalfejn inħarsu lejn partijiet li ma jaqgħux fl-intervall mogħti. Jiġifieri, ġeneralment, jekk nagħżlu dejta għall-aħħar siegħa, allura għal intervalli ta 'ħin preċedenti naqbżu t-talbiet.

Mur ottimizzazzjonijiet f'VictoriaMetrics. Alexander Valyalkin

Hemm għażla oħra biex issolvi din il-problema. Dan biex taħżen għal kull jum lista separata ta 'ids ta' serje ta 'żmien li seħħew f'dik il-ġurnata.

Il-vantaġġ ta’ din is-soluzzjoni fuq is-soluzzjoni preċedenti huwa li ma nidduplikawx informazzjoni tas-serje tal-ħin li ma tisparixxix maż-żmien. Huma preżenti kontinwament u ma jinbidlux.

L-iżvantaġġ huwa li soluzzjoni bħal din hija aktar diffiċli biex timplimenta u aktar diffiċli biex tiddibaggja. U VictoriaMetrics għażlet din is-soluzzjoni. Hekk ġara storikament. Din is-soluzzjoni taħdem tajjeb ukoll meta mqabbla ma 'qabel. Minħabba li din is-soluzzjoni ma ġietx implimentata minħabba l-fatt li huwa meħtieġ li tiġi duplikata data f'kull partizzjoni għal serje ta 'żmien li ma jinbidlux, jiġifieri li ma jisparixxux maż-żmien. VictoriaMetrics kienet primarjament ottimizzata għall-konsum tal-ispazju tad-disk, u l-implimentazzjoni preċedenti għamlet il-konsum tal-ispazju tad-disk agħar. Iżda din l-implimentazzjoni hija adattata aħjar biex timminimizza l-konsum tal-ispazju tad-disk, għalhekk intgħażlet.

Kelli niġġieledha. Il-ġlieda kienet li f'din l-implimentazzjoni xorta trid tagħżel numru ferm akbar timeseries_ids għad-dejta milli meta l-indiċi maqlub ikun diviż fil-ħin.

Mur ottimizzazzjonijiet f'VictoriaMetrics. Alexander Valyalkin

Kif solvejna din il-problema? Solvejna b'mod oriġinali - billi ħżin diversi identifikaturi ta' serje ta' ħin f'kull dħul ta' indiċi maqlub minflok identifikatur wieħed. Jiġifieri għandna ċavetta label=value, li jseħħ f'kull serje ta' żmien. U issa niffrankaw diversi timeseries_ids f'daħla waħda.

Hawn eżempju. Preċedentement kellna N entrati, iżda issa għandna daħla waħda li l-prefiss tagħha huwa l-istess bħall-oħrajn kollha. Għad-dħul preċedenti, il-valur fih ids kollha tas-serje taż-żmien.

Dan għamilha possibbli li tiżdied il-veloċità tal-iskannjar ta 'tali indiċi maqlub sa 10 darbiet. U ppermettilna nnaqqsu l-konsum tal-memorja għall-cache, għax issa naħżnu s-sekwenza label=value darba biss fil-cache flimkien N darbiet. U din il-linja tista 'tkun kbira jekk taħżen linji twal fit-tikketti u t-tikketti tiegħek, li Kubernetes jħobb ipoġġi hemmhekk.

Mur ottimizzazzjonijiet f'VictoriaMetrics. Alexander Valyalkin

Għażla oħra biex jitħaffef it-tiftix fuq indiċi maqlub huwa sharding. Ħolqien ta 'diversi indiċi maqluba minflok wieħed u sharding data bejniethom permezz taċ-ċavetta. Dan huwa sett key=value fwar. Jiġifieri, niksbu diversi indiċijiet invertiti indipendenti, li nistgħu nistaqsu b'mod parallel fuq diversi proċessuri. Implimentazzjonijiet preċedenti ppermettew biss tħaddim f'modalità ta 'proċessur wieħed, jiġifieri, skannjar tad-dejta fuq qalba waħda biss. Din is-soluzzjoni tippermettilek tiskennja data fuq diversi cores f'daqqa, kif jħobb jagħmel ClickHouse. Dan huwa dak li qed nippjanaw li nimplimentaw.

Mur ottimizzazzjonijiet f'VictoriaMetrics. Alexander Valyalkin

Issa ejja nerġgħu lura għan-nagħaġ tagħna - għall-funzjoni ta 'intersezzjoni timeseries_ids. Ejja nikkunsidraw x'implimentazzjonijiet jista' jkun hemm. Din il-funzjoni tippermettilek issib timeseries_ids għal sett partikolari label=value.

Mur ottimizzazzjonijiet f'VictoriaMetrics. Alexander Valyalkin

L-ewwel għażla hija implimentazzjoni naive. Żewġ linji nested. Hawnhekk irridu nġibu l-input tal-funzjoni intersectInts żewġ flieli - a и b. Fl-output, għandu jirritorna lilna l-intersezzjoni ta 'dawn il-flieli.

Implimentazzjoni naive tidher bħal din. Aħna ntennu fuq il-valuri kollha mill-porzjon a, ġewwa din il-linja ngħaddu mill-valuri kollha tal-porzjon b. U nqabbluhom. Jekk jaqblu, allura sibna intersezzjoni. U ssalvaha result.

Mur ottimizzazzjonijiet f'VictoriaMetrics. Alexander Valyalkin

X'inhuma l-iżvantaġġi? Il-kumplessità kwadratika hija l-iżvantaġġ ewlieni tagħha. Per eżempju, jekk id-dimensjonijiet tiegħek huma porzjon a и b miljun kull darba, allura din il-funzjoni qatt ma terġa 'lura tweġiba lilek. Minħabba li se jkollu bżonn jagħmel triljun iterazzjoni, li huwa ħafna anke għall-kompjuters moderni.

Mur ottimizzazzjonijiet f'VictoriaMetrics. Alexander Valyalkin

It-tieni implimentazzjoni hija bbażata fuq mappa. Noħolqu mappa. Aħna npoġġu l-valuri kollha mill-porzjon f'din il-mappa a. Imbagħad ngħaddu minn porzjon f'linja separata b. U aħna niċċekkjaw jekk dan il-valur huwiex minn porzjon b fil-mappa. Jekk teżisti, imbagħad żidha mar-riżultat.

Mur ottimizzazzjonijiet f'VictoriaMetrics. Alexander Valyalkin

X'inhuma l-benefiċċji? Il-vantaġġ huwa li hemm biss kumplessità lineari. Jiġifieri, il-funzjoni se tesegwixxi ħafna aktar malajr għal flieli akbar. Għal porzjon ta' miljun daqs, din il-funzjoni se tesegwixxi f'2 miljun iterazzjoni, għall-kuntrarju tat-triljun iterazzjoni tal-funzjoni preċedenti.

L-iżvantaġġ huwa li din il-funzjoni teħtieġ aktar memorja biex tinħoloq din il-mappa.

It-tieni żvantaġġ huwa l-overhead kbir għall-hashing. Dan l-iżvantaġġ mhuwiex ovvju ħafna. U għalina ma tantx kienet ovvja, għalhekk għall-ewwel f'VictoriaMetrics l-implimentazzjoni tal-intersezzjoni kienet permezz ta 'mappa. Iżda mbagħad il-profiling wera li l-ħin tal-proċessur prinċipali jintefaq bil-miktub fuq il-mappa u jiċċekkja l-preżenza ta 'valur f'din il-mappa.

Għaliex il-ħin tas-CPU jinħela f'dawn il-postijiet? Minħabba li Go twettaq operazzjoni ta 'hashing fuq dawn il-linji. Jiġifieri, tikkalkula l-hash taċ-ċavetta sabiex imbagħad taċċessah f'indiċi partikolari fil-HashMap. L-operazzjoni tal-kalkolu tal-hash titlesta f'għexieren ta 'nanosekondi. Dan huwa bil-mod għal VictoriaMetrics.

Mur ottimizzazzjonijiet f'VictoriaMetrics. Alexander Valyalkin

Iddeċidejt li nimplimenta bitset ottimizzat speċifikament għal dan il-każ. Hekk tidher l-intersezzjoni ta 'żewġ flieli issa. Hawnhekk noħolqu bitset. Aħna nżidu elementi mill-ewwel porzjon magħha. Imbagħad niċċekkjaw il-preżenza ta 'dawn l-elementi fit-tieni porzjon. U żidhom mar-riżultat. Jiġifieri, huwa kważi xejn differenti mill-eżempju preċedenti. L-unika ħaġa hawnhekk hija li ssostitwijna l-aċċess għall-mappa b'funzjonijiet tad-dwana add и has.

Mur ottimizzazzjonijiet f'VictoriaMetrics. Alexander Valyalkin

L-ewwel daqqa t'għajn, jidher li dan għandu jaħdem aktar bil-mod, jekk qabel kienet użata mappa standard hemmhekk, u mbagħad jissejħu xi funzjonijiet oħra, iżda l-profiling juri li din il-ħaġa taħdem 10 darbiet aktar malajr mill-mappa standard fil-każ ta 'VictoriaMetrics.

Barra minn hekk, juża ħafna inqas memorja meta mqabbel mal-implimentazzjoni tal-mappa. Minħabba li aħna qed naħżnu bits hawn minflok valuri ta 'tmien byte.

L-iżvantaġġ ta 'din l-implimentazzjoni huwa li mhuwiex daqshekk ovvju, mhux trivjali.

Żvantaġġ ieħor li ħafna jistgħu ma jinnutawx huwa li din l-implimentazzjoni tista 'ma taħdimx tajjeb f'xi każijiet. Jiġifieri, huwa ottimizzat għal każ speċifiku, għal dan il-każ ta 'intersezzjoni ta' ids ta 'serje ta' ħin VictoriaMetrics. Dan ma jfissirx li huwa adattat għall-każijiet kollha. Jekk tintuża b'mod żbaljat, mhux se jkollna żieda fil-prestazzjoni, iżda żball ta 'memorja u tnaqqis fil-prestazzjoni.

Mur ottimizzazzjonijiet f'VictoriaMetrics. Alexander Valyalkin

Ejja nikkunsidraw l-implimentazzjoni ta 'din l-istruttura. Jekk trid tfittex, tinsab fis-sorsi VictoriaMetrics, fil-folder lib/uint64set. Huwa ottimizzat speċifikament għall-każ VictoriaMetrics, fejn timeseries_id huwa valur ta' 64 bit, fejn l-ewwel 32 bit huma bażikament kostanti u l-aħħar 32 bit biss jinbidlu.

Din l-istruttura tad-dejta mhix maħżuna fuq disk, topera biss fil-memorja.

Mur ottimizzazzjonijiet f'VictoriaMetrics. Alexander Valyalkin

Hawnhekk huwa l-API tagħha. Mhuwiex ikkumplikat ħafna. L-API hija mfassla speċifikament għal eżempju speċifiku ta 'użu ta' VictoriaMetrics. Jiġifieri, m'hemm l-ebda funzjonijiet mhux meħtieġa hawn. Hawn huma l-funzjonijiet li huma espliċitament użati minn VictoriaMetrics.

Hemm funzjonijiet add, li żżid valuri ġodda. Hemm funzjoni has, li jiċċekkja għal valuri ġodda. U hemm funzjoni del, li tneħħi l-valuri. Hemm funzjoni helper len, li jirritorna d-daqs tas-sett. Funzjoni clone kloni ħafna. U l-funzjoni appendto jikkonverti dan is-sett għal slice timeseries_ids.

Mur ottimizzazzjonijiet f'VictoriaMetrics. Alexander Valyalkin

Dan huwa kif tidher l-implimentazzjoni ta 'din l-istruttura tad-dejta. sett għandu żewġ elementi:

  • ItemsCount huwa qasam helper biex jirritorna malajr in-numru ta 'elementi f'sett. Ikun possibbli li wieħed jgħaddi mingħajr dan il-qasam awżiljarju, iżda kellu jiġi miżjud hawn minħabba li VictoriaMetrics spiss jistaqsi t-tul tal-bitset fl-algoritmi tiegħu.

  • It-tieni qasam huwa buckets. Dan huwa porzjon mill-istruttura bucket32. Kull struttura taħżen hi qasam. Dawn huma t-32 bit ta 'fuq. U żewġ flieli - b16his и buckets ta ' bucket16 strutturi.

L-aqwa 16-il bit tat-tieni parti tal-istruttura 64-bit huma maħżuna hawn. U hawn bitsets huma maħżuna għas-16-il bit t'isfel ta 'kull byte.

Bucket64 tikkonsisti minn firxa uint64. It-tul huwa kkalkulat bl-użu ta 'dawn il-kostanti. F'wieħed bucket16 massimu jista 'jinħażen 2^16=65536 daqsxejn. Jekk taqsam dan bi 8, allura huwa 8 kilobytes. Jekk terġa 'taqsam bi 8, huwa 1000 uint64 tifsira. Jiġifieri Bucket16 – din hija l-istruttura tagħna ta’ 8 kilobyte.

Mur ottimizzazzjonijiet f'VictoriaMetrics. Alexander Valyalkin

Ejja nħarsu lejn kif wieħed mill-metodi ta 'din l-istruttura għaż-żieda ta' valur ġdid huwa implimentat.

Kollox jibda bi uint64 tifsiriet. Aħna nikkalkulaw it-32 bit ta 'fuq, aħna nikkalkulaw it-32 bit t'isfel. Ejja ngħaddu minn kollox buckets. Aħna nqabblu l-aqwa 32 bit f'kull barmil bil-valur miżjud. U jekk jaqblu, allura nsejħu l-funzjoni add fl-istruttura b32 buckets. U żid it-32 bit t'isfel hemmhekk. U jekk irritorna true, allura dan ifisser li żidna tali valur hemmhekk u ma kellniex tali valur. Jekk jirritorna false, allura tali tifsira diġà kienet teżisti. Imbagħad inżidu n-numru ta 'elementi fl-istruttura.

Jekk ma sibniex dak li għandek bżonn bucket bil-hi-valur meħtieġ, allura nsejħu l-funzjoni addAlloc, li se tipproduċi waħda ġdida bucket, u żżidha mal-istruttura tal-barmil.

Mur ottimizzazzjonijiet f'VictoriaMetrics. Alexander Valyalkin

Din hija l-implimentazzjoni tal-funzjoni b32.add. Huwa simili għall-implimentazzjoni preċedenti. Aħna nikkalkulaw l-iktar 16-il bit sinifikanti, l-inqas 16-il bit sinifikanti.

Imbagħad nimxu permezz tas-16-il bit ta 'fuq kollha. Insibu logħbiet. U jekk ikun hemm taqbila, insejħu l-metodu add, li se nikkunsidraw fil-paġna li jmiss għalih bucket16.

Mur ottimizzazzjonijiet f'VictoriaMetrics. Alexander Valyalkin

U hawn huwa l-iktar livell baxx, li għandu jiġi ottimizzat kemm jista 'jkun. Aħna nikkalkulaw għal uint64 valur id fil-porzjon bit u wkoll bitmask. Din hija maskra għal valur partikolari ta '64-bit, li tista' tintuża biex tiċċekkja l-preżenza ta 'dan il-bit, jew issettjaha. Aħna niċċekkjaw biex naraw jekk dan il-bit huwiex issettjat u ssettjah, u nirritorna l-preżenza. Din hija l-implimentazzjoni tagħna, li ppermettietna nħaffu l-operazzjoni ta 'ids intersectioning ta' serje ta 'żmien b'10 darbiet meta mqabbla ma' mapep konvenzjonali.

Mur ottimizzazzjonijiet f'VictoriaMetrics. Alexander Valyalkin

Minbarra din l-ottimizzazzjoni, VictoriaMetrics għandha ħafna ottimizzazzjonijiet oħra. Ħafna minn dawn l-ottimizzazzjonijiet ġew miżjuda għal raġuni, iżda wara l-profil tal-kodiċi fil-produzzjoni.

Din hija r-regola ewlenija ta 'ottimizzazzjoni - iżżidx ottimizzazzjoni jekk wieħed jassumi li se jkun hemm konġestjoni hawn, minħabba li jista' jirriżulta li mhux se jkun hemm ostakolu hemmhekk. L-ottimizzazzjoni normalment tiddegrada l-kwalità tal-kodiċi. Għalhekk, ta 'min jottimizza biss wara l-profiling u preferibbilment fil-produzzjoni, sabiex din tkun data reali. Jekk xi ħadd hu interessat, tista' tħares lejn il-kodiċi sors VictoriaMetrics u tesplora ottimizzazzjonijiet oħra li hemm.

Mur ottimizzazzjonijiet f'VictoriaMetrics. Alexander Valyalkin

Għandi mistoqsija dwar il-bitset. Simili ħafna għall-implimentazzjoni C++ vector bool, bitset ottimizzat. Ħadt l-implimentazzjoni minn hemm?

Le, mhux minn hemm. Meta implimentajt dan il-bitset, ġejt iggwidat mill-għarfien tal-istruttura ta 'dawn is-serje ta' żmien ids, li jintużaw f'VictoriaMetrics. U l-istruttura tagħhom hija tali li t-32 bit ta 'fuq huma bażikament kostanti. It-32 bit t'isfel huma suġġetti għal bidla. Iktar ma tkun baxxa l-bit, aktar ta 'spiss tista' tinbidel. Għalhekk, din l-implimentazzjoni hija speċifikament ottimizzata għal din l-istruttura tad-dejta. L-implimentazzjoni C++, safejn naf jien, hija ottimizzata għall-każ ġenerali. Jekk tottimizza għall-każ ġenerali, dan ifisser li mhux se jkun l-aħjar għal każ speċifiku.

Nagħtik ukoll parir biex tara r-rapport ta’ Alexey Milovid. Madwar xahar ilu, huwa tkellem dwar l-ottimizzazzjoni fi ClickHouse għal speċjalizzazzjonijiet speċifiċi. Jgħid biss li fil-każ ġenerali, implimentazzjoni C++ jew xi implimentazzjoni oħra hija mfassla biex taħdem tajjeb bħala medja fi sptar. Jista 'jwettaq agħar minn implimentazzjoni speċifika għall-għarfien bħal tagħna, fejn nafu li l-aqwa 32 bit huma l-aktar kostanti.

Għandi t-tieni mistoqsija. X'inhi d-differenza fundamentali minn InfluxDB?

Hemm ħafna differenzi fundamentali. F'termini ta 'prestazzjoni u konsum tal-memorja, InfluxDB fit-testijiet juri konsum ta' memorja 10 darbiet aktar għal serje ta 'żmien ta' kardinalità għolja, meta jkollok ħafna minnhom, pereżempju, miljuni. Pereżempju, VictoriaMetrics tikkonsma 1 GB għal kull miljun ringieli attivi, filwaqt li InfluxDB tikkonsma 10 GB. U dik hija differenza kbira.

It-tieni differenza fundamentali hija li InfluxDB għandu lingwi strambi ta' mistoqsijiet - Flux u InfluxQL. Mhumiex konvenjenti ħafna biex jaħdmu ma 'serje ta' ħin meta mqabbla ma ' PromQL, li hija appoġġjata minn VictoriaMetrics. PromQL hija lingwa ta' mistoqsija minn Prometheus.

U differenza oħra hija li InfluxDB għandu mudell ta 'dejta kemmxejn stramba, fejn kull linja tista' taħżen diversi oqsma b'sett differenti ta 'tikketti. Dawn il-linji huma aktar maqsuma f'diversi tabelli. Dawn il-kumplikazzjonijiet addizzjonali jikkomplikaw ix-xogħol sussegwenti ma 'din id-database. Huwa diffiċli li tappoġġja u tifhem.

F'VictoriaMetrics kollox huwa ħafna aktar sempliċi. Hemmhekk, kull serje ta' żmien hija valur ewlieni. Il-valur huwa sett ta 'punti - (timestamp, value), u ċ-ċavetta hija s-sett label=value. M'hemm l-ebda separazzjoni bejn l-oqsma u l-kejl. Jippermettilek tagħżel kwalunkwe data u mbagħad tgħaqqad, żżid, tnaqqas, timmultiplika, taqsam, b'differenza minn InfluxDB fejn il-kalkoli bejn ringieli differenti għadhom mhumiex implimentati sa fejn naf jien. Anke jekk huma implimentati, huwa diffiċli, għandek tikteb ħafna kodiċi.

Għandi mistoqsija li tiċċara. Fhimt sew li kien hemm xi tip ta' problema li tkellimt dwarha, li dan l-indiċi maqlub ma jidħolx fil-memorja, allura hemm partitioning hemm?

L-ewwel, wrejt implimentazzjoni naive ta 'indiċi maqlub fuq mappa standard ta' Go. Din l-implimentazzjoni mhix adattata għal databases minħabba li dan l-indiċi maqlub ma jiġix salvat fuq disk, u d-database trid tissejvja fuq disk sabiex din id-data tibqa’ disponibbli malli terġa’ tibda. F'din l-implimentazzjoni, meta terġa 'tibda l-applikazzjoni, l-indiċi maqlub tiegħek se jisparixxi. U int titlef l-aċċess għad-dejta kollha għax ma tkunx tista’ ssibha.

Bongu! Grazzi tar-rapport! Jisimni Pavel. Jien minn Wildberries. Għandi ftit mistoqsijiet għalik. Mistoqsija waħda. Taħseb li kieku għażilt prinċipju differenti meta tibni l-arkitettura tal-applikazzjoni tiegħek u qassejt id-dejta maż-żmien, allura forsi kont tkun tista’ taqsam id-dejta meta tkun qed tfittex, ibbażata biss fuq il-fatt li partizzjoni waħda fiha dejta għal wieħed perjodu ta 'żmien, jiġifieri, f'intervall ta' ħin wieħed u ma jkollokx għalfejn tinkwieta dwar il-fatt li l-biċċiet tiegħek huma mifruxa b'mod differenti? Mistoqsija numru 2 - peress li qed timplimenta algoritmu simili b'bitset u kull ħaġa oħra, allura forsi ppruvajt tuża struzzjonijiet tal-proċessur? Forsi ppruvajt ottimizzazzjonijiet bħal dawn?

Jiena nwieġeb it-tieni waħda mill-ewwel. Għadna ma wasalniex għal dak il-punt. Imma jekk meħtieġ, naslu hemm. U l-ewwel waħda, x'kienet il-mistoqsija?

Iddiskutejt żewġ xenarji. U qalu li għażlu t-tieni waħda b’implimentazzjoni aktar kumplessa. U ma ppreferewx l-ewwel waħda, fejn id-dejta hija maqsuma skond iż-żmien.

Iva. Fl-ewwel każ, il-volum totali tal-indiċi jkun akbar, għaliex f'kull partizzjoni jkollna naħżnu data duplikata għal dawk is-serje ta 'żmien li jkomplu permezz ta' dawn il-ħitan kollha. U jekk ir-rata ta ' churn tas-serje tal-ħin tiegħek hija żgħira, jiġifieri l-istess serje huma kontinwament użati, allura fl-ewwel każ aħna nitilfu ħafna aktar fl-ammont ta' spazju fuq disk okkupat meta mqabbel mat-tieni każ.

U għalhekk - iva, il-qsim tal-ħin huwa għażla tajba. Prometheus jużaha. Iżda Prometheus għandu żvantaġġ ieħor. Meta tgħaqqad dawn il-biċċiet ta 'dejta, jeħtieġ li żżomm fil-memorja meta informazzjoni għat-tikketti u s-serje ta' żmien kollha. Għalhekk, jekk il-biċċiet tad-dejta li tgħaqqad huma kbar, allura l-konsum tal-memorja jiżdied ħafna waqt l-għaqda, b'differenza VictoriaMetrics. Meta tgħaqqad, VictoriaMetrics ma tikkonsma memorja xejn; huma kkunsmati biss ftit kilobytes, irrispettivament mid-daqs tal-biċċiet tad-dejta magħquda.

L-algoritmu li qed tuża juża l-memorja. Hija timmarka tikketti tas-serje taż-żmien li fihom valuri. U b'dan il-mod tiċċekkja l-preżenza paired f'array ta 'data waħda u f'oħra. U tifhem jekk intersect seħħx jew le. Tipikament, id-databases jimplimentaw cursors u iterators li jaħżnu l-kontenut attwali tagħhom u jgħaddu mid-dejta magħżula minħabba l-kumplessità sempliċi ta 'dawn l-operazzjonijiet.

Għaliex ma nużawx il-cursors biex jaqsmu d-dejta?

Iva.

Aħna naħżnu ringieli magħżula f'LevelDB jew mergeset. Nistgħu nimxu l-cursor u nsibu l-intersezzjoni. Għaliex ma nużawhiex? Għax bil-mod. Minħabba li l-cursors ifissru li trid issejjaħ funzjoni għal kull linja. Sejħa ta' funzjoni hija ta' 5 nanosekondi. U jekk għandek 100 linja, allura jirriżulta li nqattgħu nofs sekonda sempliċement insejħu l-funzjoni.

Hemm ħaġa bħal din, iva. U l-aħħar mistoqsija tiegħi. Il-mistoqsija tista’ tinstema’ xi ftit stramba. Għaliex mhux possibbli li taqra l-aggregati kollha meħtieġa fil-mument li tasal id-dejta u tissejvjahom fil-forma meħtieġa? Għaliex issalva volumi kbar f'xi sistemi bħal VictoriaMetrics, ClickHouse, eċċ., u mbagħad tqatta' ħafna ħin fuqhom?

Nagħti eżempju biex nagħmilha aktar ċara. Ejja ngħidu kif jaħdem speedometer żgħir tal-ġugarell? Tirreġistra d-distanza li tkun ivvjaġġajt, il-ħin kollu żżidha ma 'valur wieħed, u t-tieni - darba. U jaqsam. U jieħu veloċità medja. Tista 'tagħmel dwar l-istess ħaġa. Żid il-fatti kollha meħtieġa fuq il-fly.

Okay, nifhem il-mistoqsija. L-eżempju tiegħek għandu postu. Jekk taf liema aggregati għandek bżonn, allura din hija l-aħjar implimentazzjoni. Iżda l-problema hija li n-nies jiffrankaw dawn il-metriċi, xi dejta f'ClickHouse u għadhom ma jafux kif se jaggregawhom u jiffiltrawhom fil-futur, għalhekk iridu jiffrankaw id-dejta mhux ipproċessata kollha. Imma jekk taf li għandek bżonn tikkalkula xi ħaġa bħala medja, allura għaliex ma tikkalkolax minflok ma taħżen mazz ta 'valuri mhux maħduma hemmhekk? Iżda dan huwa biss jekk tkun taf eżattament dak li għandek bżonn.

Mill-mod, id-databases għall-ħażna ta 'serje ta' ħin jappoġġjaw l-għadd ta 'aggregati. Per eżempju, Prometheus jappoġġja regoli ta’ reġistrazzjoni. Jiġifieri, dan jista 'jsir jekk taf liema unitajiet ser ikollok bżonn. VictoriaMetrics għadu ma għandux dan, iżda ġeneralment ikun preċedut minn Prometheus, li fih dan jista 'jsir fir-regoli tal-kodifikazzjoni mill-ġdid.

Pereżempju, f'xogħol preċedenti, kien meħtieġ li jingħadd in-numru ta 'avvenimenti f'tieqa li tiżżerżaq matul l-aħħar siegħa. Il-problema hija li kelli noħloq implimentazzjoni apposta f'Go, jiġifieri servizz għall-għadd ta 'din il-ħaġa. Dan is-servizz fl-aħħar mill-aħħar ma kienx trivjali, minħabba li huwa diffiċli li jiġi kkalkulat. L-implimentazzjoni tista 'tkun sempliċi jekk għandek bżonn tgħodd xi aggregati f'intervalli ta' ħin fissi. Jekk trid tgħodd l-avvenimenti f'tieqa li tiżżerżaq, allura mhix sempliċi kemm tidher. Naħseb li dan għadu ma ġiex implimentat f'ClickHouse jew fid-databases tas-serje taż-żmien, minħabba li huwa diffiċli li jiġi implimentat.

U mistoqsija oħra. Konna biss nitkellmu dwar il-medja, u ftakart li darba kien hemm ħaġa bħal Graphite b'backend tal-Karbonju. U kien jaf kif jnaqqas id-dejta l-qadima, jiġifieri, iħalli punt wieħed kull minuta, punt wieħed fis-siegħa, eċċ. Fil-prinċipju, dan huwa pjuttost konvenjenti jekk ikollna bżonn dejta mhux ipproċessata, relattivament, għal xahar, u kull ħaġa oħra tista ' jiġi mraqqaq. Iżda Prometheus u VictoriaMetrics ma jappoġġjawx din il-funzjonalità. Huwa ppjanat li tappoġġjaha? Jekk le, għaliex le?

Grazzi tal-mistoqsija. L-utenti tagħna jistaqsu din il-mistoqsija perjodikament. Huma jistaqsu meta se nżidu l-appoġġ għat-tnaqqis tal-kampjuni. Hemm diversi problemi hawn. L-ewwelnett, kull utent jifhem downsampling xi ħaġa differenti: xi ħadd irid jikseb kwalunkwe punt arbitrarju fuq intervall partikolari, xi ħadd irid valuri massimi, minimi, medji. Jekk ħafna sistemi jiktbu data fid-database tiegħek, allura ma tistax tgħaqqadha kollha flimkien. Jista 'jkun li kull sistema teħtieġ traqqiq differenti. U dan huwa diffiċli biex jiġi implimentat.

U t-tieni ħaġa hija li VictoriaMetrics, bħal ClickHouse, hija ottimizzata biex taħdem ma 'volumi kbar ta' dejta mhux maħduma, u għalhekk tista 'show biljun linja f'inqas minn sekonda jekk għandek ħafna qlub fis-sistema tiegħek. Punti ta 'serje ta' ħin ta 'skannjar f'VictoriaMetrics - 50 punt kull sekonda għal kull qalba. U din il-prestazzjoni tiskala għal qlub eżistenti. Jiġifieri, jekk għandek 000 qalba, pereżempju, se tiskennja biljun punt kull sekonda. U din il-proprjetà ta' VictoriaMetrics u ClickHouse tnaqqas il-ħtieġa għal downsamling.

Karatteristika oħra hija li VictoriaMetrics effettivament tikkompressa din id-dejta. Il-kompressjoni bħala medja fil-produzzjoni hija minn 0,4 sa 0,8 bytes għal kull punt. Kull punt huwa timestamp + valur. U huwa kkompressat f'inqas minn byte wieħed bħala medja.

Sergey. Għandi mistoqsija. X'inhu l-quantum tal-ħin minimu tar-reġistrazzjoni?

Millisekonda waħda. Riċentement kellna konverżazzjoni ma' żviluppaturi oħra tad-database tas-serje tal-ħin. Il-porzjon tal-ħin minimu tagħhom huwa sekonda. U fil-Graphite, per eżempju, huwa wkoll sekonda waħda. F'OpenTSDB huwa wkoll sekonda waħda. InfluxDB għandu preċiżjoni nanosekondi. F'VictoriaMetrics hija millisekonda, għax fi Prometheus hija millisekonda. U VictoriaMetrics oriġinarjament ġiet żviluppata bħala ħażna remota għal Prometheus. Imma issa tista 'tiffranka data minn sistemi oħra.

Il-persuna li tkellimt magħha tgħid li għandha preċiżjoni minn sekonda għal sekonda - dan huwa biżżejjed għalihom għax jiddependi mit-tip ta 'data li tkun qed tinħażen fid-database tas-serje taż-żmien. Jekk din hija dejta DevOps jew dejta mill-infrastruttura, fejn tiġborha f'intervalli ta '30 sekonda, kull minuta, allura t-tieni preċiżjoni hija biżżejjed, m'għandekx bżonn xejn inqas. U jekk tiġbor din id-dejta minn sistemi ta 'kummerċ ta' frekwenza għolja, allura għandek bżonn preċiżjoni tan-nanosekondi.

Il-preċiżjoni tal-millisekondi f'VictoriaMetrics hija adattata wkoll għall-każ DevOps, u tista 'tkun adattata għall-biċċa l-kbira tal-każijiet li semmejt fil-bidu tar-rapport. L-unika ħaġa li għaliha jista 'ma jkunx adattat huwa sistemi ta' kummerċ ta 'frekwenza għolja.

Grazzi! U mistoqsija oħra. X'inhi l-kompatibilità fi PromQL?

Kompatibilità sħiħa b'lura. VictoriaMetrics jappoġġja bis-sħiħ PromQL. Barra minn hekk, iżid funzjonalità avvanzata addizzjonali fi PromQL, li tissejjaħ MetricsQL. Hemm taħdita fuq YouTube dwar din il-funzjonalità estiża. Tkellimt fil-Meetup ta' Monitoraġġ fir-rebbiegħa f'San Pietruburgu.

Kanal tat-telegramma VictoriaMetrics.

Utenti reġistrati biss jistgħu jipparteċipaw fl-istħarriġ. Idħol, ta 'xejn.

X'qed iwaqqafk milli taqleb għal VictoriaMetrics bħala l-ħażna fit-tul tiegħek għal Prometheus? (Ikteb fil-kummenti, inżidha mal-votazzjoni))

  • 71,4%Jien ma nużax Prometheus5

  • 28,6%Ma kontx naf dwar VictoriaMetrics2

Ivvutaw 7 utent. 12 utenti astjenew.

Sors: www.habr.com

Żid kumment