TSDB analĂŒĂŒs Prometheus 2-s

TSDB analĂŒĂŒs Prometheus 2-s

Ajaandmete ajalooteabe andmebaas (TSDB, time series database) Prometheus 2-s on suurepĂ€rane nĂ€ide insenerilahendusest, mis pakub tĂ”siseid parandusi vĂ”rreldes Prometheus 1 v2 salvestusega andmete kogumise ja pĂ€ringute tĂ€itmise kiirusel ning ressursside efektiivsuses. Me rakendasime Prometheus 2 Percona Monitoring and Management (PMM) sĂŒsteemis ja mul oli vĂ”imalus uurida Prometheus 2 TSDB jĂ”udlust. Selles artiklis jagan oma tĂ€helepanekute tulemusi.

Prometheuse keskmine töökoormus

Neile, kes on harjunud tegelema peamise sihiga andmebaasidega, on Prometheuse tavaline töökoormus ĂŒsna huvitav. Andmete kogumise kiirus pĂŒsib stabiilsena: tavaliselt saadavad jĂ€lgitavad teenused umbes sama arvu mÔÔdikuid ja infrastruktuur muutub suhteliselt aeglaselt.
Informatsiooni pĂ€ringud vĂ”ivad tulla erinevatest allikatest. MĂ”ned neist, nĂ€iteks hĂ€ired, pĂŒĂŒdlevad samuti stabiilsete ja ettearvatavate vÀÀrtuste poole. Teised, nagu kasutajate pĂ€ringud, vĂ”ivad tekitada tippe, kuigi see ei ole iseloomulik suuremale osale koormusest.

Koormustest

Testimise kĂ€igus keskendusin vĂ”imele andmeid koguda. JĂ”udsin vĂ€lja Prometheus 2.3.2, mis kompileeriti Go 1.10.1 abil (osa PMM 1.14) Linode teenuses, kasutades seda skripti: StackScript. Maksimaalselt realistliku koormuse genereerimise jaoks, kasutades seda, StackScript kĂ€ivitasin mitu MySQL nodi reaalse koormusega (Sysbench TPC-C Test), millest igaĂŒks emuleeris 10 Linux/MySQL nodi.
KÔik jÀrgnevad testid viidi lÀbi Linode serveris, millel on kaheksa virtuaalset tuuma ja 32 GB mÀlu, kus töötas 20 koormuse simulatsiooni kahel neljasaja MySQL instantsil. VÔi, Prometheuse terminoloogiaga, 800 sihtmÀrki (targets), 440 kogumist (scrapes) sekundis, 380 tuhat salvestust (samples) sekundis ja 1,7 miljonit aktiivset ajalugu.

Kujundus

Traditsiooniliste andmebaaside tavaline lĂ€henemine, sealhulgas see, mida kasutas Prometheus 1.x, pĂ”hineb mĂ€lu piirangul. Kui seda pole piisavalt, et koormust taluda, puutute kokku suurte viivitustega ja mĂ”ned pĂ€ringud jÀÀvad tĂ€itmata. Aja kasutamine Prometheus 2-s konfigureeritakse vĂ”tmega storage.tsdb.min-block-duration, mis mÀÀrab, kui kaua salvestatud andmed mĂ€lu olemasolevad enne kettale kirjutamist (vaikimisi 2 tundi). Vajalik mĂ€lumaht sĂ”ltub ajajoonte arvust, sildistamisest (labels) ja andmete kogumise intensiivsusest (scrapes) koos puhta siseneva vooluga. Diskiruumi osas pĂŒĂŒab Prometheus kasutada 3 baiti igast kirjest (sample). Teisest kĂŒljest, mĂ€lunĂ”uded on palju kĂ”rgemad.

