
VictoriaMetrics â kiire ja skaleeritav andmebaas ajareal pĂ”hinevate andmete salvestamiseks ja töötlemiseks (salvestus loob aja ja sellele vastava vÀÀrtuste kogumi, nĂ€iteks andurite oleku perioodilise kĂŒsitluse vĂ”i meetmete kogumise kaudu).


Mina olen Kolobaev Pavel. DevOps, SRE, LeroyMerlin, kĂ”ik nagu kood â see on meie kĂ”igi kohta: minu ja teiste LeroyMerlin töötajate kohta.

Meil on OpenStacki baasil pilv. Seal on vÀike link tehnoloogiaradarile.

See on loodud Kubernetes'i riistvara baasil ning kÔigi OpenStacki ja logimisega seotud teenuste alusel.

Kava oli meil selline arenduse kÀigus. Kui me seda kÔike arendasime, oli meil Prometheuse operaator, kes salvestas andmeid K8si klastri sees. Ta leiab automaatselt, mida on vaja kraapida, ja kogub need enda alla, nii öelda.

KÔik andmed tuleb meil viia klaasist vÀlja, kuna kui midagi juhtub, peame mÔistma, mis ja kus on.

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

Kuid siin tekivad vÀiksed probleemid. Meie puhul algasid probleemid, kui meil oli 250 000 mÔÔtu, ja kui neid sai 400 000, mÔistsime, et me ei saa niimoodi jÀtkata. Me suurendasime scrape_timeout'i 25 sekundini.
Miks me pidime seda tegema? Prometheus hakkab ajastama timeout'i algusest pÀrast andmete vÔtmist. Ja pole tÀhtis, et andmed endiselt voolavad. Kui antud aja jooksul andmeid ei saadetud ja seanss ei suletud HTTP kaudu, siis loetakse seanss ebaÔnnestunuks ning andmed ei jÔua Prometheus'e.

Meile on tuttavad graafikud, mida saame, kui osa andmeid puudub. Graafikud on katkendlikud ja see ei rahulda meid.

JÀrgmine variant on sharding kahe erineva Prometheuse vahel sama föderatsioonimehhanismi kaudu.
NÀiteks lihtsalt vÔtta ja nimetuse jÀrgi nendest shard'id teha. Seda saab samuti kasutada, kuid me otsustasime liikuda edasi.

NĂŒĂŒd peame kuidagi neid shard'e töötlema. Saame kasutada promxy't, mis lĂ€heb shardi piirkonda ja mitmekordistab andmed. Ta töötab kahe shardi puhul nagu ĂŒhtse sisenemise punktina. Seda saab teostada promxy kaudu, kuid see on praegu liiga keeruline.

Esimene variant â soovime loobuda federation mehhanismist, kuna see on vĂ€ga aeglane.
Prometheuse arendajad ĂŒtlevad selgelt: «Poisid, kasutage teisi TimescaleDB, kuna me ei kavatse pikaajalist meetrikate salvestamist toetada». See ei ole nende ĂŒlesanne. 
Me kirjutame endale paberile ĂŒles, et me ikkagi vajame andmete vĂ€ljavĂ”ttu, et mitte hoida kĂ”ike ĂŒhes kohas.

Teine puudus â see on mĂ€lutarbimine. Jah, ma saan aru, et paljud ĂŒtlevad, et 2020. aastal paar gigabaiti mĂ€lu on ĂŒsna odav, kuid sellegipoolest.
Praegu on meil dev ja prod keskkond. Devis on see umbes 9 gigabaiti 350 000 meetrika kohta. Prodis on see veidi ĂŒle 14 gigabaiti 780 000 meetrika kohta. Sealjuures on meie retention time vaid 30 minutit. See on halb. Ja nĂŒĂŒd selgitan, miks.

