Të gjithëve përshëndetje! Në këtë Shkruaja për organizimin e një sistemi modular monitorimi për arkitekturën mikroshërbimesh. Asgjë nuk qëndron në vend, projekti ynë është vazhdimisht në rritje, dhe numri i metrikave të ruajtura po rritet gjithashtu. Si e organizuam kalimin nga Graphite+Whisper në Graphite+ClickHouse në kushte ngarkesash të larta, për pritjet nga ai dhe rezultatet e migrimit, lexoni më poshtë.

Para se të flas se si e organizuam kalimin nga ruajtja e metrikave në Graphite+Whisper në Graphite+ClickHouse, do të doja të ndaja informacion mbi arsyet e marrjes së një vendimi të tillë dhe mbi disavantazhet e Whisper me të cilat kemi jetuar për një kohë të gjatë.
Problemet me Graphite+Whisper
1. Ngarkesë e lartë në sistemin e diskut
NĂ« kohĂ«n e kalimit, ne merrnim rreth 1.5 milion metrika nĂ« minutĂ«. Me njĂ« fluks tĂ« tillĂ«, shfrytĂ«zimi i diskut nĂ« serverat ishte rreth ~30%. NĂ« pĂ«rgjithĂ«si, kjo ishte e pranueshme â gjithçka funksiononte stabilisht, shkruhej shpejt, lexohej shpejt⊠Derisa njĂ«ra nga ekipet e zhvillimit publikoi njĂ« veçori tĂ« re dhe filloi tĂ« na dĂ«rgonte 10 milion metrika nĂ« minutĂ«. AtĂ«herĂ« sistemi i diskut u ngarkua, dhe ne pamĂ« 100% shfrytĂ«zim. Problemi u zgjidh shpejt, por mbeti njĂ« shenjĂ«.
2. Mungesë e replikimit dhe konsistencës
Ndoshta si tĂ« gjithĂ« ata qĂ« pĂ«rdorin/pĂ«rdorĂ«n Graphite+Whisper, ne derdhĂ«m tĂ« njĂ«jtin fluks metrikash nĂ« disa servera Graphite me qĂ«llim krijimin e qĂ«ndrueshmĂ«risĂ«. Dhe nuk kishte ndonjĂ« problem tĂ« madh â deri nĂ« momentin kur njĂ« nga serverat pĂ«r ndonjĂ« arsye nuk binte. NdonjĂ«herĂ« arrinim ta ngjisim serverin e rĂ«nĂ« mjaft shpejt, dhe carbon-c-relay arrinte tĂ« derdhte metrikat nga cache-i i tij, e ndonjĂ«herĂ« jo. Dhe atĂ«herĂ« kishte njĂ« boshllĂ«k nĂ« metrika, tĂ« cilin e mbushnim me rsync. Procedura ishte mjaft e gjatĂ«. Na shpĂ«tonte vetĂ«m fakti qĂ« ndodhte shumĂ« rrallĂ«. Po ashtu, herĂ« pas here merrnim njĂ« grup tĂ« rastĂ«sishĂ«m metrikash dhe i krahasonim ato me tĂ« tjera tĂ« tilla nĂ« nodet pĂ«rkatĂ«se tĂ« klasterit. NĂ« rreth 5% tĂ« rasteve, disa vlera ndryshonin, gjĂ« qĂ« nuk na bĂ«nte shumĂ« tĂ« lumtur.
3. Vëllimi i madh i hapësirës së zënë
Duke shkruajmë në Graphite jo vetëm metrikat e infrastrukturës, por edhe ato të biznesit ( dhe tani edhe metrikat nga Kubernetes), shpesh përballen me një situatë ku metrika ka vetëm disa vlera, dhe skedari .wsp krijohet duke marrë parasysh të gjithë periudhën e ruajtjes dhe merr hapësirën e paracaktuar që ishte rreth 2MB. Problemi përkeqësohet edhe më shumë nga fakti që me kalimin e kohës shfaqen shumë skedarë të tillë, dhe gjatë përgatitjes së raporteve mbi to, kalon shumë kohë dhe burime për të lexuar pikat bosh.
Fillimisht do të doja të theksoja se me problemet e përshkruara më sipër, mund të përballesh me metoda të ndryshme dhe me një shkallë të ndryshme efikasiteti, por sa më shumë të dhëna të fillojnë të vijnë, aq më shumë ato përkeqësohen.
Duke pasur gjithçka tĂ« pĂ«rmendur mĂ« parĂ« (duke marrĂ« parasysh) ), si dhe rritjen e vazhdueshme tĂ« numrit tĂ« metrikeve tĂ« pranuara, dĂ«shira pĂ«r tĂ« rezervuar tĂ« gjitha metrikat nĂ« njĂ« interval ruajtjeje prej 30 sekondash (nĂ«se Ă«shtĂ« e nevojshme â deri nĂ« 10 sekonda), vendosĂ«m tĂ« provojmĂ« Graphite+ClickHouse si njĂ« alternativĂ« tĂ« perspektivĂ«s pĂ«r Whisper.
Graphite+ClickHouse. Pritet
Pas vizitave në disa mitape me djemtë e Yandex, duke lexuar , pas shqyrtimit të dokumentacionit dhe gjetjes së komponenteve të arsyeshme për lidhjen e ClickHouse me Graphite, ne vendosëm të veprojmë!
Doja të merrja sa vijon:
- të ulë shfrytëzimin e sistemit të diskut nga 30% në 5%;
- të ulet hapësira e zënë nga 1TB në 100GB;
- të kem mundësinë për të pranuar 100 milion metrika në minutë në server;
- replikimin e të dhënave dhe qëndrueshmërinë nga kutia;
- të mos qëndroj mbi këtë projekt për një vit dhe të bëj kalimin brenda një periudhe të arsyeshme;
- të kaloj pa ndalim.
Mjaft ambicioze, apo jo?
Graphite+ClickHouse. Komponentet
Për të marrë të dhënat përmes protokollit Graphite dhe për të shkruar ato në ClickHouse, u zgjodh (golang).
Si databazĂ« pĂ«r ruajtjen e serive temporale, u zgjodh versioni mĂ« i fundit nĂ« atĂ« kohĂ« i ClickHouse nĂ« versionin stabil 1.1.54253. Kur punoje me tĂ«, kishte probleme: logje tĂ« plota me gabime, dhe nuk ishte krejt e qartĂ« se çfarĂ« tĂ« bĂ«je me to. NĂ« diskutimin me (autori i carbon-clickhouse, graphite-clickhouse dhe shumĂ« e shumĂ« gjĂ«ra tĂ« tjera), u zgjodh njĂ« version mĂ« i vjetĂ«r Gabimet zhduken â gjithçka filloi tĂ« punojĂ« siç duhet.
PĂ«r leximin e tĂ« dhĂ«nave nga ClickHouse, u zgjodh (golang). Si API pĂ«r Graphite â (golang). PĂ«r organizimin e replikimit ndĂ«rmjet tabelave ClickHouse u pĂ«rdor . PĂ«r ruterizimin 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â â njĂ« tabelĂ« me motorin ReplicatedReplacingMergeTree (replicuar ). NĂ« kĂ«tĂ« tabelĂ« ruhet emrat e metrikave dhe rrugĂ«t deri te to.
CREATE TABLE graphite.metrics ( Date Date, Level UInt32, Path String, Deleted UInt8, Version UInt32 ) ENGINE = ReplicatedReplacingMergeTree('\/clickhouse\/tables\/replicator\/graphite.metrics', âr1â, Date, (Level, Path), 8192, Version);âgraphite.dataâ â njĂ« tabelĂ« me motorin ReplicatedGraphiteMergeTree (replicuar ). NĂ« kĂ«tĂ« tabelĂ« ruhet vlerat e metrikave.
CREATE TABLE graphite.data ( Path String, Value Float64, Time UInt32, Date Date, Timestamp UInt32 ) ENGINE = ReplicatedGraphiteMergeTree('\/clickhouse\/tables\/replicator\/graphite.data', 'r1', Date, (Path, Time), 8192, 'graphite_rollup')âgraphite.date_metricsâ â njĂ« tabelĂ« qĂ« plotĂ«sohet nĂ«n kushte, me motorin ReplicatedReplacingMergeTree. NĂ« kĂ«tĂ« tabelĂ« regjistrohen emrat e tĂ« gjitha metrikave qĂ« u takuan brenda njĂ« dite. Arsyet e krijimit janĂ« pĂ«rshkruar nĂ« seksionin nĂ« fund tĂ« kĂ«tij artikulli.
CREATE MATERIALIZED VIEW graphite.date_metrics ( Path String, Level UInt32, Date Date) ENGINE = ReplicatedReplacingMergeTree('\/clickhouse\/tables\/replicator\/graphite.date_metrics', 'r1', Date, (Level, Path, Date), 8192) AS SELECT toUInt32(length(splitByChar('.', Path))) AS Level, Date, Path FROM graphite.dataâgraphite.data_statâ â njĂ« tabelĂ« qĂ« plotĂ«sohet nĂ«n kushte, me motorin ReplicatedAggregatingMergeTree (replicuar ). NĂ« kĂ«tĂ« tabelĂ« regjistrohet numri i metrikave tĂ« ardhura, me ndarjen deri nĂ« nivelin e 4 tĂ« brendĂ«sisĂ«.
CREATE MATERIALIZED VIEW graphite.data_stat ( Date Date, Prefix String, Timestamp UInt32, Count AggregateFunction(count)) ENGINE = ReplicatedAggregatingMergeTree('\/clickhouse\/tables\/replicator\/graphite.data_stat', 'r1', Date, (Timestamp, Prefix), 8192) AS SELECT toStartOfMonth(now()) AS Date, replaceRegexpOne(Path, '^([^.]+.[^.]+.[^.]+).*$', '1') AS Prefix, toUInt32(toStartOfMinute(toDateTime(Timestamp))) AS Timestamp, countState() AS Count FROM graphite.data GROUP BY Timestamp, PrefixGraphite+ClickHouse. Schema e ndërveprimit të komponenteve

