Përshëndetje të gjithëve! Në Kam shkruaja për organizimin e sistemit modular të monitorimit për arkitekturën mikroshërbimore. Asgjë nuk qëndron në vend, projekti ynë po rritet vazhdimisht, dhe numri i metrikeve të ruajtura po rritet po ashtu. Si e organizuam kalimin nga Graphite+Whisper në Graphite+ClickHouse nën ngarkesa të larta, prisnim prej tij dhe rezultatet e migrimit, Lexoni më poshtë.

Para se të flas për mënyrën se si organizuam kalimin nga ruajtja e meterikave në Graphite+Whisper në Graphite+ClickHouse, do të doja të jepja informacion mbi arsyet e këtij vendimi dhe mbi disavantazhet e Whisper, me të cilat kemi jetuar për një periudhë të gjatë.
Problemet Graphite+Whisper
1. Ngarkesë e lartë në sistemin disk
NĂ« momentin e kalimit, ne merrnim rreth 1.5 milion metrika nĂ« minutĂ«. Me njĂ« rrjedhĂ« tĂ« tillĂ«, shfrytĂ«zimi i diskut nĂ« serverat ishte rreth ~30%. NĂ« tĂ«rĂ«si kjo ishte mjaft e pranueshme â gjithçka funksiononte stabilisht, shkruhej me shpejtĂ«si, lexoheshin shpejt⊠Derisa njĂ« nga ekipet e zhvillimit nxori njĂ« funksion tĂ« ri dhe filloi tĂ« dĂ«rgonte pĂ«rafĂ«rsisht 10 milion metrika nĂ« minutĂ«. AtĂ«herĂ«, sistemi disk u ngjesh dhe pashĂ« 100% shfrytĂ«zim. Problemi u zgjidh shpejt, por mbeti njĂ« ndjesi e kĂ«ndshme.
2. Mungesa e replikimit dhe konsistencës
Sikur ndoshta tĂ« gjithĂ« ata qĂ« pĂ«rdorin / kanĂ« pĂ«rdorur Graphite+Whisper, ne derdhĂ«m njĂ« rrjedhĂ« tĂ« njĂ«jtĂ« metrikash menjĂ«herĂ« nĂ« disa servera Graphite me qĂ«llim tĂ« krijimit tĂ« qĂ«ndrueshmĂ«risĂ«. Kjo nuk kishte pasur ndonjĂ« problem tĂ« madh â deri nĂ« momentin kur njĂ« nga serverat pĂ«r ndonjĂ« arsye ra. NdonjĂ«herĂ« arritnim ta ngjisim serverin e rĂ«nĂ« mjaft shpejt, dhe carbon-c-relay arrinte tĂ« derdhte metrikat nĂ« tĂ« nga cache-i i tij, ndonjĂ«herĂ« jo. Dhe atĂ«herĂ« kĂ«tu kishte njĂ« boshllĂ«k nĂ« metrika qĂ« ne e zgjidhĂ«m me rsync. Procedura ishte mjaft e gjatĂ«. Na shpĂ«tonte vetĂ«m se ndodhte shumĂ« rrallĂ«. Gjithashtu, herĂ« pas here merrnim njĂ« grup tĂ« rastĂ«sishĂ«m metrikash dhe i krahasonim ato me ato nĂ« nodet e tjera tĂ« klasit. Rreth 5% e rasteve disa vlera ndryshonin, gjĂ« qĂ« nuk na kĂ«naqte shumĂ«.
3. Vëllimi i madh i hapësirës së zënë
Duke qenë se ne shkruajmë në Graphite jo vetëm metrika infrastrukturale, por edhe metrika biznesi (dhe tani edhe metrika nga Kubernetes), shpesh hasim situatën në të cilën në metrikë gjenden vetëm disa vlera, ndërlidhja `.wsp` krijohet duke marrë parasysh gjithë periudhën e ruajtjes, dhe zë një hapësirë prej rreth ~2Mb. Problemi përkeqësohet gjithashtu nga fakti se me kalimin e kohës po krijohen shumë të tilla, dhe gjatë ndërtimit të raporteve për to, leximi i pikave bosh merr shumë kohë dhe burime.
Dua të theksoj menjëherë që me problemet e përshkruara më sipër mund të luftohet me metode të ndryshme dhe me nivele të ndryshme efikasiteti, por sa më shumë të dhëna të keni, aq më të forta bëhen ato.
Duke pasur parasysh tĂ« gjitha tĂ« mĂ«sipĂ«rmet (duke marrĂ« parasysh tĂ« kaluarĂ«n, ), si dhe rritjen e vazhdueshme tĂ« metrikave tĂ« marra, dĂ«shira pĂ«r tĂ« kaluar tĂ« gjitha metrikat nĂ« njĂ« interval ruajtjeje prej 30 sekondash (nĂ« rast nevoje â deri nĂ« 10 sekonda), ne vendosĂ«m tĂ« provojmĂ« Graphite+ClickHouse si njĂ« alternativĂ« tĂ« pĂ«rshtatshme pĂ«r Whisper.
Graphite+ClickHouse. Prirjet
Pas pjesëmarrjes në disa takime me djemtë nga Yandex, lexohem disa artikuj në Habr, Dëshironim të arrinim këtë:
të ulja e shfrytëzimit të diskut nga 30% në 5%;
- të reduktojmë vëllimin e hapësirës së zënë nga 1Tb në 100Gb;
- të kemi mundësinë të marrim deri në 100 milion metrika në minutë në server;
- replikimin e të dhënave dhe qëndrueshmërinë nga kutia;
- të mos e kalojmë këtë projekt për një vit dhe të bëjmë kalimin në një kohë të arsyeshme;
- të kalojmë pa ndonjë downtime.
- Mjaft ambicioze, apo jo?
Graphite+ClickHouse. Komponentët
Për marrjen e të dhënave përmes protokollit Graphite dhe regjistrimin e tyre në ClickHouse, u zgjodh carbon-clickhouse (golang).
Si bazĂ« tĂ« dhĂ«nash pĂ«r ruajtjen e serive tĂ« kohĂ«s u zgjodh versione mĂ« e fundit stabil e ClickHouse 1.1.54253. GjatĂ« punĂ«s me tĂ« kishim probleme: log tĂ« plota me gabime dhe nuk ishte e qartĂ« se çfarĂ« tĂ« bĂ«jmĂ« me to. NĂ« diskutimin me Roman Lomonosov (autori i carbon-clickhouse, graphite-clickhouse dhe shumĂ« pĂ«rveç kĂ«saj) u zgjodh njĂ« version mĂ« i vjetĂ«r 1.1.54236. Gabimet u zhdukĂ«n â gjithçka filloi tĂ« punonte shkĂ«lqyer. Graphite+ClickHouse. Strukturat e tabelave
âgraphiteâ â databaza e krijuar nga ne pĂ«r tabelat e monitorimit. (autori i carbon-clickhouse, graphite-clickhouse dhe shumĂ« e shumĂ« tĂ« tjera) u zgjodh njĂ« . Gabimet u zhdukĂ«n â gjithçka filloi tĂ« punojĂ« si duhet.
PĂ«r leximin e tĂ« dhĂ«nave nga ClickHouse, u zgjodh (golang). Si njĂ« ndĂ«rfaqe API pĂ«r Graphite â (golang). PĂ«r organizimin e replikimit midis tabelave ClickHouse, u pĂ«rdor . PĂ«r rutezimin e metrikave, ne lanĂ« tĂ« dashurin tonĂ« (C) .
Graphite+ClickHouse. Struktura e tabelave
"graphite" â njĂ« bazĂ« tĂ« dhĂ«nash e krijuar nga ne pĂ«r tabelat e monitorimit.
âgraphite.metricsâ â tabela me motorin ReplicatedReplacingMergeTree (replicueshĂ«m ). NĂ« kĂ«tĂ« tabelĂ« ruhen emrat e metrikeve dhe rrugĂ«t deri te ato.
KRIJO TABELĂN graphite.metrics ( Data Date, Level UInt32, Path String, Deleted UInt8, Version UInt32 ) MOTOR = ReplicatedReplacingMergeTree('/clickhouse/tables/replicator/graphite.metrics', âr1â, Date, (Level, Path), 8192, Version);âgraphite.dataâ â tabela me motorin ReplicatedGraphiteMergeTree (replicueshĂ«m ). NĂ« kĂ«tĂ« tabelĂ« ruhen vlerat e metrikeve.
KRIJO TABELĂN graphite.data ( Path String, Value Float64, Time UInt32, Date Date, Timestamp UInt32 ) MOTOR = ReplicatedGraphiteMergeTree('/clickhouse/tables/replicator/graphite.data', 'r1', Date, (Path, Time), 8192, 'graphite_rollup')âgraphite.date_metricsâ â tabela qĂ« plotĂ«sohet sipas kushtit, me motorin ReplicatedReplacingMergeTree. NĂ« kĂ«tĂ« tabelĂ« shkruhen emrat e tĂ« gjitha metrikeve qĂ« janĂ« hasur pĂ«r 24 orĂ«. Arsyet e krijimit janĂ« tĂ« pĂ«rshkruara nĂ« seksionin nĂ« fund tĂ« kĂ«tij artikulli.
KRIJO TABELĂ DHE MATERIALE graphite.date_metrics ( Path String, Level UInt32, Date Date) MOTOR = ReplicatedReplacingMergeTree('/clickhouse/tables/replicator/graphite.date_metrics', 'r1', Date, (Level, Path, Date), 8192) SI SELECT toUInt32(length(splitByChar('.', Path))) AS Level, Date, Path FROM graphite.dataâgraphite.data_statâ â tabela qĂ« plotĂ«sohet sipas kushtit, me motorin ReplicatedAggregatingMergeTree (replicueshĂ«m ). NĂ« kĂ«tĂ« tabelĂ« regjistrohet numri i metrikeve hyrĂ«se, me ndarjen deri nĂ« nivelin 4 tĂ« thellĂ«sisĂ«.
KRIJO TABELà DHE MATERIALE graphite.data_stat ( Date Date, Prefix String, Timestamp UInt32, Count AggregateFunction(count)) MOTOR = ReplicatedAggregatingMergeTree('/clickhouse/tables/replicator/graphite.data_stat', 'r1', Date, (Timestamp, Prefix), 8192) SI SELECT toStartOfMonth(now()) AS Date, replaceRegexpOne(Path, '^([^.]+.[^.]+.[^.]+).*$', '1') AS Prefix, toUInt32(toStartOfMinute(toDateTime(Timestamp))) AS Timestamp, countState() AS Count FROM graphite.data GRUPO Nà Timestamp, PrefixGraphite+ClickHouse. Schemi e bashkëveprimit të komponenteve

