TSDB analĂŒĂŒs programmis Prometheus 2

TSDB analĂŒĂŒs programmis Prometheus 2

Prometheus 2 aegridade andmebaas (TSDB) on suurepÀrane nÀide insenerilahendusest, mis pakub Prometheus 2 v1-salvestusega vÔrreldes olulisi tÀiustusi andmete kogumise kiiruse, pÀringu tÀitmise ja ressursitÔhususe osas. Rakendasime Prometheus 2 Percona monitooringus ja juhtimises (PMM) ja mul oli vÔimalus mÔista Prometheus 2 TSDB toimivust. Selles artiklis rÀÀgin nende vaatluste tulemustest.

Prometheuse keskmine töökoormus

Neile, kes on harjunud tegelema ĂŒldotstarbeliste andmebaasidega, on tĂŒĂŒpiline Prometheuse töökoormus ĂŒsna huvitav. Andmete kogumise kiirus kipub olema stabiilne: tavaliselt saadavad teie jĂ€lgitavad teenused ligikaudu sama palju mÔÔdikuid ja infrastruktuur muutub suhteliselt aeglaselt.
TeabepĂ€ringud vĂ”ivad pĂ€rineda erinevatest allikatest. MĂ”ned neist, nĂ€iteks hoiatused, pĂŒĂŒdlevad ka stabiilse ja prognoositava vÀÀrtuse poole. Teised, nĂ€iteks kasutajate taotlused, vĂ”ivad pĂ”hjustada sarivĂ”tte, kuigi enamiku töökoormuste puhul see nii ei ole.

Koormustesti

Testimisel keskendusin andmete kogumise vĂ”imele. Juurutasin Prometheus 2.3.2, mis on kompileeritud Go 1.10.1-ga (PMM 1.14 osana) Linode'i teenuses, kasutades jĂ€rgmist skripti: StackScript. KĂ”ige realistlikuma koormuse genereerimiseks kasutage seda StackScript KĂ€ivitasin mitu MySQL sĂ”lme reaalse koormusega (Sysbench TPC-C Test), millest igaĂŒks emuleeris 10 sĂ”lme. Linux/MySQL.
KÔik jÀrgmised testid viidi lÀbi Linode serveris, millel oli kaheksa virtuaaltuuma ja 32 GB mÀlu ning mis kÀivitas 20 koormussimulatsiooni, mis jÀlgis kahtsada MySQL-i eksemplari. VÔi Prometheuse terminites 800 sihtmÀrki, 440 kraapimist sekundis, 380 tuhat kirjet sekundis ja 1,7 miljonit aktiivset aegrida.

Disain

Traditsiooniliste andmebaaside, sealhulgas Prometheus 1.x-i poolt kasutatavate andmebaaside tavaline lĂ€henemisviis on mĂ€lu piirang. Kui koormuse kĂ€sitsemiseks sellest ei piisa, kogete suurt latentsust ja mĂ”ned taotlused ebaĂ”nnestuvad. Prometheus 2 mĂ€lukasutust saab konfigureerida vĂ”tmega storage.tsdb.min-block-duration, mis mÀÀrab, kui kaua salvestusi enne kettale loputamist mĂ€llu hoitakse (vaikimisi on 2 tundi). Vajalik mĂ€lumaht sĂ”ltub neto sissetulevasse voogu lisatud aegridade, siltide ja kriimustuste arvust. Kettaruumi osas on Prometheuse eesmĂ€rk kasutada 3 baiti kirje (nĂ€idise) kohta. Teisest kĂŒljest on mĂ€lunĂ”uded palju suuremad.

Kuigi ploki suurust on vÔimalik konfigureerida, ei ole soovitatav seda kÀsitsi konfigureerida, nii et olete sunnitud andma Prometheusele nii palju mÀlu, kui see teie töökoormuse jaoks nÔuab.
Kui sissetuleva mÔÔdikuvoo toetamiseks pole piisavalt mÀlu, kukub Prometheus mÀlust vÀlja vÔi jÔuab OOM-i tapja selleni.
Vahetusfunktsiooni lisamine krahhi edasilĂŒkkamiseks, kui Prometheuse mĂ€lu saab otsa, ei aita tegelikult kaasa, sest selle funktsiooni kasutamine pĂ”hjustab plahvatuslikku mĂ€lutarbimist. Ma arvan, et see on midagi pistmist Go-ga, selle prĂŒgikogujaga ja sellega, kuidas see vahetustega tegeleb.
Veel ĂŒks huvitav lĂ€henemine on konfigureerida peaplokk nii, et see loputatakse kettale teatud ajahetkel, selle asemel, et seda protsessi algusest peale lugeda.