Teeme arvutuse, st poolteise miljoni meetrika puhul, millega me juba peaaegu oleme, saame projekteerimise etapis 35-37 gigabaiti mÀlu. Kuid juba 4 miljoni meetrika puhul on vajalik umbes 90 gigabaiti mÀlu. See arvutati Prometheuse arendajate antud valemi jÀrgi. Me vaatasime korrelatsiooni ja mÔistsime, et me ei soovi maksta paar miljonit serveri eest, mis on lihtsalt jÀlgimiseks.
Meil ei suurene mitte ainult virtuaalmasinate arv, vaid me jÀlgime ka ise virtuaalmasinaid. SeetÔttu, mida rohkem on virtuaalmasinaid, seda rohkem on erinevaid mÔÔdikuid jne. Meil on plaanis spetsiaalne kasv meie klastris seoses mÔÔdikutega.

Ketta mahu osas pole siin kÔik sugugi masendav, kuid sooviksime parandada. Saime 15 pÀeva jooksul kokku 120 gigabaiti, millest 100 on kompressitud andmed ja 20 on kompressimata, kuid alati on soov, et see number oleks vÀiksem.

Seega lisame veel ĂŒhe punkti â see on suur ressursikasutuse tarve, mida soovime ikkagi sÀÀsta, kuna me ei taha, et meie jĂ€lgimiscluster tarbiks rohkem ressursse kui meie OpenStacki halduskolder.

Prometheusel on veel ĂŒks puudus, mille oleme enda jaoks tuvastanud, see on mingisugune mĂ€lu piirang. Prometheuse puhul on olukord palju halvem, kuna tal ei ole selliseid seadistusi ĂŒldse. Piirangu kasutamine Dockeris pole samuti variant. Kui teil juhtub olema RAF, mis on kukkunud ja seal on 20-30 gigabaiti, siis taastumine vĂ”tab vĂ€ga kaua aega.

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

Me saaksime jĂ”uda sellise skeemini. See skeem on vajalik, et korraldada HA klaster. Soovime, et meie mÔÔdikud oleksid igal ajal ja igal pool kergesti kĂ€ttesaadavad, isegi kui server, mis neid mÔÔdikuid hoiab, peaks ebaĂ”nnestuma. SeetĂ”ttu peame sellise skeemi ĂŒles ehitama.
See skeem nÀitab, et meil on shardide dubleerimine, mis toob endaga kaasa ka dubleerimise ressursside tarbimises. Seda on vÔimalik peaaegu horisontaalselt skaleerida, kuid ressursitarbimine jÀÀb siiski tohutuks.

Puudused, mille oleme jÀrjestanud, nagu oleme need vÀlja kirjutanud:
- NÔutav on mÔÔdikute eksportimine vÀljapoole.
- Suur ressursitarbimine.
- MĂ€lu tarbimist ei saa piirata.
- Kompleksne ja ressursimahukas HA rakendamine.

Oleme otsustanud, et lahkume Prometheuse andmehoidlast.
Oleme mÀÀratlenud veel mÔned tÀiendavad nÔuded, mis meile vajalikud. Need on:
- Promql toe olemasolu, kuna palju on juba kirjutatud Prometheuse pÔhjal: pÀringud, hoiatused.
- Ja siis on meil Grafana, mis on samuti kirjutatud Prometheuse tagaosas. Ei soovi juhtpaneele ĂŒmber kirjutada.
- Soovime luua korraliku HA arhitektuuri.
- Me tahame vÀhendada kÔigi ressursside tarbimist.
- On veel ĂŒks vĂ€ike nĂŒanss. Me ei saa kasutada erinevaid pilvepĂ”hiseid metoodikate kogumise sĂŒsteeme. Me ei tea, mis seal meie metoodikatesse lĂ€heb. Ja kuna sinna vĂ”ib minna absoluutselt mis tahes, peame piirama kohaliku paigalduse kasutamist.

Valik oli vÀike. Kogusime kÔik, milles meil oli kogemusi. Vaatasime Prometheuse integreerimise lehte, lugesime hulga artikleid, uurisime, mis on saadaval. Me valisime VictoriaMetricsi Prometheuse asendamiseks.
Miks? Sest:
- Toetab promql.
- Omab modulaarset arhitektuuri.
- Ei vaja muudatusi Grafanas.
- Ja mis kĂ”ige tĂ€htsam â me vĂ”ib-olla hakkame pakkuma metoodikate hoidlat oma ettevĂ”ttes teenusena, seega vaatame ette vĂ”imalike piirangute poole, et kasutajad saaksid mingil piiratud viisil kasutada kĂ”iki klastrite ressursse, kuna on vĂ”imalus, et see on multitenant.

