Lagring av metrik: hur vi övergick frÄn Graphite+Whisper till Graphite+ClickHouse

Hej alla! I min den föregÄende artikeln. jag skrev om att organisera ett modulÀrt övervakningssystem för mikrotjÀnstarkitektur. Inget stÄr still, vÄrt projekt vÀxer stÀndigt och mÀngden lagrade metrikar ökar ocksÄ. Hur vi organiserade övergÄngen frÄn Graphite+Whisper till Graphite+ClickHouse under hög belastning, samt vÄra förvÀntningar och resultaten av migreringen, kan du lÀsa nedan.

Lagring av metrik: hur vi övergick frÄn Graphite+Whisper till Graphite+ClickHouse

Innan jag berÀttar hur vi organiserade övergÄngen frÄn lagring av metrikar i Graphite+Whisper till Graphite+ClickHouse vill jag ge information om orsakerna till att vi fattade detta beslut och de nackdelar med Whisper som vi levde med under en lÀngre tid.

Problem med Graphite+Whisper

1. Hög belastning pÄ diskunderlaget

Vid tidpunkten för övergÄngen fick vi in ungefÀr 1,5 miljoner metrikar per minut. Med denna ström var diskutnyttjandet pÄ servrarna cirka ~30%. SÄ sett var det helt acceptabelt - allt fungerade stabilt, skrevs snabbt och lÀstes snabbt... Tills en av utvecklingsteamens lanserade en ny funktion och började skicka oss 10 miljoner metrikar per minut. DÄ pressades diskunderlaget, och vi sÄg 100% utnyttjande. Problemet lyckades vi snabbt lösa, men vi kÀnde av det.

2. Avsaknad av replikering och konsistens

Troligtvis som alla som anvÀnder/anvÀnde Graphite+Whisper sÄ skickade vi samma ström av metrikar till flera Graphite-servrar för att skapa redundans. Och med detta hade vi inga större problem - tills en av servrarna föll av nÄgon anledning. Ibland lyckades vi Äterstarta den fallna servern tillrÀckligt snabbt, och carbon-c-relay lyckades ladda metrikarna frÄn sin cache, men ibland gjorde den inte det. Och dÄ fanns det ett glapp i metrikarna som vi fick tÀcka med rsync. Proceduren var ganska lÄng. Det enda som rÀddade oss var att det hÀnde vÀldigt sÀllan. Vi tog ocksÄ regelbundet ett slumpmÀssigt urval av metrikar och jÀmförde dem med likadana pÄ angrÀnsande noder i klustret. I ungefÀr 5% av fallen varierade flera vÀrden, vilket inte gladde oss sÀrskilt mycket.

3. Stor volym av upptagen plats

Eftersom vi skriver i Graphite inte bara infrastrukturmÀssiga utan ocksÄ affÀrsmetriker (och nu Àven metrik frÄn Kubernetes), fÄr vi ganska ofta situationer dÀr metriken bara innehÄller nÄgra fÄ vÀrden, medan .wsp-filen skapas med hÀnsyn till hela retentionperioden och upptar det förutbestÀmda utrymme som vi haft, vilket var cirka ~2 MB. Problemet förvÀrras ocksÄ av att sÄdana filer med tiden blir mycket mÄnga, och nÀr man skapar rapporter pÄ dem gÄr det Ät mycket tid och resurser för att lÀsa tomma punkter.

Det Àr viktigt att nÀmna att de problem som beskrivits ovan kan bekÀmpas med olika metoder och med varierande grad av effektivitet, men ju mer data som börjar strömma in, desto mer akuta blir dessa problem.

Med allt ovanstĂ„ende (med hĂ€nsyn till tidigare artiklar), samt den stĂ€ndiga ökningen av antalet mottagna metrik, önskan att översĂ€tta alla metriker till en lagringsintervall pĂ„ 30 sekunder (vid behov — ner till 10 sekunder), beslutade vi oss för att pröva Graphite+ClickHouse som en lovande alternativ till Whisper.

Graphite+ClickHouse. FörvÀntningar

