Silav hemû! Di wî de Min li ser organîzekirina pergalek çavdêriya modular a ji bo mîmariya mîkroxizmetê nivîsî. Tiştek raweste, projeya me bi domdarî mezin dibe, û her weha hejmara metrîkên hilanîn jî. Me çawa di bin şert û mercên bargiraniyê de derbasbûna ji Graphite+Whisper ber Graphite+ClickHouse organîze kir, li ser hêviyên ji wê û encamên koçberiya di bin qutbûnê de bixwînin.

Berî ku ez ji we re vebêjim ka me çawa derbasbûna ji hilanîna metrîkên li Graphite+Whisper berbi Graphite+ClickHouse organîze kir, ez dixwazim di derheqê sedemên girtina biryarek weha de û derheqê dezawantajên Whisper-ê ku em demek dirêj pê re dijîn agahdarî bidim.
Pirsgirêkên Graphite + Whisper
1. Barkirina bilind li ser bine pergala dîskê
Di dema veguheztinê de, bi qasî 1.5 mîlyon metrîk di her deqê de digihîjin me. Bi herikînek wusa, karanîna dîskê li ser serveran %30 bû. Bi gelemperî, ev yek pir meqbûl bû - her tişt bi îstîqrar dixebitî, zû dihat nivîsandin, zû dihat xwendin... Heya ku yek ji tîmên pêşkeftinê taybetmendiyek nû derxist û dest bi şandina 10 mîlyon metrîka ji me re kir. Wê gavê binepergala dîskê hişk bû, û me 100% karanîna dît. Pirsgirêk zû hate çareser kirin, lê bermayek ma.
2. Kêmbûna dubarekirin û hevgirtinê
Bi îhtimaleke mezin, mîna her kesê ku Graphite+Whisper bikar tîne/bi kar tîne, me heman tîrêjê metrîkan bi yekcarî daxist ser çend serverên Graphite da ku em tolerasyona xeletiyê biafirînin. Û di vê yekê de pirsgirêkên taybetî tune bûn - heya wê gavê ku yek ji serveran ji ber hin sedeman têk çû. Carinan me karî serverek têkçûyî bi têra xwe zû hilbigirin, û carbon-c-relay karî metrîkan ji cacheya xwe bar bike, lê carinan na. Û paşê di metrîkan de qulek hebû, ku me bi rsync tije kir. Pêvajo pir dirêj bû. Tenê xêra rizgariyê ev bû ku ev pir kêm diqewime. Di heman demê de me bi awayekî periyodîk komek metrîkên bêserûber girt û wan bi yên din ên heman rengî re li ser girêkên cîran ên komê berhev kir. Nêzîkî 5% bûyeran de, çend nirx ji hev cûda bûn, ku em ji wan ne pir kêfxweş bûn.
3. Şopa mezin
Ji ber ku em di Graphite de ne tenê binesaziyê, lê di heman demê de metrîkên karsaziyê jî dinivîsin (û naha jî metrîkên ji Kubernetes jî), em pir caran rewşek distînin ku tê de metrik tenê çend nirxan dihewîne, û pelê .wsp li gorî hemî ragirtinê tê afirandin. serdemê, û cîhek ji berê ve hatî veqetandin digire, ku ji bo me ~2MB bû. Pirsgirêk ji ber vê yekê ku gelek pelên wekhev bi demê re xuya dibin, û dema ku li ser wan rapor têne çêkirin, xwendina xalên vala gelek dem û çavkaniyan digire.
Ez dixwazim tavilê bibêjim ku pirsgirêkên ku li jor hatine destnîşan kirin dikarin bi karanîna awayên cûrbecûr û bi dereceyên cûda yên bandorker re bêne çareser kirin, lê her ku hûn bêtir dane dest bi wergirtinê bikin, ew qas xirabtir dibin.
Hemî yên jorîn hene (li ber çavê berê ), û her weha zêdebûna domdar a hejmara metrîkên wergirtî, xwestina veguheztina hemî metrîkan di navberek hilanînê ya 30 çirkeyan de. (heke hewce bike heya 10 çirke), me biryar da ku em Graphite+ClickHouse wekî alternatîfek sozdar a Whisper biceribînin.
Grafît+ClickHouse. Hêviyên
Min serdana çend hevdîtinên xortên ji Yandex kir, xwend , piştî ku di nav belgeyan re derbas bûn û ji bo girêdana ClickHouse di bin Graphite de hêmanên saxlem dîtin, me biryar da ku em tevbigerin!
Ez dixwazim tiştên jêrîn bistînim:
- karanîna binepergala dîskê ji 30% ber 5% kêm bike;
- mîqdara cîhê dagirkirî ji 1TB berbi 100GB kêm bike;
- karibe 100 mîlyon metrîkên di hûrdemê de bigihîne serverê;
- dubarekirina daneyan û tolerasyona xeletiyê ji qutiyê;
- salekê li ser vê projeyê rûneniştin û di çarçoveyek maqûl de derbasbûnê bikin;
- guheztin bê dem.
Pir ambicioz, rast?
Grafît+ClickHouse. Components
Ji bo wergirtina daneyan bi protokola Graphite û dûv re wê li ClickHouse tomar bike, min hilbijart (golang).
Daxuyaniya herî dawî ya ClickHouse, guhertoya stabîl 1.1.54253, wekî databasa hilanîna rêzikên demê hate hilbijartin. Dema ku bi wê re xebitîn pirsgirêk hebûn: Çiyayek ji xeletiyan ket nav têketin, û bi tevahî ne diyar bû ku meriv bi wan re çi bike. Di gotûbêjê de bi (nivîskarê carbon-clickhouse, graphite-clickhouse û gelek, gelekên din) yê kevin hat hilbijartin . Çewtî winda bûn - her tiştî bi dengek dest pê kir.
Ji bo xwendina daneyan ji ClickHouse ve hatî hilbijartin (golang). Wek API ji bo Graphite - (golang). ClickHouse ji bo organîzekirina dubarekirinê di navbera tabloyan de hate bikar anîn . Ji bo metrîkên rêvekirinê, me hezkiriya xwe hişt (C) .
Grafît+ClickHouse. Struktura sifrê
"graphite" databasek e ku me ji bo tabloyên çavdêriyê çêkiriye.
"graphite.metrics" - tabloya bi motora ReplicatedReplacingMergeTree (tewandin ). Ev tablo navên metrîkan û rêyên wan diparêze.
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" - tabloya bi motora ReplicatedGraphiteMergeTree (berbiçavkirî ). Ev tablo nirxên metrîkê hilîne.
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" bi motora ReplicateReplacingMergeTree tabloyek bi şert dagirtî ye. Ev tablo navên hemû metrîkên ku di nava rojê de hatine dîtin tomar dike. Sedemên afirandina wê di beşê de têne diyar kirin di dawiya vê gotarê de.
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" - tabloyek ku li gorî şertê tije ye, bi motora ReplicatedAggregatingMergeTree (berbiçavkirî ). Ev tablo hejmara metrîkên hatinê tomar dike, ku di 4 astên hêlînê de têne dabeş kirin.
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, PrefixGrafît+ClickHouse. Diagrama danûstendina pêkhateyan