Teeme esimesed vÔrdlused. V vÔtame sama Prometheuse klastris, millele pÀÀseb ligi vÀline Prometheus. Lisame kaudu remoteWrite VictoriaMetricsi.

Esiteks mainin, et siin mĂ€rkame vĂ€ikest tĂ”usu CPU tarbimises VictoriaMetrics'i poolt. VictoriaMetrics'i wikis on kirjas, millised seadistused sobivad kĂ”ige paremini. Me kontrollisime need ĂŒle. Need vĂ€hendasid vĂ€ga hĂ€sti CPU tarbimist.
Meie juhul ei ole Kubernetes'i klastri Prometheuse mÀlutarve oluliselt suurenenud.

VÔrdleme kahte andmeallikat samade andmete jaoks. Prometheuses nÀeme kÔiki samu puuduvaid andmeid. VictoriaMetrics'is on kÔik korras.

Testitulemused salvestusruumi osas. Prometheuses saime kokku 120 gigabaiti. VictoriaMetrics'is saame juba 4 gigabaiti pĂ€evas. Seal on natuke erinev mehhanism, kui oleme harjunud Prometheuses nĂ€gema. See tĂ€hendab, et andmed suruvad end juba ĂŒsna hĂ€sti kokku pĂ€evas, poole tunni jooksul. Nad on juba hĂ€sti kokku surutud pĂ€evas, poole tunni jooksul, hoolimata sellest, et andmeid hakatakse hiljem veel ĂŒhendama. KokkuvĂ”ttes sÀÀstsime salvestusruumilt.

Samuti sÀÀstame mĂ€luressursside kasutuses. Meil oli Prometheus testide ajal kĂ€ivitatud virtuaalmasinal â 8 tuuma, 24 gigabaiti. Prometheus tarbib praktiliselt kĂ”ik ressursid. See langes OOM Killer'i tĂ”ttu. Samal ajal tuli sisse vaid 900 000 aktiivset mÔÔdikut. See on umbes 25 000-27 000 mÔÔdikut sekundis.
VictoriaMetrics kĂ€ivitus meil kahe tuuma virtuaalmasinal, millel on 8 gigabaiti RAM-i. Ănnestus VictoriaMetrics hĂ€sti tööle panna, kohandades mĂ”ningaid seadeid 8- gigabaitises masinas. LĂ”pptulemusena mahtusime 7 gigabaiti. Samuti saime sisu edastamise kiirus, st mÔÔdikud, isegi kĂ”rgem kui Prometheusel.

CPU kasutus on vĂ”rreldes Prometheus'ega palju parem. Siin tarbib Prometheus 2,5 tuuma, samas kui VictoriaMetrics vaid 0,25 tuuma. Alguses â 0,5 tuuma. Ămberkatsete kĂ€igus tĂ”useb see ĂŒhe tuumani, kuid see juhtub ÀÀrmiselt harva.

Meie puhul langes valik VictoriaMetrics'ile arusaadavatel pÔhjustel, soovisime sÀÀsta ja ka sÀÀstsime.

Kustutame kohe kaks punkti â see on mÔÔdikutega laadimine ja suur ressursikasutus. Meil jÀÀb otsustada kaks punkti, mille eest oleme endale veel jĂ€tnud.

Siin ma ĂŒtlen kohe, et me kĂ€sitleme VictoriaMetrics'i kui mÔÔtmete salvestusseadet. Kuid kuna me kavatseme tĂ”enĂ€oliselt VictoriaMetrics'i pakkuda kogu Leroy jaoks, peame piirama neid, kes kasutatakse seda klastrit, et nad meile seda ei rikkuks.
On suurepÀrane parameeter, mis vÔimaldab piirata aega, andmemahtu ja tÀitmise aega.
Samuti on olemas suurepÀrane valik, mis vÔimaldab piirata mÀlukasutust, sellega saame leida selle tasakaalu, mis vÔimaldab meil saavutada normaalse töökiirus ja mÔÔdukas ressursikasutus.