TSDB analĂŒĂŒs programmis Prometheus 2

Nagu graafikult nĂ€ha, toimub loputus kettale iga kahe tunni tagant. Kui muudate parameetri min-block-duration vÀÀrtuseks ĂŒks tund, siis lĂ€htestatakse neid iga tund, alates poole tunni pĂ€rast.
Kui soovite kasutada seda ja muid graafikuid oma Prometheuse installis, saate seda kasutada armatuurlaud. See oli mÔeldud PMM-i jaoks, kuid sobib vÀikeste muudatustega igasse Prometheuse paigaldusse.
Meil on mĂ€llu salvestatud aktiivne plokk nimega head block; vanemate andmetega plokid on saadaval aadressil mmap(). See vĂ€listab vajaduse vahemĂ€lu eraldi konfigureerida, kuid tĂ€hendab ka seda, et peate jĂ€tma operatsioonisĂŒsteemi vahemĂ€lu jaoks piisavalt ruumi, kui soovite pĂ€rida andmeid, mis on vanemad, kui peaplokk mahutab.
See tĂ€hendab ka seda, et Prometheuse virtuaalmĂ€lu tarbimine tundub ĂŒsna suur, mis pole pĂ”hjust muretsemiseks.

TSDB analĂŒĂŒs programmis Prometheus 2

Veel ĂŒks huvitav disainipunkt on WAL-i kasutamine (logi ette kirjutamine). Nagu salvestusdokumentatsioonist nĂ€ha, kasutab Prometheus krahhide vĂ€ltimiseks WAL-i. Konkreetsed mehhanismid andmete sĂ€ilivuse tagamiseks ei ole kahjuks hĂ€sti dokumenteeritud. Prometheuse versioon 2.3.2 loputab WAL-i kettale iga 10 sekundi jĂ€rel ja seda valikut ei saa kasutaja konfigureerida.

Tihendamine

Prometheus TSDB on loodud nagu LSM-i (logistruktuuride ĂŒhendamise) pood: peaplokk loputatakse perioodiliselt kettale, samas kui tihendusmehhanism ĂŒhendab mitu plokki kokku, et vĂ€ltida pĂ€ringute ajal liiga paljude plokkide skannimist. Siin nĂ€ete plokkide arvu, mida ma pĂ€rast pĂ€eva laadimist testsĂŒsteemis jĂ€lgisin.

TSDB analĂŒĂŒs programmis Prometheus 2

Kui soovite poe kohta lisateavet, vÔite uurida faili meta.json, mis sisaldab teavet saadaolevate plokkide ja nende tekkimise kohta.

{
       "ulid": "01CPZDPD1D9R019JS87TPV5MPE",
       "minTime": 1536472800000,
       "maxTime": 1536494400000,
       "stats": {
               "numSamples": 8292128378,
               "numSeries": 1673622,
               "numChunks": 69528220
       },
       "compaction": {
               "level": 2,
               "sources": [
                       "01CPYRY9MS465Y5ETM3SXFBV7X",
                       "01CPYZT0WRJ1JB1P0DP80VY5KJ",
                       "01CPZ6NR4Q3PDP3E57HEH760XS"
               ],
               "parents": [
                       {
                               "ulid": "01CPYRY9MS465Y5ETM3SXFBV7X",
                               "minTime": 1536472800000,
                               "maxTime": 1536480000000
                       },
                       {
                               "ulid": "01CPYZT0WRJ1JB1P0DP80VY5KJ",
                               "minTime": 1536480000000,
                               "maxTime": 1536487200000
                       },
                       {
                               "ulid": "01CPZ6NR4Q3PDP3E57HEH760XS",
                               "minTime": 1536487200000,
                               "maxTime": 1536494400000
                       }
               ]
       },
       "version": 1
}

Tihendamine Prometheuses on seotud ajaga, mil peaplokk kettale loputatakse. Sel hetkel saab teha mitu sellist toimingut.

TSDB analĂŒĂŒs programmis Prometheus 2

NÀib, et tihendamine ei ole mingil viisil piiratud ja vÔib kÀivitamise ajal pÔhjustada suuri ketta sisend-/vÀljundpiike.

TSDB analĂŒĂŒs programmis Prometheus 2

CPU koormuse hĂŒpped

TSDB analĂŒĂŒs programmis Prometheus 2

Loomulikult mĂ”jutab see sĂŒsteemi kiirust ĂŒsna negatiivselt ja esitab LSM-salvestusele ka tĂ”sise vĂ€ljakutse: kuidas tihendada, et toetada kĂ”rgeid pĂ€ringumÀÀrasid ilma liigseid ĂŒldkulusid tekitamata?
PÀris huvitav tundub ka mÀlu kasutamine tihendusprotsessis.

TSDB analĂŒĂŒs programmis Prometheus 2

NÀeme, kuidas pÀrast tihendamist muutub enamik mÀlust oleku vahemÀllu salvestatud olekust vabaks: see tÀhendab, et potentsiaalselt vÀÀrtuslik teave on sealt eemaldatud. Huvitav, kas seda siin kasutatakse fadvice() vÔi mÔni muu minimeerimistehnika vÔi on pÔhjus selles, et vahemÀlu vabanes tihendamise kÀigus hÀvinud plokkidest?

Taastumine pÀrast ebaÔnnestumist

EbaÔnnestumisest taastumine vÔtab aega ja seda mÔjuval pÔhjusel. Sissetuleva miljoni salvestuse voo jaoks sekundis pidin ootama umbes 25 minutit, kuni taastamine toimus, vÔttes arvesse SSD-draivi.

level=info ts=2018-09-13T13:38:14.09650965Z caller=main.go:222 msg="Starting Prometheus" version="(version=2.3.2, branch=v2.3.2, revision=71af5e29e815795e9dd14742ee7725682fa14b7b)"
level=info ts=2018-09-13T13:38:14.096599879Z caller=main.go:223 build_context="(go=go1.10.1, user=Jenkins, date=20180725-08:58:13OURCE)"
level=info ts=2018-09-13T13:38:14.096624109Z caller=main.go:224 host_details="(Linux 4.15.0-32-generic #35-Ubuntu SMP Fri Aug 10 17:58:07 UTC 2018 x86_64 1bee9e9b78cf (none))"
level=info ts=2018-09-13T13:38:14.096641396Z caller=main.go:225 fd_limits="(soft=1048576, hard=1048576)"
level=info ts=2018-09-13T13:38:14.097715256Z caller=web.go:415 component=web msg="Start listening for connections" address=:9090
level=info ts=2018-09-13T13:38:14.097400393Z caller=main.go:533 msg="Starting TSDB ..."
level=info ts=2018-09-13T13:38:14.098718401Z caller=repair.go:39 component=tsdb msg="found healthy block" mint=1536530400000 maxt=1536537600000 ulid=01CQ0FW3ME8Q5W2AN5F9CB7R0R
level=info ts=2018-09-13T13:38:14.100315658Z caller=web.go:467 component=web msg="router prefix" prefix=/prometheus
level=info ts=2018-09-13T13:38:14.101793727Z caller=repair.go:39 component=tsdb msg="found healthy block" mint=1536732000000 maxt=1536753600000 ulid=01CQ78486TNX5QZTBF049PQHSM
level=info ts=2018-09-13T13:38:14.102267346Z caller=repair.go:39 component=tsdb msg="found healthy block" mint=1536537600000 maxt=1536732000000 ulid=01CQ78DE7HSQK0C0F5AZ46YGF0
level=info ts=2018-09-13T13:38:14.102660295Z caller=repair.go:39 component=tsdb msg="found healthy block" mint=1536775200000 maxt=1536782400000 ulid=01CQ7SAT4RM21Y0PT5GNSS146Q
level=info ts=2018-09-13T13:38:14.103075885Z caller=repair.go:39 component=tsdb msg="found healthy block" mint=1536753600000 maxt=1536775200000 ulid=01CQ7SV8WJ3C2W5S3RTAHC2GHB
level=error ts=2018-09-13T14:05:18.208469169Z caller=wal.go:275 component=tsdb msg="WAL corruption detected; truncating" err="unexpected CRC32 checksum d0465484, want 0" file=/opt/prometheus/data/.prom2-data/wal/007357 pos=15504363
level=info ts=2018-09-13T14:05:19.471459777Z caller=main.go:543 msg="TSDB started"
level=info ts=2018-09-13T14:05:19.471604598Z caller=main.go:603 msg="Loading configuration file" filename=/etc/prometheus.yml
level=info ts=2018-09-13T14:05:19.499156711Z caller=main.go:629 msg="Completed loading of configuration file" filename=/etc/prometheus.yml
level=info ts=2018-09-13T14:05:19.499228186Z caller=main.go:502 msg="Server is ready to receive web requests."

Taastamisprotsessi peamine probleem on suur mÀlutarbimine. Vaatamata sellele, et tavaolukorras suudab server sama mÀlumahuga stabiilselt töötada, ei pruugi krahhi korral OOM-i tÔttu taastuda. Ainus lahendus, mille leidsin, oli andmete kogumise keelamine, serveri avamine, taaskÀivitamine ja taaskÀivitamine, kui kogumine on lubatud.

Soojendama

Teine kÀitumine, mida soojenduse ajal meeles pidada, on seos madala jÔudluse ja suure ressursikulu vahel kohe pÀrast starti. MÔne, kuid mitte kÔigi kÀivituste ajal tÀheldasin protsessori ja mÀlu tÔsist koormust.

TSDB analĂŒĂŒs programmis Prometheus 2

TSDB analĂŒĂŒs programmis Prometheus 2

MĂ€lukasutuse lĂŒngad nĂ€itavad, et Prometheus ei saa kĂ”iki kogusid algusest peale konfigureerida ja osa teabest lĂ€heb kaotsi.
Ma pole tÀpseid pÔhjuseid kÔrge protsessori ja mÀlu koormuse jaoks vÀlja selgitanud. Kahtlustan, et see on tingitud uute aegridade loomisest peaplokis kÔrge sagedusega.

CPU koormuse tÔusud

Lisaks tihendustele, mis tekitavad ĂŒsna suure I/O koormuse, mĂ€rkasin iga kahe minuti jĂ€rel tĂ”siseid naelu protsessori koormuses. Pursked on pikemad, kui sisendvoog on suur ja nĂ€ib olevat pĂ”hjustatud Go prĂŒgikogujast, kusjuures vĂ€hemalt mĂ”ned sĂŒdamikud on tĂ€ielikult laetud.

TSDB analĂŒĂŒs programmis Prometheus 2

TSDB analĂŒĂŒs programmis Prometheus 2

Need hĂŒpped polegi nii tĂ€htsusetud. NĂ€ib, et kui need juhtuvad, muutuvad Prometheuse sisemine sisestuspunkt ja mÔÔdikud kĂ€ttesaamatuks, pĂ”hjustades samadel ajaperioodidel andmelĂŒnki.

TSDB analĂŒĂŒs programmis Prometheus 2

Samuti vĂ”ite mĂ€rgata, et Prometheuse eksportija lĂŒlitub ĂŒheks sekundiks vĂ€lja.

TSDB analĂŒĂŒs programmis Prometheus 2

VĂ”ime mĂ€rgata seoseid prĂŒgiveoga (GC).

TSDB analĂŒĂŒs programmis Prometheus 2

JĂ€reldus

Prometheus 2 TSDB on kiire, ĂŒsna tagasihoidliku riistvara abil vĂ”imeline kĂ€sitlema miljoneid aegridu ja samal ajal tuhandeid kirjeid sekundis. CPU ja ketta I/O kasutamine on samuti muljetavaldav. Minu nĂ€ide nĂ€itas kuni 200 000 mÔÔdikut sekundis kasutatud tuuma kohta.

Laiendamise planeerimiseks peate meeles pidama piisavat mĂ€lumahtu ja see peab olema tĂ”eline mĂ€lu. Kasutatud mĂ€lumaht, mida ma tĂ€heldasin, oli umbes 5 GB sissetuleva voo 100 000 kirje kohta sekundis, mis koos operatsioonisĂŒsteemi vahemĂ€luga andis umbes 8 GB hĂ”ivatud mĂ€lu.

Muidugi on protsessori ja ketaste I/O naelu taltsutamisega veel palju tööd teha ja see pole ĂŒllatav, arvestades, kui noor TSDB Prometheus 2 on vĂ”rreldes InnoDB, TokuDB, RocksDB, WiredTigeriga, kuid neil kĂ”igil oli sarnane probleeme nende elutsĂŒkli alguses.

Allikas: www.habr.com

Ostke DDoS-kaitsega saitide jaoks usaldusvÀÀrne hostimine, VPS VDS-serverid đŸ”„ Osta usaldusvÀÀrne veebimajutus DDoS-kaitsega, VPS VDS serverid | ProHoster