TSDB analĂŒĂŒs Prometheus 2-s

TSDB analĂŒĂŒs Prometheus 2-s

Ajaandmete baas (TSDB, time series database) Prometheus 2-s on suurepĂ€rane nĂ€ide insenerilahendusest, mis pakub mĂ€rkimisvÀÀrseid parandusi vĂ”rreldes v2 hoiustamisega Prometheus 1-s andmete kogumise ja pĂ€ringute tĂ€itmise kiirusel ning ressursside kasutamise efektiivsusel. Oleme rakendanud Prometheus 2 Percona Monitoring and Management (PMM) sĂŒsteemis ja mul oli vĂ”imalus uurida Prometheus 2 TSDB tulemuslikkust. Selles artiklis rÀÀgin nende tĂ€helepanekute tulemustest.

Keskmine Prometheuse koormus

Neile, kes on harjunud töötama tavaliste andmebaasidega, on Prometheuse harilik koormus ĂŒsna huvitav. Andmete kogumise kiirus pĂŒĂŒdleb stabiilse vÀÀrtuse poole: tavaliselt saadavad jĂ€relevalvetavad teenused umbes sama hulga meetrikaid ja infrastruktuur muutub suhteliselt aeglaselt.
Teavet vĂ”ivad kĂŒsida erinevad allikad. MĂ”ned neist, nĂ€iteks teatised, pĂŒĂŒdlevad samuti stabiilse ja etteennustava vÀÀrtuse poole. Teised, nagu kasutajapĂ€ringud, vĂ”ivad pĂ”hjustada kĂ”rgete koormuse tĂ”usu, kuid see ei ole tĂŒĂŒpiline suurema osa koormuse jaoks.

Koormustest

Testimise kĂ€igus keskendusin andmete kogumise vĂ”imele. KĂ€ivitasin Prometheus 2.3.2, mille on koostanud Go 1.10.1 (osa PMM 1.14), teenuses Linode, kasutades seda skripti: StackScript. Maksimaalseks realistlikuks koormuse genereerimiseks, selle abil StackScript kĂ€ivitasin mitu MySQL-i sĂ”lme tegeliku koormusega (Sysbench TPC-C Test), millest igaĂŒks emuleeris 10 Linuxi/MySQL sĂ”lme.
Kogu jÀrgmised testid viidi lÀbi Linode serveris, kus on kaheksa virtuaalset tuuma ja 32 GB mÀlu, kus oli kÀivitatud 20 koormuse simuleerimist kaheksasaja MySQL instantsi jÀlgimiseks. VÔi, Prometheuse terminoloogias, 800 sihti (targets), 440 kogumist (scrapes) sekundis, 380 tuhat kirjet (samples) sekundis ja 1,7 miljonit aktiivset ajaseeriat.

Disain

TavapĂ€rane lĂ€henemine traditsioonilistes andmebaasides, sealhulgas see, mida kasutas Prometheus 1.x, seisneb mĂ€lu piirangus. Kui seda ei ole piisavalt, et koormust taluda, kohtate suuri viivitusi ning mĂ”ni pĂ€ring ei tule tĂ€idetud. Prometheus 2 mĂ€lu kasutamine on konfigureeritud lĂ€bi vĂ”tme storage.tsdb.min-block-duration, mis mÀÀrab, kui kaua salvestusi hoitakse mĂ€lus enne kettale kirjutamist (vaikimisi 2 tundi). Vajaminev mĂ€lu sĂ”ltub ajalisest jĂ€rjestusest, siltidest (labels) ja andmete kogumise intensiivsusest (scrapes), samuti puhtast sisenevast voost. Ketaste mahutavuse osas pĂŒĂŒab Prometheus kasutada 3 baiti salvestuse (sample) kohta. Teisest kĂŒljest on mĂ€lunĂ”udmised palju kĂ”rgemad.