Grafît+ClickHouse. Koçkirina daneyan
Wekî ku em ji hêviyên ji vê projeyê bi bîr tînin, divê derbasbûna li ClickHouse li gorî vê yekê bêyî dakêşan be, me neçar ma ku bi rengekî ji bo bikarhênerên xwe tevahî pergala xweya çavdêriyê biguhezînin hilanîna nû;
Me ev çawa kir.
Rêgezek li carbon-c-relay hate zêdekirin da ku pêvekek metrîkan bişîne karbon-clickhouse ya yek ji serverên ku beşdarî dubarekirina tabloyên ClickHouse dibin.
Me di python de skrîptek piçûk nivîsand, ku bi karanîna pirtûkxaneya whisper-dump, hemî pelên .wsp ji depoya me dixwend û ev data di 24 mijaran de ji karbon-clickhouse-a jorîn re şand. Hejmara nirxên metrîk ên pejirandî yên di karbon-clickhouse de gihîşt 125 mîlyon / hûrdem, û ClickHouse jî xwe neşikand.
Me di Grafana de DataSourceyek veqetandî çêkir da ku fonksiyonên ku di dashboardên heyî de têne bikar anîn xelet bike. Me navnîşek fonksiyonên ku me bikar anîn nas kir, lê ew di carbonapi de nehatin bicîh kirin. Me van fonksiyonan zêde kir û PR ji nivîskarên carbonapi re şand (spasên taybetî ji wan re).
- Ji bo guheztina barkirina xwendinê di mîhengên balanserê de, me xalên dawî ji grafît-api (navbera API-ê ji bo Graphite + Whisper) ji bo carbonapi guhertin.
Grafît+ClickHouse. results
karanîna binepergala dîskê ji 30% ber 1% kêm kir;