Graphite+ClickHouse. Migrimi i të dhënave
Siç e kemi kujtuar nga pritshmëritë për këtë projekt, kalimi në ClickHouse duhet të bëhej pa ndalime, për rrjedhojë, ne duhej të kishim ndonjë mënyrë për të kaluar të gjithë sistemin tonë të monitorimit në sistemin e ri të ruajtjes sa më transparencë për përdoruesit tanë.
Kështu e bëmë këtë.
Në carbon-c-relay shtuam një rregull për të dërguar një rrjedhë shtesë metrikash në carbon-clickhouse të njërit nga serverët, të cilët morin pjesë në replikimin e tabelave ClickHouse.
Krijuam një skript të vogël në python, i cili me ndihmën e bibliotekës whisper-dump lexonte të gjithë .wsp-file nga depoja jonë dhe dërgonte këto të dhëna në carbon-clickhouse të përmendur më parë me 24 procese. Numri i vlerave të metrikave që pranohen në carbon-clickhouse arrinte deri në 125 milion/min, dhe ClickHouse as nuk u ndje.
Krijuam një DataSource të veçantë në Grafana me qëllim për të debug-uar funksionet që përdoren në dashboard-at ekzistues. Identifikuam listën e funksioneve që ne përdoronim, por ato nuk ishin implementuar në carbonapi. Shtuam këto funksione, dhe dërguam PR-të autorëve të carbonapi (falënderim të veçantë për ta).
- Për të ndryshuar ngarkesën lexuese, kemi ndryshuar endpoint-et në konfigurimin e balancuesve nga graphite-api (interfejsi API për Graphite+Whisper) në carbonapi.
Graphite+ClickHouse. Rezultatet
ullëm përdorimin e sistemit të diskut nga 30% në 1%;