Kuigi blokki suuruse konfigureerimine on vÔimalik, ei ole soovitatav seda kÀsitsi seadistada, mistÔttu peate andma Prometheusele nii palju mÀlu, kui ta teie koormuse jaoks palub.
Kui mÀlu ei piisa sissetulevate mÔÔdikute hoidmiseks, kukub Prometheus vÀlja, kuna mÀlu on otsas vÔi tapab OOM killer.
Swap'i lisamine mĂ€lukao hetke edasilĂŒkkamiseks ei aita eriti, sest selle funktsiooni kasutamine pĂ”hjustab mĂ€lu plahvatuslikku tarbimist. Arvan, et probleem on Go-s, selle rĂ€mpsvaba (garbage collector) ja selles, kuidas see swapiga töötab.
Teine huvitav lÀhenemine on seadistada head blocki lÀhtestamine kettale kindlal ajal, selle asemel et arvestada seda protsessi kÀivitamise ajast.

TSDB analĂŒĂŒs Prometheus 2-s

Nagu nĂ€ete graafikult, toimuvad kettale lĂ€htestamised iga kahe tunni tagant. Kui muudate parameetri min-block-duration ĂŒheks tunniks, toimuvad need lĂ€htestamised iga tunni tagant, alates poole tunni pĂ€rast.
Kui soovite seda ja teisi graafikuid oma Prometheuse paigalduses kasutada, saate kasutada seda dashboardi. See on vÀlja töötatud PMM-i jaoks, kuid vÀikeste muudatustega sobib see mis tahes Prometheuse paigaldusse.
Meil on aktiivne plokk, mida nimetatakse head blockÂŽiks, mis on salvestatud mĂ€llu; vanemad andmeplokid on saadaval kaudu mmap(). See kĂ”rvaldab vajaduse eraldi vahemĂ€lu konfiguratsiooni jĂ€rele, kuid tĂ€hendab ka, et peate jĂ€tma piisavalt ruumi operatsioonisĂŒsteemi vahemĂ€luks, kui soovite kĂŒsida andmeid, mis on vanemad kui need, mida head block mahutab.
See tĂ€hendab ka, et Prometheuse virtuaalmĂ€lu tarbimine nĂ€eb vĂ€lja ĂŒsna kĂ”rge, millest ei tasu muretseda.

TSDB analĂŒĂŒs Prometheus 2-s

Veel huvitav disainitegur on WAL (write ahead log) kasutamine. Nagu on nĂ€ha hoiustamise dokumentatsioonist, kasutab Prometheus WAL-i, et vĂ€ltida andmete kadumist sĂŒsteemi kokkuhangetega. Kahjuks on konkreetseid andmete elujĂ”udmise tagamise mehhanisme ebapiisavalt dokumenteeritud. Prometheus 2.3.2 versioon kirjutab WAL-i kettale iga 10 sekundi jĂ€rel ja seda seadistust ei saa kasutaja muuta.

Kompaktsused (Compactions)

Prometheuse TSDB on projekteeritud LSM-hoidla (Log Structured Merge) pĂ”hjal: peaklassi kirjutatakse perioodiliselt kettale, samal ajal kui kompaktsioonimehhanism liidab mitu plokki kokku, et vĂ€ltida liiga paljude plokkide skaneerimist pĂ€ringute kĂ€igus. Siin on nĂ€ha plokkide arvu, mida ma oma testimis sĂŒsteemis ĂŒhe pĂ€eva koormuse jĂ€rel jĂ€lgisin.

TSDB analĂŒĂŒs Prometheus 2-s

Kui soovite rohkem teada hoidlast, saate uurida faili meta.json, kus on teavet olemasolevate 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
}

Prometheuses tehingud on seotud peahaarde ploki kirjutamise ajaga. Sel hetkel vÔib toimuda mitu sellist operatsiooni.

TSDB analĂŒĂŒs Prometheus 2-s

Tundub, et tihendite tegemine ei ole mingil viisil piiratud ja need vÔivad pÔhjustada suuri diskikÔrge I/O tÔuse nende teostamisel.

TSDB analĂŒĂŒs Prometheus 2-s