- mîqdara cîhê dagirkirî ji 1 TB daxist 300 GB;
- îmkana me heye ku em her hûrdem 125 mîlyon metrîk di serverê de bistînin (pişk di dema koçberiyê de);
- hemî metrîkan veguheztin navberek hilanînê ya sî-duyemîn;
- dubarekirina daneyan û tolerasyona xeletiyê wergirt;
- bêyî demdirêjê veguherandin;
- Nêzîkî 7 hefte girt ku her tişt temam bibe.
Grafît+ClickHouse. Problems
Di rewşa me de hin kêmasî hebûn. Ya ku em piştî veguheztinê pê re rû bi rû man ev e.
- ClickHouse her gav konfigurasyonan ji nû ve dixwîne carinan hewce dike ku ji nû ve were destpêkirin. Mînakî, di mijara danasîna koma zookeeper-ê de di veavakirina ClickHouse de, heya ku server-klîkhouse ji nû ve nehat destpêkirin ew nehat bikar anîn.
- Daxwazên mezin ên ClickHouse derbas nebûn, ji ber vê yekê di grafît-clickhouse de rêzika pêwendiya meya ClickHouse wiha xuya dike:
url = "http://localhost:8123/?max_query_size=268435456&max_ast_elements=1000000" - ClickHouse pir caran guhertoyên nû yên serbestberdana bi îstîqrar derdixe, dibe ku ew surprîz hebin: hay ji xwe hebin.
- Di kubernetes de konteynerên dînamîkî hatine afirandin hejmareke mezin ji metrîkan bi jiyanek kurt û rasthatî dişînin. Ji bo metrîkên weha pir xal tune, û di cîhê de pirsgirêk tune. Lê dema çêkirina pirsan, ClickHouse hejmareke mezin ji van heman metrikan ji tabloya 'metrîkan' hildibijêre. Di 90% bûyeran de, li ser wan ji pencereyê (24 saetan) tu dane tune. Lê dem ji bo lêgerîna van daneyan di tabloya 'dane' de derbas dibe, û di dawiyê de di nav deman de derbas dibe. Ji bo ku em vê pirsgirêkê çareser bikin, me bi agahdariya li ser metrîkên ku di nav rojê de pê re rû bi rû bûn, dest bi dîtinek cûda kir. Bi vî rengî, dema ku raporên (grafîkan) ji bo konteynerên dînamîkî hatine afirandin çêdikin, em tenê li wan metrîkên ku di pencereyek diyarkirî de hatine rûbirû dipirsin, û ne ji bo tevahiya demê, ku bi girîngî çêkirina raporên li ser wan bileztir dike. Ji bo çareseriya ku li jor hatî diyar kirin, min berhev kir , ku pêkanîna xebata bi tabloya date_metrics re dihewîne.
Grafît+ClickHouse. Tags
Bi guhertoya 1.1.0 Graphite fermî bû . Û em bi aktîvî li ser çi û çawa bikin ku piştgirî bidin vê destpêşxeriyê di stacka grafît+clickhouse de difikirin.
Grafît+ClickHouse. Detektora anomalî
Li ser bingeha binesaziya ku li jor hatî destnîşan kirin, me prototîpek detektorek anomalî bicîh kiriye, û ew dixebite! Lê di gotara din de bêtir li ser wî.
Aboneyê bibin, tîra jor bikirtînin û kêfxweş bibin!
Source: www.habr.com