Kuigi blokki suurust on vÔimalik konfigureerida, ei ole soovitatav seda kÀsitsi hÀÀlestada, seega olete sunnitud andma Prometheusele nii palju mÀlu, kui ta teie koormuse jaoks vajab.
Kui mÀlu ei piisa sisenevate mÔÔtmete toetamiseks, kukub Prometheus vÀlja mÀlu puuduse tÔttu vÔi jÔuab sinna OOM killer.
Swap mĂ€lu lisamine, et edasi lĂŒkata hetke, mil Prometheuse mĂ€lu otsa saab, ei aita eriti, kuna selle funktsiooni kasutamine pĂ”hjustab mĂ€lu kasutuse plahvatuslikku kasvu. Ma arvan, et asi on Go-s, selle prĂŒgifiltris ning selles, kuidas see swapiga toimib.
Teine huvitav lÀhenemine on seada peabloki kirjutamine kettale kindlaksmÀÀratud ajal, selle asemel et arvutada seda protsessi kÀivitamise ajast.

TSDB analĂŒĂŒs Prometheus 2-s

Nagu nĂ€ete graafikult, toimub kettale kirjutamine iga kahe tunni tagant. Kui muudate parameetrit min-block-duration ĂŒheks tunniks, siis need kirjutised toimuvad iga tunni jĂ€rel, alustades poole tunni pĂ€rast.
Kui soovite kasutada seda ja teisi graafikuid oma Prometheuse installatsioonis, vÔite kasutada seda juhtpaneeli. See on vÀlja töötatud PMM-i jaoks, kuid vÀikeste muudatustega sobib see kÔigile Prometheuse installatsioonidele.
Meil on aktiivne blokk, mida nimetatakse peablokiks, mis sĂ€ilib mĂ€lus; vanemate andmetega blokid on saadaval lĂ€bi mmap(). See eemaldab vajaduse vahemĂ€lu eraldi konfigureerimise jĂ€rele, kuid tĂ€hendab ka, et peate jĂ€tma piisavalt ruumi operatsioonisĂŒsteemi vahemĂ€lu jaoks, kui soovite teha pĂ€ringuid andmetele, mis on vanemad kui need, mida peablokk suudab mahutada.
Ja see tĂ€hendab ka, et Prometheuse virtuaalmĂ€lu tarbimine nĂ€eb vĂ€lja ĂŒsna kĂ”rge, mis ei peaks muret tekitama.

TSDB analĂŒĂŒs Prometheus 2-s

Veel huvitav aspekt disainis on WAL-i (write ahead log) kasutamine. Nagu nĂ€ha ladustamise dokumentatsioonist, kasutab Prometheus WAL-i andmete kaotuse vĂ€ltimiseks sĂŒsteemi kokkuvarisemise korral. Kahjuks ei ole konkreetseid andmekindluse tagamise mehhanisme piisavalt kirjeldatud. Prometheus 2.3.2 kirjutab WAL-i kettale iga 10 sekundi tagant ning see seadistus ei ole kasutaja poolt konfigureeritav.

Kompaktsioonid

Prometheus TSDB on kavandatud LSM-ladustamise (Log Structured Merge) pĂ”hjal: pea plokk kirjutatakse perioodiliselt kettale, samal ajal kui kompaktsiooni mehhanism ĂŒhendab mitu plokki, et vĂ€ltida liialt suurte plokkide skaneerimist pĂ€ringute kĂ€igus. Siit on nĂ€ha plokkide arvu, mida ma testi sĂŒsteemis ĂŒhe pĂ€eva koormuse jĂ€rel jĂ€lgisin.

TSDB analĂŒĂŒs Prometheus 2-s

Kui soovite teada rohkem ladustamise kohta, vÔite uurida meta.json faili, kus on teavet olemasolevate plokkide kohta ja selle kohta, kuidas need tekkisid.