CPU koormuse tÔusud

TSDB analĂŒĂŒs Prometheus 2-s

Muidugi mĂ”jutab see sĂŒsteemi töökiirust negatiivselt ning on tĂ”sine vĂ€ljakutse LSM-salvestustele: kuidas teostada tihendusi, et sĂ€ilitada kĂ”rge pĂ€ringute kiirus ja samal ajal vĂ€ltida liiga suurt overhead'i?
MĂ€lu kasutamine tihendamisprotsessi ajal nĂ€eb samuti vĂ€lja ĂŒsna huvitav.

TSDB analĂŒĂŒs Prometheus 2-s

Me vÔime nÀha, et pÀrast tihendamist muutub suur osa mÀlust olekust Cached olekusse Free: see tÀhendab, et potentsiaalselt vÀÀrtuslik teave on sealt eemaldatud. Huvi pakub, kas kasutatakse fadvice() vÔi mÔnda muud minimeerimise tehnikat, vÔi on see tingitud sellest, et vahemÀlu on vabastatud tihendamise kÀigus hÀvitatud plokkidest?

Taasteprotsess

Rikkest taastamine vÔtab aega, ja see on Ôigustatud. Miljoni kirje sekundi sisenemise voogu arvesse vÔttes pidin ootama umbes 25 minutit, kuni taastamine SSD-diski arvestusega toimus.

level=info ts=2018-09-13T13:38:14.09650965Z caller=main.go:222 msg="Alustamine 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="Hakkab kuulama ĂŒhendusi" address=:9090
level=info ts=2018-09-13T13:38:14.097400393Z caller=main.go:533 msg="Alustamine TSDB ..."
level=info ts=2018-09-13T13:38:14.098718401Z caller=repair.go:39 component=tsdb msg="leitud tervislik plokk" mint=1536530400000 maxt=1536537600000 ulid=01CQ0FW3ME8Q5W2AN5F9CB7R0R
level=info ts=2018-09-13T13:38:14.100315658Z caller=web.go:467 component=web msg="marsruudi eelosa" prefix=/prometheus
level=info ts=2018-09-13T13:38:14.101793727Z caller=repair.go:39 component=tsdb msg="leitud tervislik plokk" mint=1536732000000 maxt=1536753600000 ulid=01CQ78486TNX5QZTBF049PQHSM
level=info ts=2018-09-13T13:38:14.102267346Z caller=repair.go:39 component=tsdb msg="leitud tervislik plokk" mint=1536537600000 maxt=1536732000000 ulid=01CQ78DE7HSQK0C0F5AZ46YGF0
level=info ts=2018-09-13T13:38:14.102660295Z caller=repair.go:39 component=tsdb msg="leitud tervislik plokk" mint=1536775200000 maxt=1536782400000 ulid=01CQ7SAT4RM21Y0PT5GNSS146Q
level=info ts=2018-09-13T13:38:14.103075885Z caller=repair.go:39 component=tsdb msg="leitud tervislik plokk" mint=1536753600000 maxt=1536775200000 ulid=01CQ7SV8WJ3C2W5S3RTAHC2GHB
level=error ts=2018-09-13T14:05:18.208469169Z caller=wal.go:275 component=tsdb msg="WAL hÀire tuvastatud; kÀrpimine" err="ootamatu CRC32 kontrollsumma d0465484, soovitud 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 kÀivitatud"
level=info ts=2018-09-13T14:05:19.471604598Z caller=main.go:603 msg="Laadimise konfiguratsioonifail" filename=/etc/prometheus.yml
level=info ts=2018-09-13T14:05:19.499156711Z caller=main.go:629 msg="Konfiguratsioonifaili laadimine lÔpule viidud" filename=/etc/prometheus.yml
level=info ts=2018-09-13T14:05:19.499228186Z caller=main.go:502 msg="Server on valmis veebipÀringute vastuvÔtmiseks."