Graphite+ClickHouse. Migrimi i të dhënave
Siç e kujtojmë nga pritjet për këtë projekt, kalimi në ClickHouse duhet të ndodhte pa ndalime, prandaj, në një farë mënyre, duhej të kalonim të gjithë sistemin tonë të monitorimit në treguesin e ri sa më transparend për përdoruesit tanë.
Këtë e bëmë kështu.
Në carbon-c-relay shtuam një rregull për të dërguar një rrjedhë shtesë metrike në carbon-clickhouse nga një nga serverët që janë të angazhuar në replikimin e tabelave ClickHouse.
Shkruam njĂ« skenar tĂ« vogĂ«l nĂ« python, i cili me ĐżĐŸĐŒĐŸŃŃŃ tĂ« bibliotekĂ«s whisper-dump lexonte tĂ« gjitha .wsp-file nga depozita jonĂ« dhe dĂ«rgonte kĂ«to tĂ« dhĂ«na nĂ« carbon-clickhouse tĂ« pĂ«rshkruar mĂ« sipĂ«r nĂ« 24 rrjedha. Numri i vlerave tĂ« metrikeve tĂ« pranuara nĂ« carbon-clickhouse arrinte 125 mln/min, dhe ClickHouse madje nuk kishte asnjĂ« problem.
Krijuam një DataSource të veçantë në Grafana për qëllim të debug-imit të funksioneve që përdorim në dashboard-et ekzistuese. Identifikuam një listë funksionesh që përdorim, por ato nuk ishin realizuar në carbonapi. Shtuam këto funksione dhe dërguam PR-të autorëve të carbonapi (një falënderim veçanërisht për ta).
- Për të kaluar ngarkesën lexuese në cilësimet e balancuesve, ndryshuam endpoint-et nga graphite-api (ndërfaqja API për Graphite+Whisper) në carbonapi.
Graphite+ClickHouse. Rezultatet
ulëm përdorimin e sistemit të disqeve nga 30% në 1%;