{
       "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 kompaktsioonid on seotud pea ploki ketta peal kirjutamise ajaga. Selle aja jooksul vÔib toimuda mitu sellist operatsiooni.

TSDB analĂŒĂŒs Prometheus 2-s

Tundub, et tihendamine ei ole kuidagi piiratud ja vĂ”ib pĂ”hjustada suuri disk I/O hĂŒppeid teostamise ajal.

TSDB analĂŒĂŒs Prometheus 2-s

CPU koormuse hĂŒpped

TSDB analĂŒĂŒs Prometheus 2-s

Muidugi, see mĂ”jutab sĂŒsteemi töökiirus negatiivselt ja on tĂ”sine vĂ€ljakutse LSM-laodaridele: kuidas teostada tihendamist kĂ”rge pĂ€ringukiirus sĂ€ilitamiseks ning samas vĂ€ltida liiga suurt ĂŒlekatet?
MĂ€lu kasutamine tihendamiste protsessis nĂ€ib samuti olevat ĂŒsna huvitav.

TSDB analĂŒĂŒs Prometheus 2-s

NÀeme, et pÀrast tihendamist muutub suur osa mÀlust olekust Cached olekusse Free: see tÀhendab, et potentsiaalselt vÀÀrtuslik teave on sealt eemaldatud. Huvitav, kas siin kasutatakse fadvice() vÔi mÔnda muud vÀhendamise tehnikat, vÔi on see tingitud sellest, et vahemÀlu vabastati eemaldatud plokkidest, mis hÀvitati tihendamise kÀigus?

TÔrke taastamine

TÔrgete taastamiseks kulub aega ja see on pÔhjendatud. Miljoni kirje sekundis siseneva voolu jaoks pidin ootama umbes 25 minutit, kuni taastamine toimus SSD-ketta arvestades.

level=info ts=2018-09-13T13:38:14.09650965Z caller=main.go:222 msg="KĂ€ivitamine 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="Alustamine ĂŒhenduste kuulamiseks" address=:9090
level=info ts=2018-09-13T13:38:14.097400393Z caller=main.go:533 msg="TSDB kÀivitamine ..."
level=info ts=2018-09-13T13:38:14.098718401Z caller=repair.go:39 component=tsdb msg="leitud terve plokk" mint=1536530400000 maxt=1536537600000 ulid=01CQ0FW3ME8Q5W2AN5F9CB7R0R
level=info ts=2018-09-13T13:38:14.100315658Z caller=web.go:467 component=web msg="marutĂŒki eelmine osa" prefix=\/prometheus
level=info ts=2018-09-13T13:38:14.101793727Z caller=repair.go:39 component=tsdb msg="leitud terve plokk" mint=1536732000000 maxt=1536753600000 ulid=01CQ78486TNX5QZTBF049PQHSM
level=info ts=2018-09-13T13:38:14.102267346Z caller=repair.go:39 component=tsdb msg="leitud terve plokk" mint=1536537600000 maxt=1536732000000 ulid=01CQ78DE7HSQK0C0F5AZ46YGF0
level=info ts=2018-09-13T13:38:14.102660295Z caller=repair.go:39 component=tsdb msg="leitud terve plokk" mint=1536775200000 maxt=1536782400000 ulid=01CQ7SAT4RM21Y0PT5GNSS146Q
level=info ts=2018-09-13T13:38:14.103075885Z caller=repair.go:39 component=tsdb msg="leitud terve plokk" mint=1536753600000 maxt=1536775200000 ulid=01CQ7SV8WJ3C2W5S3RTAHC2GHB
level=error ts=2018-09-13T14:05:18.208469169Z caller=wal.go:275 component=tsdb msg="WAL-i rike tuvastatud; lĂŒhenemine" err="ootamatu CRC32 kontrollsumma d0465484, oota 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="Konfiguratsioonifaili laadimine" filename=\/etc\/prometheus.yml
level=info ts=2018-09-13T14:05:19.499156711Z caller=main.go:629 msg="Konfiguratsioonifaili laadimise lÔpetamine" 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 kĂ”rge mĂ€lu tarbimine. Kuigi tavapĂ€rastel tingimustel vĂ”ib server sarnase mĂ€luhulga puhul stabiilselt töötada, vĂ”ib see krahhi korral OOM-i tĂ”ttu mitte taastuda. Ainus lahendus, mille ma leidsin, on andmete kogumise vĂ€lja lĂŒlitamine, serveri kĂ€ivitamine, taastumise vĂ”imaldamine ja seejĂ€rel uuesti kĂ€ivitamine andmete kogumise sisselĂŒlitamisega.

Soojenemine

Teine kÀitumine, mida tuleb soojenemise ajal jÀlgida, on madala jÔudluse ja kÔrge ressursikasutuse suhe kohe pÀrast kÀivitamist. MÔnedel, kuid mitte kÔigil kÀivitustel olen tÀheldanud tÔsist koormust CPU-l ja mÀlus.

TSDB analĂŒĂŒs Prometheus 2-s

TSDB analĂŒĂŒs Prometheus 2-s

MÀlu kasutamise tÔusud nÀitavad, et Prometheus ei suuda alguses kÔiki kogumise seadistusi teha ja teatud teave kaob.
Ma ei selgitanud kÔrge protsessori ja mÀlu koormuse tÀpseid pÔhjuseid. Kahtlustan, et see on seotud uute ajarealiste loomisega peablokis kÔrge sagedusega.

CPU koormuse hĂŒpped

Peale tihendite, mis tekitavad ĂŒsna kĂ”rget I/O koormust, mĂ€rkasin tĂ”siseid hĂŒppeid protsessori koormuses iga kahe minuti tagant. HĂŒpped kestavad kauem kĂ”rge sisendi voolu korral ja tundub, et neid pĂ”hjustab Go prĂŒgikogumisepunkt, vĂ€hemalt mĂ”ned tuumad on tĂ€ielikult koormatud.

TSDB analĂŒĂŒs Prometheus 2-s

TSDB analĂŒĂŒs Prometheus 2-s

Need hĂŒpped ei ole sugugi ebaolulised. Tundub, et nende esinemisel muutuvad sisemine sisenemispunkt ja Prometheuse mÔÔdikud kĂ€ttesaamatuks, mis pĂ”hjustab andmesĂŒgavusi samadel aegadel.

TSDB analĂŒĂŒs Prometheus 2-s

Samuti vÔib mÀrkida, et Prometheuse eksportöör ummistub sekundiks.

TSDB analĂŒĂŒs Prometheus 2-s

Saame mĂ€rgata seoseid prĂŒgikogumise (GC) ja vahel.

TSDB analĂŒĂŒs Prometheus 2-s

KokkuvÔte

Prometheuse 2 ajarealiste andmebaas (TSDB) töötab kiiresti, suudab hallata miljoneid ajarealisi andmeid ja samas tuhandete kirjeid sekundis, kasutades ĂŒsna tagasihoidlikku riistvara. CPU ja disk I/O kasutamine on samuti muljetavaldav. Minu nĂ€ide nĂ€itas kuni 200 000 mÔÔdikut sekundis ĂŒhe kasutatud tuuma kohta.

Laienemise planeerimisel tuleb arvestada piisava mĂ€lu mahuga, ja see peab olema reaalne mĂ€lu. Kasutatud mĂ€lu maht, mida ma jĂ€lgisin, oli umbes 5 Gt 100 000 sĂ”numi sekundis sisendi voolu puhul, mis koos operatsioonisĂŒsteemi vahemĂ€ega andis kokku umbes 8 Gt kasutuses olevat mĂ€lu.

Muidugi on veel palju tööd ees, et mÔÔdukuid CPU ja disk I/O taltsutada, ja see ei ole ĂŒllatav, arvestades, kui noor on Prometheuse 2 TSDB vĂ”rreldes InnoDB, TokuDB, RocksDB, WiredTiger, kuid kĂ”ik need olid alguses sarnaste probleemidega.

Allikas: habr.com

Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid | ProHoster