Efter att ha besökt ett par meetups med killarna frÄn Yandex, lÀst nÄgra artiklar pÄ Habré, genomsökt dokumentationen och hittat anvÀndbara komponenter för att integrera ClickHouse med Graphite, bestÀmde vi oss för att agera!

Vi ville uppnÄ följande:

  • minska diskens utnyttjande frĂ„n 30% till 5%;
  • minska det upptagna utrymmet frĂ„n 1 TB till 100 GB;
  • ha möjlighet att ta emot 100 miljoner metrik per minut pĂ„ servrar;
  • datakopiering och redundans ur lĂ„dan;
  • inte spendera ett Ă„r pĂ„ det hĂ€r projektet och göra övergĂ„ngen inom en rimlig tidsram;
  • omkoppla utan driftstopp.

Ganska ambitiöst, eller hur?

Graphite+ClickHouse. Komponenter

För att fÄ data via Graphite-protokollet och efterföljande uppdatering till ClickHouse valdes carbon-clickhouse (golang).

Som databas för lagring av tidsserier valdes den senaste stabila versionen av ClickHouse, som vid den tiden var 1.1.54253. NĂ€r vi arbetade med den uppstod problem: det dumpades mĂ€ngder av fel i loggarna och det var inte helt klart vad vi skulle göra med dem. I diskussion med Roman Lomonosov (skapare av carbon-clickhouse, graphite-clickhouse och mycket, mycket mer) valdes en Ă€ldre version 1.1.54236. Felen försvann — allt började fungera utmĂ€rkt.

För att lĂ€sa data frĂ„n ClickHouse valdes graphite-slickhouse (golang). Som API-grĂ€nssnitt för Graphite — carbonapi (golang). För att organisera replikering mellan tabeller i ClickHouse anvĂ€ndes zookeeper. För att dirigera metrikerna behöll vi vĂ„r Ă€lskade carbon-c-relay (C) (se föregĂ„ende artikel).

Graphite+ClickHouse. Tabellstrukturen

“graphite” — en databas som vi skapade för övervakningstabeller.

“graphite.metrics” — en tabell med ReplicatedReplacingMergeTree-motorn (replicerad ReplacingMergeTree). I denna tabell lagras namnen pĂ„ metrikerna och deras sökvĂ€gar.

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” — en tabell med ReplicatedGraphiteMergeTree-motorn (replicerad GraphiteMergeTree). I denna tabell lagras vĂ€rdena för metrikerna.

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” — en tabell som fylls under vissa villkor, med ReplicatedReplacingMergeTree-motorn. Namnen pĂ„ alla metrik som förekommit under dygn lagras i denna tabell. Orsaken till skapandet beskrivs i avsnittet «Problem» i slutet av denna artikel.

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” — en tabell som fylls under vissa villkor, med ReplicatedAggregatingMergeTree-motorn (replicerad AggregatingMergeTree). I denna tabell lagras antalet inkommande metrik med uppdelning ned till 4 nivĂ„er av inbĂ€ddning.

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, Prefix

Graphite+ClickHouse. Komponentinteraktionens schema

Lagring av metrik: hur vi övergick frÄn Graphite+Whisper till Graphite+ClickHouse

Graphite+ClickHouse. Datamigrering

Som vi minns frÄn förvÀntningarna pÄ detta projekt, bör övergÄngen till ClickHouse ske utan driftstopp, dÀrför mÄste vi pÄ nÄgot sÀtt vÀxla hela vÄrt övervakningssystem till det nya lagret sÄ transparent som möjligt för vÄra anvÀndare.
SÄ hÀr gjorde vi det.

  • I carbon-c-relay lade vi till en regel för att skicka en extra ström av metrik till carbon-clickhouse frĂ„n en av de servrar som deltar i replikeringen av ClickHouse-tabeller.

  • Vi skrev ett litet skript i Python som med hjĂ€lp av biblioteket whisper-dump lĂ€ste av alla .wsp-filer frĂ„n vĂ„rt förrĂ„d och skickade dessa data till den ovan nĂ€mnda carbon-clickhouse i 24 trĂ„dar. Antalet mottagna vĂ€rden för mĂ€tningar i carbon-clickhouse nĂ„dde upp till 125 miljoner/min, och ClickHouse blev inte ens anstrĂ€ngd.

  • Vi skapade en separat DataSource i Grafana för att felsöka funktioner som anvĂ€nds i befintliga dashboards. Vi identifierade en lista med funktioner som vi anvĂ€nde, men de var inte implementerade i carbonapi. Vi kompletterade dessa funktioner och skickade PR:er till författarna av carbonapi (ett sĂ€rskilt tack till dem).

  • För att styra lĂ€sbelastningen i instĂ€llningarna för lastbalanserarna Ă€ndrade vi slutpunkterna frĂ„n graphite-api (API-grĂ€nssnittet för Graphite+Whisper) till carbonapi.