- ullëm volumet e hapësirës së zënë nga 1 TB në 300 GB;
- kemi mundësinë të pranojmë deri në 125 milion metrika në minutë në server (kulmin gjatë migrimit);
- kemi transferuar të gjitha metrikat në intervalin e ruajtjes prej tridhjetë sekondash;
- kemi siguruar replikimin e të dhënave dhe qëndrueshmërinë ndaj dështimit;
- kemi kaluar pa ndalim;
- për të gjitha shpenzuam rreth 7 javë.
Graphite+ClickHouse. Problematikat
Në rastin tonë, nuk kaluam pa pengesa. Këtu janë disa nga sfidat që hasëm pas kalimit.
- ClickHouse nuk e lexon gjithmonĂ« konfigurimin nĂ« fluks, herĂ« pas here duhet ta rinisni. PĂ«r shembull, nĂ« rastin e pĂ«rshkrimit tĂ« klasterit zookeeper nĂ« konfigurimin e ClickHouse â nuk ishte aplikuar deri nĂ« rinisjen e clickhouse-server.
- Nuk kalonin kërkesa të mëdha në ClickHouse, prandaj linja jonë e lidhjes për graphite-clickhouse dukej kështu:
url = "http://localhost:8123/?max_query_size=268435456&max_ast_elements=1000000" - Në ClickHouse shpesh dalin versione të reja të qëndrueshme, ku mund të hasen surpriza: jini të kujdesshëm.
- Kontenierët që krijohen në mënyrë dinamike në Kubernetes dërgojnë një numër të madh metrike me periudha të shkurtra dhe të rastit jetese. Nuk ka shumë pika për këto metrika, dhe nuk ka probleme me hapësirën. Megjithatë, kur krijohen kërkesat, ClickHouse ngre një sasi të madhe të këtyre metrikeve nga tabela 'metrics'. Në 90% të rasteve, të dhënat për ta mungojnë në dritaren (24 orë). Por koha që shpenzohet për të gjetur këto të dhëna në tabelën 'data' është e madhe, dhe përfundon në kohën e ndërprerjes. Për të zgjidhur këtë problem, filluam të mbajmë një pamje të veçantë me informacion mbi metrikët që janë hasur në 24 orët e fundit. Në këtë mënyrë, kur krijojmë raporte (grafikë) për kontenierët që krijohen dinamikisht, ne pyetëm vetëm ato metrika që janë hasur në brendësi të dritares së caktuar dhe jo për të gjitha kohërat, çka e përshpejtoi ndjeshëm krijimin e raporteve për to. Për zgjidhjen e përshkruar më sipër është ndërtuar , duke përfshirë implementimin e punës me tabelën date_metrics.
Graphite+ClickHouse. Etiketat
Që nga versioni 1.1.0, Graphite zyrtarisht . Dhe ne po mendojmë aktivisht se çfarë dhe si duhet të bëjmë për të mbështetur këtë iniciativë në grumbullin graphite+clickhouse.
Graphite+ClickHouse. Detektori i anomalive
NĂ« bazĂ« tĂ« infrastrukturĂ«s sĂ« pĂ«rshkruar mĂ« lart, kemi realizuar njĂ« prototip tĂ« detektorĂ«t tĂ« anomalive dhe ai po funksionon! Por pĂ«r tĂ« â nĂ« artikullin tjetĂ«r.
Regjistrohuni, shtypni shenjën lart dhe jetëni të lumtur!
Burimi: habr.com