- ulëm vëllimin e emrit nga 1 TB në 300 GB;
- kemi mundësinë të pranojmë 125 milion metri në minutë në server (piket në momentin e migrimit);
- kemi transferuar të gjitha metrike në intervalin e ruajtjes prej tridhjetë sekondash;
- kemi marrë replikimin e të dhënave dhe qëndrueshmërinë ndaj dështimit;
- kaluam pa ndalime;
- për të gjithë kemi harxhuar rreth 7 javë.
Graphite+ClickHouse. Problemet
Në rastin tonë nuk kaluam pa pengesa. Ja me çfarë u përballëm pas kalimit.
- ClickHouse nuk gjithmonĂ« e rilexon konfigurimin nĂ« kohĂ« reale, ndonjĂ«herĂ« duhet ta ribashkosh. PĂ«r shembull, nĂ« rastin e pĂ«rshkrimit tĂ« klasterit zookeeper nĂ« konfigurimin e ClickHouse â ai nuk u aplikua deri nĂ« ribashkimin e clickhouse-server.
- Nuk kalonin kërkesat e mëdha në ClickHouse, prandaj në graphite-clickhouse lidhja me ClickHouse duket kështu:
url = "http://localhost:8123/?max_query_size=268435456&max_ast_elements=1000000" - Në ClickHouse shpesh dalin versione të reja stabile, në to mund të ketë surpriza: jini të kujdesshëm.
- Kontejnerët e krijuar dinamikisht në kubernetes dërgojnë një numër të madh metrikeve me periudha të jetës së shkurtër dhe të rastësishme. Nuk ka shumë pika për këto metrika, dhe problemet me hapësirën nuk ka. Por gjatë ndërtimit të kërkesave ClickHouse ngre një sasi të madhe të këtyre metrikeve nga tabela 'metrics'. Në 90% të rasteve të dhënat për ato mungojnë gjatë periudhës (24 orë). Dhe koha për të kërkuar këto të dhëna në tabelë 'data' harxhohet, dhe në fund përfundojmë në kohën e skadimit. Për të zgjidhur këtë problem, filluam të mbajmë një pamje të veçantë me informacionin për metrike që janë hasur për 24 orë. Kështu, gjatë ndërtimit të raporteve (grafikëve) për konteinerët e krijuar dinamikisht, pyetim vetëm ato metrika që janë hasur brenda dritares së caktuar, e jo për gjithë kohën, çka shumëfish e përshpejton ndërtimin e raporteve për to. Për zgjidhjen e përshkruar më sipër, u ndërtua , duke përfshirë implementimin e punës me tabelën date_metrics.
Graphite+ClickHouse. Etiketat
Nga versioni 1.1.0, Graphite është bërë zyrtarisht . Ne po mendojmë aktivisht se çfarë dhe si duhet bërë për të mbështetur këtë iniciativë në stekën graphite+clickhouse.
Graphite+ClickHouse. Detektori i anomalive
NĂ« bazĂ« tĂ« infrastrukturĂ«s tĂ« pĂ«rshkruar mĂ« sipĂ«r, ne kemi realizuar njĂ« prototip tĂ« detektorit tĂ« anomalive, dhe ai funksionon! Por pĂ«r tĂ« â nĂ« artikullin e ardhshĂ«m.
Abonohuni, shtypni arrow-up dhe jini të lumtur!
Burimi: habr.com

