Hej alla! I min 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.

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 ), 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 , 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 (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 (skapare av carbon-clickhouse, graphite-clickhouse och mycket, mycket mer) valdes en Ă€ldre . Felen försvann â allt började fungera utmĂ€rkt.
För att lĂ€sa data frĂ„n ClickHouse valdes (golang). Som API-grĂ€nssnitt för Graphite â (golang). För att organisera replikering mellan tabeller i ClickHouse anvĂ€ndes . För att dirigera metrikerna behöll vi vĂ„r Ă€lskade (C) .
Graphite+ClickHouse. Tabellstrukturen
âgraphiteâ â en databas som vi skapade för övervakningstabeller.
âgraphite.metricsâ â en tabell med ReplicatedReplacingMergeTree-motorn (replicerad ). 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 ). 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 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 ). 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, PrefixGraphite+ClickHouse. Komponentinteraktionens schema

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%;

- 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.
- 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.
- 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" - I ClickHouse slÀpps ganska ofta nya versioner av stabila utgÄvor, och det kan finnas överraskningar i dem: var försiktig.
- 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. , som inkluderar implementeringen av arbete med tabellen date_metrics.
Graphite+ClickHouse. Taggar
FrÄn version 1.1.0 började Graphite officiellt . 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