Peamine probleem taastamisprotsessis on suur mĂ€lu tarbimine. Kuigi normaalsetes tingimustes suudab server sama mĂ€luhulga juures stabiilselt töötada, vĂ”ib see avarii korral mitte tĂ”usta OOM-i tĂ”ttu. Ainus lahendus, mille leidsin, on andmete kogumise vĂ€ljalĂŒlitamine, serveri tĂ”stmine, taastamise lubamine ja seejĂ€rel uuesti kĂ€ivitamine, andmete kogumise sisse lĂŒlitamisega.

Kuumutamine

Teine kÀitumine, mida kuumutamise kÀigus silmas pidada, on madala jÔudluse ja kÔrge ressursikasutuse suhe vahetult pÀrast kÀivitamist. MÔnel, kuid mitte kÔigil kÀivitustel olen tÀheldanud tÔsist koormust CPU-le ja mÀlule.

TSDB analĂŒĂŒs Prometheus 2-s

TSDB analĂŒĂŒs Prometheus 2-s

MÀlu kasutamise langused nÀitavad, et Prometheus ei suuda alguses kÔiki kogumisi konfigureerida ja mÔni teave jÀÀb kaduma.
Ma ei selgitanud tÀpsed pÔhjused kÔrge koormuse tekkimiseks protsessoris ja mÀlus. Kahtlustan, et see on seotud uute ajaseeriate loomisega head block'is kÔrge sagedusega.

CPU koormuse hĂŒpped

Lisaks tihenditele, mis loovad ĂŒsna kĂ”rge I/O koormuse, olen mĂ€rganud tĂ”siseid protsessori koormushooge iga kahe minuti tagant. Puhangud kestavad kauem kĂ”rgete sissetulevate voogude korral ning tundub, et need on pĂ”hjustatud Go prĂŒgikorjajast, vĂ€hemalt mĂ”ningate tuumade koormus on tĂ€ielikult tĂ€is.

TSDB analĂŒĂŒs Prometheus 2-s

TSDB analĂŒĂŒs Prometheus 2-s

Need tÔusud ei ole sugugi ebaolulised. Tundub, et kui need tekivad, siis sise sissepÀÀs ja Prometheuse mÔÔdikud muutuvad kÀttesaamatuks, mis pÔhjustab andmekatkestusi samade ajavahemike jooksul.

TSDB analĂŒĂŒs Prometheus 2-s

Samuti on mĂ€rgata, et Prometheuse eksportija takerdub ĂŒheks sekundiks.

TSDB analĂŒĂŒs Prometheus 2-s

Me vĂ”ime mĂ€rgata seoseid prĂŒgikorjamise (GC) kanssa.

TSDB analĂŒĂŒs Prometheus 2-s

KokkuvÔte

Prometheuse 2 TSDB toimib kiiresti, suudab toime tulla miljonite ajareadadega ning samal ajal tuhandeid kirjeid sekundis, kasutades ĂŒsna tagasihoidlikku riistvara. CPU ja kettasisse/öllus on samuti muljetavaldav. Minu nĂ€ide nĂ€itas kuni 200 000 mÔÔdikut sekundis ĂŒhel kasutusel oleval tuumal.

Laiennikuse planeerimisel tuleb arvestada piisavate mĂ€lu mahtudega, ning see peab olema tegelik mĂ€lu. Minu jĂ€lgimisel oli kasutatud mĂ€lu maht umbes 5 GB 100 000 salvestuse sekundi sissetulevas voos, mis koos operatsioonisĂŒsteemi vahemĂ€lu kogusega andis kokku umbes 8 GB kasutatud mĂ€lu.

Muidugi on veel palju tööd CPU ja kettasĂŒsteemi plahvatuste taltsutamiseks, ja see ei ole ĂŒllatav, arvestades, kui noor on TSDB Prometheus 2 vĂ”rreldes InnoDB, TokuDB, RocksDB, WiredTiger, kuid kĂ”ikidel neil olid algfaasis sarnased probleemid.

Allikas: habr.com

Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid | ProHoster