Graphite+ClickHouse. Resultat

  • minskade diskens utnyttjande frĂ„n 30% till 1%;

    Lagring av metrik: hur vi övergick frÄn Graphite+Whisper till Graphite+ClickHouse

  • minskade det upptagna utrymmet frĂ„n 1 TB till 300 GB;
  • har möjlighet att ta emot 125 miljoner mĂ€tningar per minut till servern (toppar under migreringen);
  • överförde alla mĂ€tningar till en trettio sekunders lagringsintervall;
  • fick dat replication och hög tillgĂ€nglighet;
  • bytte utan driftstopp;
  • vi spenderade totalt cirka 7 veckor.

Graphite+ClickHouse. Problem

I vÄrt fall stötte vi pÄ nÄgra hinder. HÀr Àr vad vi stötte pÄ efter övergÄngen.

  1. ClickHouse lĂ€ser inte alltid om konfigurationerna i realtid, ibland mĂ„ste den startas om. Till exempel, i fallet med beskrivningen av klustret zookeeper i ClickHouse-konfigurationen — applicerades det inte förrĂ€n clickhouse-servern startades om.
  2. Stora förfrÄgningar passerade inte i ClickHouse, sÄ vÄr anslutningsstrÀng till ClickHouse i graphite-clickhouse ser ut sÄ hÀr:
    url = "http://localhost:8123/?max_query_size=268435456&max_ast_elements=1000000"
  3. I ClickHouse slÀpps ganska ofta nya versioner av stabila utgÄvor, och det kan finnas överraskningar i dem: var försiktig.
  4. Dynamiskt skapade containrar i Kubernetes skickar en stor mÀngd mÀtningar med kort och slumpmÀssig livslÀngd. Det finns inte mÄnga punkter för sÄdana mÀtningar, och det finns inga problem med utrymmet. Men nÀr vi bygger frÄgor höjer ClickHouse en enorm mÀngd av dessa mÀtningar frÄn tabellen 'metrics'. I 90 % av fallen saknas data för dem under fönstret (24 timmar). Men tiden som spenderas pÄ att söka efter dessa data i tabellen 'data' Àr pÄtaglig och resulterar i sista hand i en timeout. För att lösa detta problem började vi hÄlla en separat vy med information om de mÀtningar som har förekommit under ett dygn. DÀrmed, vid skapandet av rapporter (diagram) för dynamiskt skapade containrar, frÄgar vi endast de mÀtningar som har förekommit inom det angivna fönstret, snarare Àn att ta med hela tiden, vilket har ökat hastigheten för skapandet av rapporter avsevÀrt. graphite-clickhouse (fork), som inkluderar implementeringen av arbete med tabellen date_metrics.

Graphite+ClickHouse. Taggar

FrÄn version 1.1.0 började Graphite officiellt stötta taggar. Och vi tÀnker aktivt pÄ vad och hur vi ska göra för att stödja denna initiativ i stacken graphite+clickhouse.

Graphite+ClickHouse. Anomalidetektor

Baserat pÄ den beskrivna infrastrukturen har vi implementerat en prototyp av anomalidetektorn, och den fungerar! Men mer om det i nÀsta artikel.

Prenumerera, tryck pÄ uppÄtpilen och var lycklig!

KĂ€lla: habr.com

Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar đŸ”„ Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster