
VictoriaMetrics â kiire ja skaleeritav andmebaas ajaseeria andmete salvestamiseks ja töötlemiseks (salvestamine koosneb ajast ja sellele ajale vastavatest vÀÀrtustest, nĂ€iteks, mis saadakse senzorite oleku perioodilise jĂ€lgimise vĂ”i meetrite kogumise kĂ€igus).


Minu nimi on Kolobajev Pavel. DevOps, SRE, LeroyMerlin, kĂ”ik nagu kood â see on kĂ”ik meie kohta: minu ja teiste LeroyMerlini töötajate kohta.

Seal on OpenStacki pÔhine pilv. Seal on vÀike link tehnilistele radaritele.

See on ĂŒles ehitatud Kubernetes'i riistvara pĂ”hjal, samuti kĂ”igi OpenStack'i ja logimisega seotud teenuste pĂ”hjal.

Kavand oli meil selline arendamisel. Kui me seda arendasime, oli meil Prometheuse operaator, mis salvestas andmeid K8si klastris. See leidis automaatselt, mida tuleb skrabida ja ladustas selle enda alla, nii rÀÀkides.

KÔik andmed peab me tÔstma vÀlja Kubernetes'i klastri piiridest, sest kui midagi juhtub, peame saama aru, mis ja kus asub.

Esimene lahendus â kasutame federaatsiooni, kui meil on kolmas osaline Prometheus, kui me pÀÀseme Kubernetes'i klastrisse federaatsiooni mehhanismi kaudu.

Aga siin tekivad vÀiksed probleemid. Meie puhul algasid probleemid, kui meil oli 250 000 mÔÔdikut, ja kui see kasvas 400 000 mÔÔdikuni, mÔistsime, et niimoodi ei saa töötada. Suurendasime scrape_timeout'i 25 sekundini.
Miks me pidime seda tegema? Prometheus hakkab aegumist loendama alates andmete vÔtmise algusest. Ja pole vahet, et andmed veel voolavad. Kui selle mÀÀratud ajavahemiku jooksul andmed ei ole valatud ja seanss ei ole http kaudu suletud, loetakse seanss ebaÔnnestunuks ja andmed ei jÔua Prometheusse.

KÔigile on tuttavad graafikud, mida saame, kui osa andmeid puudub. Graafikud on katkised ja see ei sobi meile.

JĂ€rgmine variant â see on shardimine kahe erineva Prometheuse pĂ”hjal sama federaatsiooni mehhanismi kaudu.
NÀiteks, lihtsalt vÔtta ja jagada neid nime jÀrgi. Seda saab ka kasutada, kuid me otsustasime liikuda edasi.

Me peame nĂŒĂŒd neid sharde kuidagi töötlema. VĂ”ime kasutada promxy't, mis lĂ€heb shard'i alale ja mitmekordistab andmeid. See töötab kahe shardi puhul nagu ĂŒhe sissepÀÀsu punkt. Seda saab rakendada promxy kaudu, kuid praegu on see liiga keeruline.

Esimene variant â me tahame loobuda federaatsiooni mehhanismist, kuna see on vĂ€ga aeglane.
Prometheuse arendajad ĂŒtlevad selgelt: âPoisid, kasutage teisi TimescaleDB-sid, sest me ei hakka pikaajalist metoodika toetamaâ. See ei ole nende ĂŒlesanne. 
Me kirjutame endale paperile, et meil on ikkagi vajalik eksport vĂ€lja, et mitte hoida kĂ”ike ĂŒhes kohas.

Teine puudus on mĂ€lu tarbimine. Jah, ma saan aru, et paljud ĂŒtlevad, et 2020. aastal paar gigabaiti mĂ€lu on odav, kuid siiski.
Praegu on meil dev- ja prod-keskkond. Dev-is on see umbes 9 gigabaiti 350 000 meetrika kohta. Prod-is on see veidi ĂŒle 14 gigabaidi 780 000 meetrika kohta. Samal ajal on meie sĂ€ilitamise aeg vaid 30 minutit. See on halb. Ja nĂŒĂŒd selgitan, miks.

Teeme arvutusi, st 1,5 miljoni meetrika juures, kuna oleme juba sellele lĂ€hedal, saame projekteerimise etapis 35â37 gigabaiti mĂ€lu. Kuid 4 miljoni meetrika puhul on vajaminev mĂ€lu juba umbes 90 gigabaiti. See on arvutatud Prometheuse arendajate esitatud valemi alusel. Me vaatasime korrelatsiooni ja mĂ”istsime, et me ei soovi maksta paar miljonit serveri eest, mis on mĂ”eldud vaid jĂ€lgimiseks.
Meie masinate arv ei suurene mitte ainult, vaid jÀlgime ka virtuaalseid masinaid. Seega, mida rohkem on virtuaalseid masinaid, seda rohkem on erinevaid meetrikaid jne. Meie klastrite kasv meetrikate osas on eriline.

Kettaruumi osas ei ole olukord ĂŒldse nii halb, kuid tahaksime paraneda. Saime 15 pĂ€evaga kokku 120 gigabaiti, millest 100 on tihendatud andmed ja 20 on tihendamata andmed, kuid alati tahaks vĂ€hem.

Seega kirjutame veel ĂŒhe punkti â see on suur ressursi tarbimine, mida tahaksime siiski sÀÀsta, sest me ei soovi, et meie jĂ€lgimisklastri ressursid ĂŒletaksid meie OpenStacki halduskeskkonna ressursse.

Prometheuse puhul oleme avastanud veel ĂŒhe puuduse, mis on mingi mĂ€lu piiramise puudumine. Prometheuse puhul on olukord palju halvem, kuna tal ei ole selliseid reguleerimisi ĂŒldse. Piirangu seadmine Dockeris ei ole samuti variant. Kui teie RAF kukub ja seal on 20â30 gigabaiti, siis taastumine kestab vĂ€ga kaua.

See on veel ĂŒks pĂ”hjus, miks Prometheus meile ei sobi, st mĂ€lu tarbimist ei saa piirata.

Me vÔiksime vÀlja töötada sellise skeemi. See skeem on vajalik, et organiseerida HA klastrit. Soovime, et meie mÔÔdikud oleksid alati ja kÔikjal kergesti kÀtte saadavad, isegi kui server, mis neid mÔÔdikuid hoiab, kukub alla. Seega peame ehitama just sellise skeemi.
See skeem nÀitab, et meil on shardide dubleerimine ja seega ka dubleerimine kasutatavate ressursside kuludes. Seda on vÔimalik peaaegu horisontaalselt skaleerida, kuid ressursside tarbimine jÀÀb siiski vÀga kÔrgeks.

Puudused, nagu me neid endale kirja panime:
- On vajalik mÔÔdikute eksportimine vÀlja.
- Suure tarbimisega ressursid.
- MĂ€lu tarbimist ei saa piirata.
- Kompaktne ja ressursohutu HA rakendamine.

Oleme otsustanud, et loobume Prometheusest andmehoidjana.
Meil on veel tÀiendavad nÔudmised, mis on vajalikud. Need on:
- Toetust promql, kuna palju on juba kirjutatud Prometheuse alla: pÀringud, hoiatused.
- Ja meil on Grafana, mis on samuti kirjutatud Prometheuse tagaplaanina. Me ei taha armatuurlaudu ĂŒmber kirjutada.
- Soovime ĂŒles ehitada korraliku HA arhitektuuri.
- Soovime vÀhendada igasuguste ressursside tarbimist.
- On veel ĂŒks vĂ€ike nĂŒanss. Me ei saa kasutada mitmesuguseid pilvesĂŒsteeme mÔÔdikute kogumiseks. Me ei tea, mis meie mÔÔdikutesse satub. Kuna sinna vĂ”ib sattuda mis tahes, peame piirduma kohalikuga.

Valik oli ĂŒsna vĂ€ike. Me kogusime kĂ”ik, millel meil oli kogemus. Vaatasime Prometheuse integratsiooni lehte, lugesime palju artikleid ja uurisime, mis kĂ”ik on olemas. Valisime VictoriaMetrics'i Prometheuse asendajana.
Miks? Sest:
- Toetab promql.
- On modulaarne arhitektuur.
- Ei vaja muudatusi Grafanas.
- Ja kÔige tÀhtsam - me vÔime pakkuda mÔÔdikute hoidlat oma ettevÔtte sees teenusena, seega vaatame ette, et piirame eri viisil, et kasutajad saaksid mingis piiratud mahus kasutada kÔiki klastrite ressursse, kuna on tÔenÀosus, et see on multitenant.

Teeme esimesi vÔrdlusi. VÔtame sama Prometheuse klastris, millele pÀÀseb juurde vÀline Prometheus. Lisame remoteWrite'i kaudu VictoriaMetrics'i.

Koheselt ĂŒtlen, et siin jĂ€lgime vĂ€ikest tĂ”usu CPU kasutuses VictoriaMetrics'i poolt. VictoriaMetrics'i wikis on kirjas, millised parameetrid sobivad paremini. Me oleme need ĂŒle kontrollinud. Nad vĂ€hendasid CPU kasutust vĂ€ga tĂ”husalt.
Meie puhul ei tÔusnud Kuberneteses töötava Prometheuse mÀlu kasutus mÀrkimisvÀÀrselt.

VÔrdleme kahte andmeallikat samadele andmetele. Prometheuses nÀeme endiselt kÔiki samu puudulikke andmeid. VictoriaMetrics'is on kÔik korras.

Testide tulemused ketasruumi osas. Prometheuses saime kokku 120 gigabaiti. VictoriaMetrics'is saame juba 4 gigabaiti pĂ€evas. Seal on veidi erinev mehhanism, kui oleme harjunud nĂ€gema Prometheuses. T. e. andmed pressitakse ĂŒsna hĂ€sti kokku pĂ€eva ja poole tunni jooksul. Need on juba hĂ€sti kokku pressitud, vaatamata sellele, et hiljem liidetakse andmed kokku. LĂ”ppkokkuvĂ”ttes sÀÀstsime ketasruumis.

Samuti sÀÀstame mĂ€luressursside kasutuses. Meie Prometheus oli testide ajal kĂ€ivitatud virtuaalmasinas â 8 tuuma, 24 gigabaiti. Prometheus kasutab praktiliselt kogu ressursi. See langes OOM Killer'i tĂ”ttu. Selle all oli vaid 900 000 aktiivset mÔÔdikut. See on umbes 25 000-27 000 mÔÔdikut sekundis.
VictoriaMetrics oli meil kÀivitatud kahetuumalisel virtuaalmasinal, kus oli 8 gigabaiti RAM-i. Me suutsime VictoriaMetrics'i hÀsti tööle panna, keerates mÔningaid asju 8-gigabaitisel masinal. LÔppkokkuvÔttes mahtusime 7 gigabaiti. Seejuures saime sisu edastuskiiruselt, t. e. mÔÔdikute, isegi kÔrgema tulemuse kui Prometheusel.

CPU osas on olukord oluliselt parem vĂ”rreldes Prometheusega. Siin kasutab Prometheus 2,5 tuuma, VictoriaMetrics aga vaid 0,25 tuuma. Alguses â 0,5 tuuma. Ăhinemise kĂ€igus vĂ”ib see tĂ”usta kuni ĂŒhe tuumana, kuid see on ÀÀrmiselt haruldane.

Meie puhul langes valik VictoriaMetrics'i kasuks arusaadavatel pÔhjustel, soovisime sÀÀsta ja olime edukad.

Koheselt vĂ€listame kaks punkti â see on mÔÔdikute vĂ€ljavedu ja suur ressursihulk. Meil jÀÀb lahendada kaks punkti, mille oleme endale veel jĂ€tnud.

Siin mainin kohe, et kÀsitleme VictoriaMetrics'i mÔÔdikute salvestusruumina. Kuna pakume tÔenÀoliselt VictoriaMetrics'i salvestusruumina kogu Leroy'le, peame piirama neid, kes seda klastrit kasutavad, et nad seda meile mitte kinni keeraks.
On olemas suurepÀrane parameeter, mis vÔimaldab aega, andmemahtu ja tÀitmise aega piirata.
Samuti on olemas suurepÀrane valik, mis vÔimaldab piirata mÀlutarbimist, tÀnu millele saame leida tasakaalu, mis tagab normaalse töö kiirus ja mÔistliku ressursikasutuse.

Veel ĂŒks miinus, st peale kriipsutame punkti - mĂ€lutarbimist ei saa piirata.

Esimestes iteratsioonides katsetasime VictoriaMetrics Single Node'i. Edasi liikume VictoriaMetrics Cluster versiooni juurde.
Siin on meil avatud kÀed erinevate teenuste hajutamiseks VictoriaMetricsis, sÔltuvalt sellest, mis neid kÀitama hakkab ja milliseid ressursse need kasutavad. See on vÀga paindlik ja mugav lahendus. Oleme seda ise kasutanud.

VictoriaMetrics Cluster versiooni peamised komponendid on vmstorage. Neid vÔib olla N arv. Meie korral on neid hetkel kaks.
Ja on olemas vminsert. See on vahe-server, mis vÔimaldab meil: korraldada shardimist kÔigi nende storage'ide vahel, kellest me talle rÀÀkisime, ja see vÔimaldab ka replikatsiooni, st teil on nii shardimine kui ka replikatsioon.
Vminsert toetab protokolle OpenTSDB, Graphite, InfluxDB ja remoteWrite Prometheuse jaoks.

On olemas ka vmselect. Selle peamine ĂŒlesanne on kĂŒlastada vmstorage'i, saada sealt andmed, dedupeerida need andmed ja anda need klientidele.

On olemas suurepÀrane asi nimelt vmagent. Meile see vÀga meeldib. See vÔimaldab konfigureerida tÀpselt nagu Prometheus ja samas teha kÔike tÀpselt nagu Prometheus. St see kogub erinevatelt objektidelt, teenustelt mÔÔdikud ja saadab need vminsert'i. Edasi sÔltub kÔik juba teistest.

Veel ĂŒks suurepĂ€rane teenus on vmalert, mis vĂ”imaldab kasutada taustteenusena VictoriaMetrics'i, saada andmeid vminsert'ilt ja saata neid vmselect'ile töödeldud andmete vormis. See kĂ€sitleb nii alarme kui ka reegleid. Alarmide korral saame meie alarmi lĂ€bi alertmanager'i.

On olemas komponent wmauth. Meil on see vĂ”ib-olla kasutusele vĂ”tmiseks, aga vĂ”ib-olla ka mitte (me pole sellega veel kindlaks teinud) multitenancy klastrite versiooni autoriseerimissĂŒsteemina. See toetab remoteWrite'i Prometheuse jaoks ja vĂ”ib autoriseerida url'i pĂ”hjal, tĂ€psemalt selle teise osa pĂ”hjal, kuhu teil on lubatud vĂ”i keelatud kirjutada.

On olemas ka vmbackup, vmrestore. Need on tegelikult kÔigi andmete taastamine ja varukoopia tegemine. Toetab S3, GCS, fail.

Meie klastrite esimene iteratsioon toimus karantiini ajal. Sel hetkel ei olnud replikatsiooni, nii et meie iteratsioon koosnes kahest erinevast ja iseseisvast klastrist, kust saime remoteWrite'i kaudu andmeid.

Siinkohal olgu mĂ€rgitud, et kui me lĂ€ksime ĂŒle VictoriaMetrics Single Node'ilt VictoriaMetrics Cluster Versionile, jĂ€ime me ikkagi samadele tarbimisressurssidele, st peamine on mĂ€lu. Umbes selliselt jaotusid meie andmed, st ressursside tarbimine.

Siin oli juba lisatud replika. Koondasime kĂ”ik selle ĂŒhe suhteliselt suure klastrina. KĂ”ik meie andmed jagunevad ja replikatsioon toimub.
Kogu klastril on N sisenemise punkti, st Prometheus saab andmeid lisada lÀbi HAPROXY. Siin on meie sisenemise punkt. Ja selle sisenemispunkti kaudu saab siseneda Grafanasse.

Meie puhul on HAPROXY ainus port, mis edastab select, insert ja teised teenused sisse selle klastrisse. Meie puhul ei olnud vĂ”imalik luua ĂŒhte aadressi, pidime looma mitu sisenemispunkti, kuna VictoriaMetrics klastrit haldavad virtuaalmasinad asuvad erinevates meie pilvepakkuja tsoonides, st mitte meie pilves, vaid vĂ€ljas.