Veel ĂŒks miinus, st kustutame punkti â ei saa piirata mĂ€lukasutust.

Esimese iteratsioonide jooksul testisime VictoriaMetrics Single Node'i. Edasi liigume VictoriaMetrics Cluster Version'i juurde.
Siin avardame oma vÔimalusi erinevate teenuste jaotamisel VictoriaMetrics'is sÔltuvalt sellest, millistel nad töötavad ja milliseid ressursse nad tarbivad. See on vÀga paindlik ja mugav lahendus. Me oleme seda ise kasutanud.

VictoriaMetrics Cluster Version'i pÔhikomponendid on vmstorage. Neid vÔib olla N arvu. Meie puhul on neid hetkel 2.
Ja on olemas vminsert. See on puhverserver, mis vÔimaldab meil: korraldada shardimist kÔigi nende salvestusruumide vahel, mille kohta oleme talle teatanud, ja see vÔimaldab hÔlbustada ka replikatsiooni, st teil on olemas nii shardimine kui ka replikatsioon.
Vminsert toetab protokolle OpenTSDB, Graphite, InfluxDB ja Prometheuse remoteWrite.

On olemas ka vmselect. Selle peamine ĂŒlesanne on minna vmstorage'i, saada sealt andmed, deduplitseerida need andmed ja edastada need kliendile.

On olemas suurepĂ€rane tööriist vmagent. Meile see vĂ€ga meeldib. See vĂ”imaldab konfigureerida tĂ€pselt nagu Prometheus ja samal ajal teha kĂ”ike nii nagu Prometheus. St see kogub erinevatelt ĂŒksustelt, teenustelt mÔÔtmeid ja saadab need vminsert'i. Edasi sĂ”ltub kĂ”ik juba teistest.

Veel ĂŒks suurepĂ€rane teenus on vmalert, mis vĂ”imaldab kasutada tagaplaanina VictoriaMetrics'i, saada andmeid vminsert'ilt ja saata need vmselect'ile töötlemiseks. Ta töötleb alarme ja reegleid. Alarme korraldame me alertmanager'i kaudu.

Meil on olemas wmauth komponent. Me plaanime seda kasutada, aga vĂ”ib-olla mitte (me pole veel selgusele jĂ”udnud), et kasutada autentimissĂŒsteemina multitenancy versioonides klastritest. See toetab remoteWrite'i Prometheusele ja suudab autoriseerida URL-i alusel, tĂ€psemalt selle teise osa alusel, kuhu saab vĂ”i ei saa kirjutada.

Seal on veel vmbackup ja vmrestore. See on pĂ”himĂ”tteliselt andmete taastamise ja varundamise sĂŒsteem. Toetab S3, GCS ja file.

Meie klastrite esialgne versioon valmis karanteeni ajal. Sellel ajal ei olnud replikatsiooni, seega meie versioon koosnes kahest erinevast ja iseseisvast klastrist, kuhu saime andmeid remoteWrite'i kaudu.

Siinkohal pean mainima, et kui me lÀksime VictoriaMetrics Single Node'ist VictoriaMetrics Cluster Version'i, siis jÀi meie ressursikasutus endiseks, st peamine oli mÀlu. Umbes niimoodi jagunesid meie andmed, st ressursikasutuse tarbimine.

Siia oli juba lisatud replikatsioon. Koondasime kĂ”ik need kokku ĂŒheks suhteliselt suureks klastriks. KĂ”ik andmed on meil nii sharditud kui ka replikatsiooniga.
Kogu kluster on varustatud N sissepÀÀsuga, st Prometheus saab andmeid lisada HAPROXY kaudu. See on meie sissepÀÀs. Ja selle kaudu on vÔimalik siseneda Grafanasse.

Meie juhul on HAPROXY ainus port, mis suunab select, insert ja muud teenused selle klustri sisse. Ăhe aadressi loomine ei olnud vĂ”imalik, seetĂ”ttu pidime tegema mitu sissepÀÀsu, kuna virtuaalmasinad, millel VictoriaMetrics-kluster töötab, asuvad erinevates tsoonides ĂŒhe ja sama pilveteenuse pakkuja juures, st mitte meie pilves, vaid vĂ€ljas.

Meil on hÀirete haldamine. Me kasutame seda. Me kasutame Prometheuse alertmanagerit. Alerte toimetame lÀbi Opsgenie ja Telegrami. Telegramis saadavad arendajad, vÔib-olla midagi tootmisest, aga rohkem on seal statistiline teave, mida insenerid vajavad. Opsgenie puhul on see kriitiline. Need on kÔned, juhtimine intsidentide korral.

Igav kĂŒsimus: âKes siis jĂ€lgib jĂ€lgimist?â. Meie puhul jĂ€lgib jĂ€lgimist monitor, kuna kasutame vmagent'i igas node'is. Ja kuna meie node'id on erinevates andmekeskustes, kasutame igas andmekeskuses oma kanalit, need on iseseisvad ja isegi kui tekib split brain, saame ikkagi hoiatusteateid. Jah, neid tuleb rohkem, aga parem on saada rohkem hoiatusteateid kui mitte ĂŒhtegi.

KokkuvÔttes lÔpetame oma nimekirja HA rakendamisega.

Tahaksin veel mĂ€rkida oma kogemust VictoriaMetrics'i kogukonnaga. See osutus vĂ€ga positiivseks. Poistel on head pöördumisoskused. Nad pĂŒĂŒavad mĂ”ista iga juhtumit, mis neile esitatakse.
Olen loonud kĂŒsimusi GitHub'is. Need lahendati vĂ€ga kiiresti. On veel paar kĂŒsimust, mis pole tĂ€ielikult suletud, kuid juba koodi pĂ”hjal nĂ€en, et see suund on töös.
Peamine valu iteratsioonide ajal oli see, et kui ma lĂŒlitasin node'i vĂ€lja, ei suutnud vminsert esimesed 30 sekundit aru saada, et backend'i ei ole. See on nĂŒĂŒd lahendatud. Ja juba hetkega korjatakse andmed kĂ”igist ĂŒlejÀÀnud node'idest ning pĂ€ring ei pea enam ootama kadunud node'i.

Soovisime mingil hetkel, et see oleks VictoriaMetrics operaator. Me oleme selle saavutanud. Praegu töötame aktiivselt VictoriaMetrics operaatori kohaliku ĂŒhenduse ĂŒlesehitamise kallal, et viia kĂ”ik ettearvutamisreeglid jms Prometheuse, kuna kasutame piisavalt aktiivselt reegleid, mis tulevad koos Prometheuse operaatoriga.
On ettepanekuid klastrite elluviimise parendamiseks. Olen kirjeldanud neid eespool.
Ja me soovime vĂ€ga downsampling'ut. Meie puhul on downsampling vajalik peamiselt trendide vaatamiseks. Ătleme nii, et ĂŒhte mÔÔdikut pĂ€eva jooksul piisab. Need trendid on vajalikud aastaks, kolmeks, viieks, kĂŒmneks aastaks. Ăks mÔÔdiku vÀÀrtus on tĂ€iesti piisav.

- Oleme kogenud valu, nagu ka mÔned meie kolleegid, Prometheuse kasutamisel.
- Oleme valinud VictoriaMetricsi.
- See skaleerub piisavalt hÀsti nii vertikaalselt kui ka horisontaalselt.
- Saame erinevad komponendid hajutada erinevatele sÔlmedele klastris, piirata neid mÀlumahtude jÀrgi, lisada mÀlu jms.
Kavatseme kasutada VictoriaMetricsi, kuna oleme sellest vĂ€ga vaimustuses. Nii oli ja nii on nĂŒĂŒd.

MÔned qr-koodid VictoriaMetricsi chati jaoks, minu kontaktid, tehnoloogiatÔukur LeroyMerlin.
Allikas: habr.com
