VictoriaMetrics minangka DBMS sing cepet lan bisa diukur kanggo nyimpen lan ngolah data ing wangun seri wektu (cathetan kasusun saka wektu lan sakumpulan nilai sing cocog karo wektu iki, contone, dipikolehi liwat polling periodik saka status sensor utawa koleksi metrik).
Jenengku Kolobaev Pavel. DevOps, SRE, LeroyMerlin, kabeh kaya kode - kabeh babagan kita: babagan aku lan karyawan LeroyMerlin liyane.
Ana maya adhedhasar OpenStack. Ana pranala cilik menyang radar teknis.
Iki dibangun ing hardware Kubernetes, uga ing kabeh layanan sing gegandhengan kanggo OpenStack lan logging.
Iki minangka skema sing ana ing pembangunan. Nalika kita ngembangake kabeh iki, kita duwe operator Prometheus sing nyimpen data ing kluster K8s dhewe. Dheweke kanthi otomatis nemokake apa sing kudu digosok lan dilebokake ing sangisore sikile, kira-kira.
Kita kudu mindhah kabeh data ing njaba kluster Kubernetes, amarga yen ana kedadeyan, kita kudu ngerti apa lan ing ngendi.
Solusi pisanan yaiku nggunakake federasi nalika kita duwe Prometheus pihak katelu, nalika kita menyang cluster Kubernetes liwat mekanisme federasi.
Nanging ana sawetara masalah cilik ing kene. Ing kasus kita, masalah diwiwiti nalika kita duwe 250 metrik, lan nalika ana 000 metrik, kita nyadari yen kita ora bisa kerja kaya ngono. Kita tambah scrape_timeout nganti 400 detik.
Yagene kita kudu nindakake iki? Prometheus wiwit ngetung wektu entek saka awal pager. Ora Matter yen data isih mili. Yen sajrone wektu sing ditemtokake data kasebut ora digabung lan sesi ora ditutup liwat http, banjur sesi kasebut dianggep gagal lan data kasebut ora mlebu ing Prometheus dhewe.
Saben uwong ngerti grafik sing kita entuk nalika sawetara data ilang. Jadwal ambruk lan kita ora seneng karo iki.
Opsi sabanjure yaiku sharding adhedhasar rong Prometheus sing beda liwat mekanisme federasi sing padha.
Contone, mung njupuk lan beling kanthi jeneng. Iki uga bisa digunakake, nanging kita mutusaké kanggo nerusake.
Saiki kita kudu ngolah shards iki piye wae. Sampeyan bisa njupuk promxy, kang menyang wilayah shard lan multiplies data. Kerjane karo rong shards minangka titik entri siji. Iki bisa dileksanakake liwat promxy, nanging isih angel banget.
Pilihan pisanan yaiku kita pengin ninggalake mekanisme federasi amarga alon banget.
Pangembang Prometheus kanthi jelas ujar, "Guys, gunakake TimescaleDB sing beda amarga kita ora bakal ndhukung panyimpenan jangka panjang metrik." Iki dudu tugase.
Kita nulis ing selembar kertas sing isih kudu dibongkar ing njaba, supaya ora nyimpen kabeh ing sak panggonan.
Kekurangan kapindho yaiku konsumsi memori. Ya, aku ngerti manawa akeh sing bakal ujar manawa ing taun 2020 sawetara gigabyte memori regane sen, nanging isih.
Saiki kita duwe lingkungan dev lan prod. Ing dev kira-kira 9 gigabyte kanggo 350 metrik. Ing prod iku 000 gigabyte lan luwih saka 14 metrik. Ing wektu sing padha, wektu retensi mung 780 menit. Iki ala. Lan saiki aku bakal nerangake apa.
Kita nggawe pitungan, yaiku, kanthi siji lan setengah yuta metrik, lan kita wis cedhak karo dheweke, ing tahap desain entuk memori 35-37 gigabyte. Nanging wis 4 yuta metrik mbutuhake udakara 90 gigabyte memori. Yaiku, diwilang nggunakake rumus sing diwenehake dening pangembang Prometheus. Kita nyawang korélasi lan nyadari yen kita ora pengin mbayar sawetara yuta kanggo server mung kanggo ngawasi.
Kita ora mung nambah jumlah mesin, kita uga ngawasi mesin virtual dhewe. Mulane, luwih akeh mesin virtual, luwih akeh metrik saka macem-macem jinis, lan sapiturute.
Kanthi papan disk, ora kabeh dadi ala, nanging aku pengin nambah. Kita nampa total 15 gigabyte sajrone 120 dina, yaiku 100 data sing dikompres, 20 data sing ora dikompres, nanging kita pengin luwih sithik.
Patut, kita nulis siji titik liyane - iki konsumsi gedhe saka sumber daya, kang isih arep kanggo nyimpen, amarga kita ora pengin kluster ngawasi nggunakake sumber daya liyane saka klompok kita, kang ngatur OpenStack.
Ana siji liyane drawback saka Prometheus, kang wis dikenali kanggo awake dhewe, iki paling sawetara jinis watesan memori. Kanthi Prometheus, kabeh luwih elek ing kene, amarga ora ana twists kaya ngono. Nggunakake watesan ing docker uga ora dadi pilihan. Yen dumadakan RAF sampeyan ambruk lan ana 20-30 gigabyte, iku bakal njupuk wektu dawa banget kanggo munggah.
Iki minangka alesan liyane kenapa Prometheus ora cocog kanggo kita, yaiku kita ora bisa mbatesi konsumsi memori.
Iku bakal bisa kanggo nggawe rencana kuwi. We kudu rencana iki kanggo ngatur klompok HA. Kita pengin metrik kita tansah kasedhiya lan ing endi wae, sanajan server sing nyimpen metrik kasebut kacilakan. Lan kanthi mangkono kita kudu mbangun skema kasebut.
Skema iki ujar manawa kita bakal duwe duplikasi pecahan, lan, kanthi mangkono, duplikasi biaya sumber daya sing dikonsumsi. Iku bisa scaled meh horisontal, nanging Nanging konsumsi sumber daya bakal neraka.
Kerugian ing urutan ing wangun sing kita nulis kanggo awake dhewe:
- Mbutuhake pangunggahan metrik eksternal.
- Konsumsi sumber daya dhuwur.
- Ora ana cara kanggo matesi konsumsi memori.
- Implementasi HA rumit lan sumber daya intensif.
Kanggo awake dhewe, kita mutusake yen kita pindhah saka Prometheus minangka fasilitas panyimpenan.
Kita wis nemtokake syarat tambahan kanggo awake dhewe sing dibutuhake. Iki:
- Iki minangka dhukungan promql, amarga akeh perkara sing wis ditulis kanggo Prometheus: pitakon, tandha.
- Banjur kita duwe Grafana, sing wis ditulis kanthi cara sing padha kanggo Prometheus minangka backend. Aku ora pengin nulis ulang dashboard.
- Kita pengin mbangun arsitektur HA normal.
- Kita pengin nyuda konsumsi sumber daya apa wae.
- Ana nuansa cilik liyane. Kita ora bisa nggunakake macem-macem jinis sistem koleksi metrik awan. Kita durung ngerti apa sing bakal ana ing metrik kasebut. Lan amarga ana apa wae sing bisa mabur ing kana, kita kudu mbatesi panggonan lokal.
Ana sethitik pilihan. We diklumpukake kabeh kita wis pengalaman karo. Kita ndeleng kaca Prometheus ing bagean integrasi, maca pirang-pirang artikel, lan ndeleng apa sing ana ing kana. Lan kanggo awake dhewe, kita milih VictoriaMetrics minangka pengganti Prometheus.
Kenging punapa? Amarga:
- Bisa nggawe promql.
- Ana arsitektur modular.
- Ora mbutuhake owah-owahan ing Grafana.
- Lan sing paling penting, kita bisa uga nyedhiyakake panyimpenan metrik ing perusahaan kita minangka layanan, mula kita ngarep-arep babagan watesan macem-macem jinis supaya pangguna bisa nggunakake kabeh sumber daya kluster kanthi cara sing winates, amarga ana kemungkinan. sing bakal multitenancy.
Ayo nggawe perbandingan pisanan. We njupuk Prometheus padha nang kluster, njaba Prometheus menyang. Tambah liwat remoteWrite VictoriaMetrics.
Aku bakal langsung nggawe leladen sing kene kita kejiret Tambah sethitik ing konsumsi CPU saka VictoriaMetrics. Wiki VictoriaMetrics ngandhani paramèter sing paling apik. We mriksa wong. Padha wis suda konsumsi CPU banget uga.
Ing kasus kita, konsumsi memori Prometheus, sing dumunung ing kluster Kubernetes, ora nambah sacara signifikan.
Kita mbandhingake rong sumber data saka data sing padha. Ing Prometheus kita ndeleng data sing padha ilang. Kabeh apik ing VictoriaMetrics.
Hasil tes ruang disk. Kita ing Prometheus nampa total 120 gigabyte. Ing VictoriaMetrics, kita wis nampa 4 gigabyte saben dina. Ana mekanisme sing rada beda tinimbang sing biasa kita deleng ing Prometheus. Tegese, data kasebut wis dikompres kanthi apik sajrone sedina, sajrone setengah jam. Sawijining dina, ing setengah jam, dheweke wis panen kanthi apik, sanajan data kasebut bakal ilang mengko. Akibaté, kita disimpen ing papan disk.
Kita uga nyimpen ing konsumsi sumber daya memori. Ing wektu tes, Prometheus dipasang ing mesin virtual - 8 intine, 24 gigabyte. Prometheus mangan meh kabeh. Dheweke tiba ing OOM Killer. Ing wektu sing padha, mung 900 metrik aktif sing diwutahake. Iki kira-kira 000-25 metrik per detik.
Kita mlayu VictoriaMetrics ing mesin virtual dual-inti karo 8 gigabyte RAM. Kita bisa nggawe VictoriaMetrics bisa digunakake kanthi apik kanthi muter sawetara perkara ing mesin 8GB. Ing pungkasan, kita nyimpen nganti 7 gigabyte. Ing wektu sing padha, kacepetan pangiriman konten, yaiku metrik, malah luwih dhuwur tinimbang Prometheus.
CPU wis dadi luwih apik dibandhingake Prometheus. Ing kene Prometheus nggunakake 2,5 intine, lan VictoriaMetrics mung nggunakake 0,25 intine. Ing wiwitan - 0,5 intine. Nalika gabung, tekan siji inti, nanging iki arang banget, arang banget.
Ing kasus kita, pilihan kasebut ana ing VictoriaMetrics amarga alasan sing jelas; kita pengin ngirit dhuwit lan kita nindakake.
Ayo nyabrang rong titik langsung - unggahan metrik lan konsumsi sumber daya sing dhuwur. Lan kita mung kudu mutusake rong poin sing isih ana kanggo awake dhewe.
Ing kene aku bakal nggawe reservasi langsung, kita nganggep VictoriaMetrics minangka panyimpenan metrik. Nanging wiwit kita paling kamungkinan bakal nyedhiyani VictoriaMetrics minangka panyimpenan kanggo kabeh Leroy, kita kudu matesi sing bakal nggunakake kluster iki supaya padha ora menehi kanggo kita.
Ana parameter apik sing ngidini sampeyan mbatesi wektu, volume data lan wektu eksekusi.
Ana uga pilihan banget sing ngidini kita mbatesi konsumsi memori, saéngga kita bisa nemokake imbangan banget sing bakal ngidini kita entuk kacepetan operasi normal lan konsumsi sumber daya sing cukup.
Minus siji titik liyane, yaiku nyabrang titik kasebut - sampeyan ora bisa mbatesi konsumsi memori.
Ing iterasi pisanan, kita nyoba VictoriaMetrics Single Node. Sabanjure kita pindhah menyang VictoriaMetrics Cluster Version.
Ing kene kita duwe tangan gratis kanggo misahake layanan sing beda ing VictoriaMetrics gumantung saka apa sing bakal ditindakake lan sumber daya apa sing bakal dikonsumsi. Iki minangka solusi sing fleksibel lan trep. Kita nggunakake iki kanggo awake dhewe.
Komponen utama VictoriaMetrics Cluster Version yaiku vmstsorage. Bisa uga ana nomer N. Ing kasus kita, ana 2 nganti saiki.
Lan ana vminsert. Iki minangka server proxy sing ngidini kita: ngatur sharding antarane kabeh panyimpenan sing kita critakake, lan uga ngidini replika, yaiku sampeyan bakal duwe sharding lan replika.
Vminsert ndhukung protokol OpenTSDB, Graphite, InfluxDB lan remoteWrite saka Prometheus.
Ana uga vmselect. Tugas utamane yaiku pindhah menyang vmstorage, nampa data saka wong-wong mau, deduplicate data iki lan menehi menyang klien.
Ana bab apik sing disebut vmagent. Kita seneng banget karo dheweke. Iki ngidini sampeyan ngatur persis kaya Prometheus lan isih nindakake kabeh kaya Prometheus. Yaiku, ngumpulake metrik saka entitas lan layanan sing beda-beda lan dikirim menyang vminsert. Banjur kabeh gumantung sampeyan.
layanan gedhe liyane vmalert, sing ngijini sampeyan kanggo nggunakake VictoriaMetrics minangka backend a, nampa data diproses saka vminsert lan ngirim menyang vmselect. Iku proses tandha dhewe, uga aturan. Ing kasus tandha, kita nampa tandha liwat alertmanager.
Ana komponen wmauth. Kita bisa utawa ora (kita durung mutusake babagan iki) nggunakake minangka sistem wewenang kanggo versi multitenancy kluster. Ndhukung remotWrite kanggo Prometheus lan bisa menehi wewenang adhedhasar url, utawa bagean liya, ing ngendi sampeyan bisa nulis utawa ora bisa nulis.
Ana uga vmbackup, vmrestore. Iki, ing intine, pemugaran lan serep kabeh data. Bisa S3, GCS, file.
Pengulangan pertama kluster kita digawe nalika karantina. Ing wektu iku, ora ana replika, mula iterasi kita kalebu rong klompok sing beda lan independen sing ditampa data liwat remoteWrite.
Ing kene aku bakal nggawe reservasi yen nalika kita ngalih saka VictoriaMetrics Single Node menyang VictoriaMetrics Cluster Version, kita isih tetep nganggo sumber daya sing padha, yaiku sing utama yaiku memori. Iki kira-kira carane data kita, yaiku konsumsi sumber daya, disebarake.
Replika wis ditambahake ing kene. Kita gabungke kabeh iki dadi siji kluster sing relatif gedhe. Kabeh data kita loro sharded lan replicated.
Kluster kabeh duwe titik entri N, yaiku Prometheus bisa nambah data liwat HAPROXY. Ing kene kita duwe titik entri iki. Lan liwat titik entri iki sampeyan bisa mlebu saka Grafana.
Ing kasus kita, HAPROXY minangka siji-sijine port sing milih proxy, nglebokake lan layanan liyane ing kluster iki. Ing kasus kita, ora bisa nggawe siji alamat; kita kudu nggawe sawetara titik mlebu, amarga mesin virtual dhewe sing digunakake kluster VictoriaMetrics dumunung ing zona sing beda saka panyedhiya awan sing padha, yaiku ora ing njero awan, nanging ing njaba. .
Kita wis alerting. Kita nggunakake. Kita nggunakake alertmanager saka Prometheus. Kita nggunakake Opsgenie lan Telegram minangka saluran pangiriman tandha. Ing Telegram padha pour saka dev, Mungkin soko saka prod, nanging biasane soko statistik, needed dening engineers. Lan Opsgenie kritis. Iki minangka telpon, manajemen insiden.
Pitakonan langgeng: "Sapa sing ngawasi?" Ing kasus kita, ngawasi ngawasi ngawasi dhewe, amarga kita nggunakake vmagent ing saben simpul. Lan amarga simpul kita disebarake ing pusat data sing beda saka panyedhiya sing padha, saben pusat data duwe saluran dhewe, padha mandhiri, lan sanajan otak pamisah teka, kita isih bakal nampa tandha. Ya, bakal ana luwih akeh, nanging luwih becik nampa tandha luwih akeh tinimbang ora ana.
Kita mungkasi dhaptar kanthi implementasi HA.
Lan luwih aku pengin nyathet pengalaman sesambungan karo komunitas VictoriaMetrics. Ternyata positif banget. Wong lanang iku responsif. Dheweke nyoba nyelidiki saben kasus sing ditawakake.
Aku miwiti masalah ing GitHub. Padha ditanggulangi kanthi cepet. Ana sawetara masalah liyane sing ora rampung ditutup, nanging aku wis bisa ndeleng saka kode sing bisa ing arah iki lagi ditindakake.
Pain utama kanggo kula sak iterasi ana yen aku mati simpul, banjur kanggo pisanan 30 detik vminsert ora bisa ngerti sing ana backend. Iki saiki wis diputusake. Lan secara harfiah ing detik utawa loro, data dijupuk saka kabeh simpul sing isih ana, lan panjalukan mandheg ngenteni simpul sing ilang.
Ing sawetara titik, kita pengin VictoriaMetrics dadi operator VictoriaMetrics. Kita ngenteni dheweke. Saiki kita aktif mbangun kerangka kanggo operator VictoriaMetrics kanggo njupuk kabeh aturan pra-pitung, etc. Prometheus, amarga kita cukup aktif nggunakake aturan sing teka karo operator Prometheus.
Ana usulan kanggo nambah implementasine cluster. Aku mbatesi wong-wong mau ing ndhuwur.
Lan aku pancene pengin downsample. Ing kasus kita, downsampling dibutuhake khusus kanggo ndeleng tren. Kira-kira, siji metrik cukup kanggo kula sak dina. Tren kasebut dibutuhake kanggo setahun, telung, lima, sepuluh taun. Lan siji nilai metrik cukup cukup.
- Kita ngerti rasa lara, kaya sawetara kolega, nalika nggunakake Prometheus.
- Kita milih VictoriaMetrics kanggo awake dhewe.
- Iku timbangan cukup apik loro vertikal lan horisontal.
- Kita bisa disebaraké komponen beda kanggo nomer beda kelenjar ing kluster, matesi dening memori, nambah memori, etc.
Kita bakal nggunakake VictoriaMetrics ing omah amarga kita seneng banget. Iki sing ana lan apa sing wis dadi.
Sawetara kode QR kanggo obrolan VictoriaMetrics, kontakku, radar teknis LeroyMerlin.
Source: www.habr.com