Meil on hĂ€irete sĂŒsteem. Me kasutame seda. Kasutame alertmanagerit Prometheuse poolt. HĂ€irete edastuskanalina kasutame Opsgeniet ja Telegrami. Telegrami kaudu tulevad teated arendajatelt, vĂ”ib-olla ka midagi tootmisest, kuid rohkem on seal statistilisi andmeid, mis on inseneridele vajalikud. Opsgenie puhul on see kriitiline. Need on telefonikĂ”ned, juhtimine intsidentide puhul.

Igavene kĂŒsimus: "Kwho monitors the monitoring?". Meie puhul jĂ€lgib jĂ€lgimist monitoring ise, kuna kasutame vmagent'i igas sĂ”lmes. Kuna meie sĂ”lmed on erinevates andmekeskustes ĂŒhe pakkuja juures, siis igas andmekeskuses on meil oma kanal ja need on iseseisvad, isegi kui peaks tulema split brain, saame siiski hĂ€ireid. Jah, neid tuleb rohkem, aga parem saada rohkem hĂ€ireid kui mitte ĂŒhtegi.

LÔpetame meie nimekirja HA rakendamisega.

Ja veel tahaksin rĂ”hutada oma kogemust VictoriaMetrics kogukonnaga. See on olnud vĂ€ga positiivne. Mehed on abivalmid. Nad pĂŒĂŒavad sĂŒĂŒbida igasse juhtumisse, mis esitatakse.
Olen avanud kĂŒsimusi GitHubis. Need lahendati vĂ€ga kiiresti. On veel mĂ”ned kĂŒsimused, mis ei ole tĂ€ielikult suletud, kuid juba koodist nĂ€en, et selle suunas töötamine kĂ€ib.
Peamine valu iteratsioonide ajal minu jaoks oli see, et kui ma node'i vĂ€lja lĂŒlitasin, siis esimese 30 sekundi jooksul ei suutnud vminsert mĂ”ista, et backend'i ei ole. See on nĂŒĂŒd juba lahendatud. Ja sĂ”na otseses mĂ”ttes ĂŒhe vĂ”i kahe sekundi jooksul saadakse andmed kĂ”ikidest ĂŒlejÀÀnud node'idest ning pĂ€ring lĂ”petab ooteaja selle puuduvate node'i ees.

Me tahtsime mingil hetkel, et see oleks VictoriaMetrics'i operaator. Me ootasime seda. Praegu töötab meil aktiivselt VictoriaMetrics'i operaatori kohalike kohanduste loomine, et vÔtta kÔik eel-arvutamisreeglid jne. Prometheus, kuna me kasutame piisavalt aktiivselt reegleid, mis tulevad koos Prometheuse operaatoriga.
On ettepanekuid klastrite rakenduse parandamiseks. Esitasin need eelnevalt.
Ja vĂ€ga tahaks downsampling'ut. Meie puhul on downsampling vajalik ainult trendide vaatamiseks. Ătleme nii, et ĂŒhe mÔÔdiku kohta piisab pĂ€evaseks kasutamiseks. Need trendid vajavad vaatamist aastaks, kolmeks, viieks, kĂŒmneks aastaks. Ja ĂŒhe mÔÔdiku vÀÀrtus on tĂ€iesti piisav.

- Me olime kogenud valu, nagu ka mÔned meie kolleegid, Prometheuse kasutamisel.
- Me valisime endale VictoriaMetrics'i.
- See skaleerub ĂŒsna hĂ€sti nii vertikaalselt kui ka horisontaalselt.
- Saame erinevad komponendid jagada erinevate node'ide vahel klastris, piirata neid mÀlumahtude jÀrgi, lisada mÀlu jne.
Kasutame VictoriaMetrics'i, kuna see meeldis meile vĂ€ga. Siin on, mis oli ja mis on nĂŒĂŒd.

MÔned QR-koodid VictoriaMetrics'i chati jaoks, minu kontaktid, LeroyMerlin'i tehnoloogiaradar.
Allikas: habr.com
