ProHoster > Blog > Amministrazione > Almacenamiento metricu: cumu avemu passatu da Graphite+Whisper à Graphite+ClickHouse
Almacenamiento metricu: cumu avemu passatu da Graphite+Whisper à Graphite+ClickHouse
Salut à tutti ! In u so ultimu articulu Aghju scrittu annantu à l'urganizazione di un sistema di monitoraghju modulare per l'architettura di microserviziu. Nunda si ferma, u nostru prughjettu hè in constantemente crescente, è cusì hè u numeru di metrichi almacenati. Cumu avemu urganizatu a transizione da Graphite+Whisper à Graphite+ClickHouse in cundizioni d'alta carica, leghje nantu à l'aspettattivi da ellu è i risultati di a migrazione sottu u cut.
Prima di dicu cumu avemu urganizatu a transizione da l'almacenamiento di metriche in Graphite+Whisper à Graphite+ClickHouse, vogliu dà infurmazioni nantu à i motivi per piglià una tale decisione è nantu à i disadvantages di Whisper chì avemu campatu per un bellu pezzu.
Problemi di grafite + sussurru
1. Alta carica nantu à u subsistema di discu
À u mumentu di a transizione, circa 1.5 milioni di metrici eranu ghjunti à noi per minutu. Cù un tali flussu, l'utilizazione di u discu nantu à i servitori era ~ 30%. In generale, questu era abbastanza accettabile - tuttu hà travagliatu stabile, hè statu scrittu rapidamente, lettu rapidamente ... Finu à chì unu di i squadre di sviluppu hà sviluppatu una nova funzione è hà cuminciatu à mandà 10 milioni di metriche per minutu. Hè quandu u sottosistema di discu strinse, è avemu vistu 100% utilizazione. U prublema hè stata risolta rapidamente, ma un residuu restava.
2. Mancanza di replicazione è cunsistenza
Hè assai prubabile, cum'è tutti quelli chì utilizanu / usanu Graphite + Whisper, avemu versatu u stessu flussu di metriche nantu à parechji servitori di Grafite à una volta per creà a tolleranza di difetti. È ùn ci era micca prublemi speciali cù questu - finu à u mumentu chì unu di i servitori s'hè lampatu per una certa ragione. Calchì volta avemu riisciutu à ripiglià un servitore cadutu abbastanza rapidamente, è carbon-c-relay hà sappiutu à carica metrica da u so cache in ellu, ma à volte micca. E poi ci era un pirtusu in i metrichi, chì avemu pienu di rsync. A prucedura era abbastanza longa. L'unica grazia salvadora era chì questu hè accadutu assai raramente. Pigliamu ancu periodicamente un inseme aleatoriu di metriche è li paragunemu cù altri di u listessu tipu nantu à i nodi vicini di u cluster. In circa 5% di i casi, parechji valori eranu diffirenti, chì ùn eramu micca assai cuntenti.
3. Grande impronta
Siccomu scrivimu in Graphite micca solu infrastruttura, ma ancu metrica di l'affari (è avà ancu metriche da Kubernetes), avemu abbastanza spessu una situazione in quale a metrica cuntene solu uni pochi di valori, è u schedariu .wsp hè creatu tenendu in contu tutte e retenzioni. piriudu, è occupa una quantità di spaziu pre-assignatu, chì per noi era ~ 2MB. U prublema hè ancu aggravatu da u fattu chì parechji schedarii simili appariscenu cù u tempu, è quandu custruiscenu rapporti nantu à elli, a lettura di punti vacanti piglia assai tempu è risorse.
Vogliu nutà immediatamente chì i prublemi descritti sopra ponu esse trattati cù diversi metudi è cù varii gradi di efficacità, ma più dati cuminciate à riceve, più peghju.
Avè tuttu ciò chì sopra (pigliandu in contu u precedente articuli), è ancu un incrementu constante di u numeru di metriche ricivute, u desideriu di trasfiriri tutte e metriche à un intervalu di almacenamiento di 30 seconde. (finu à 10 seconde se ne necessariu), avemu decisu di pruvà Graphite+ClickHouse cum'è una alternativa promettente à Whisper.
Grafite+ClickHouse. Aspettative
Dopu avè visitatu parechje riunioni di i picciotti di Yandex, avè lettu un paru d'articuli nantu à Habré, dopu avè passatu a ducumentazione è truvate cumpunenti sani per ubligatoriu ClickHouse sottu Graphite, avemu decisu di piglià l'azzione!
Mi piacerebbe riceve i seguenti:
riduce l'utilizazione di u sottosistema di discu da 30% à 5%;
riduce a quantità di spaziu occupatu da 1TB à 100GB;
esse capaci di riceve 100 milioni di metriche per minutu in u servitore;
replicazione di dati è tolleranza di difetti fora di a scatula;
ùn siate micca nantu à stu prughjettu per un annu è fate a transizione in un tempu raghjone;
cambia senza tempi di inattività.
Piuttostu ambiziosu, nò?
Grafite+ClickHouse. Cumpunenti
Per riceve dati via u protokollu di Grafite è dopu arregistrà in ClickHouse, aghju sceltu carbon-clickhouse (golang).
L'ultima versione di ClickHouse, a versione stabile 1.1.54253, hè stata scelta cum'è a basa di dati per almacenà serie di tempu. Ci era prublemi quandu u travagliu cù questu: una muntagna d'errori versata in i logs, è ùn era micca sanu sanu chjaru ciò chì fà cun elli. In discussione cun Roman Lomonosov (autore di carbon-clickhouse, graphite-clickhouse è assai, assai di più) u più vechju hè statu sceltu liberazione 1.1.54236. L'errori sò spariti - tuttu hà cuminciatu à travaglià cù un bang.
"grafite" hè una basa di dati chì avemu creatu per surviglianza tavule.
"graphite.metrics" - tavula cù u mutore ReplicatedReplacingMergeTree (replicated Sustituitu MergeTree). Questa tavula guarda i nomi di metriche è percorsi per elli.
"graphite.data" - tavula cù u mutore ReplicatedGraphiteMergeTree (replicated GraphiteMergeTree). Questa tavula guarda i valori metrichi.
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" hè un tavulu cumpletu cundizionale cù u mutore ReplicatedReplacingMergeTree. Questa tavula registra i nomi di tutti i metrici chì sò stati scontri durante u ghjornu. I mutivi di a so creazione sò descritti in a sezione "prublemi" à a fine di stu articulu.
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" - un tavulu cumpletu secondu a cundizione, cù u mutore ReplicatedAggregatingMergeTree (replicated AggregatingMergeTree). Questa tavula registra u numeru di metriche in entrata, suddivisu in 4 livelli di nidificazione.
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
Grafite+ClickHouse. Diagramma di interazzione cumpunenti
Grafite+ClickHouse. Migrazione di dati
Cumu ricurdamu da l'aspettattivi di stu prughjettu, a transizione à ClickHouse deve esse senza tempi di inattività; per quessa, avemu avutu à cambià in qualchì modu tuttu u nostru sistema di monitoraghju à u novu almacenamentu in u più trasparente pussibule per i nostri utilizatori.
Questu hè cumu avemu fattu.
Una regula hè stata aghjunta à carbon-c-relay per mandà un flussu supplementu di metriche à u carbon-clickhouse di unu di i servitori chì participanu à a replicazione di e tavule ClickHouse.
Avemu scrittu un picculu script in python, chì, utilizendu a libreria sussurru-dump, leghjite tutti i schedari .wsp da u nostru almacenamentu è mandatu questi dati à u carbon-clickhouse sopra descrittu in 24 fili. U numeru di valori metrici accettati in carbon-clickhouse hà righjuntu 125 milioni / min, è ClickHouse ùn hà mancu sudatu.
Avemu creatu un DataSource separatu in Grafana per debug e funzioni usate in i dashboards esistenti. Avemu identificatu una lista di funzioni chì avemu usatu, ma ùn sò micca implementati in carbonapi. Avemu aghjustatu queste funzioni è mandatu PR à l'autori di carbonapi (grazie speciale à elli).
Per cambià a carica di lettura in i paràmetri di l'equilibriu, avemu cambiatu l'endpoints da graphite-api (interfaccia API per Graphite + Whisper) à carbonapi.
Grafite+ClickHouse. risultati
riduzzione di l'utilizazione di u sottosistema di discu da 30% à 1%;
riduce a quantità di spaziu occupatu da 1 TB à 300 GB;
avemu a capacità di riceve 125 milioni di metriche per minutu in u servitore (picchi à u mumentu di a migrazione);
trasfirutu tutte e metriche à un intervallu di almacenamiento di trenta seconde;
ricivutu a replicazione di dati è a tolleranza di difetti;
cambiatu senza downtime;
Pigliò circa 7 settimane per compie tuttu.
Grafite+ClickHouse. Prublemi
In u nostru casu, ci sò stati qualchi trappule. Questu hè ciò chì avemu scontru dopu a transizione.
ClickHouse ùn rileghje micca sempre e cunfigurazioni à a mosca; à volte deve esse riavviatu. Per esempiu, in u casu di a descrizzione di u cluster di u zookeeper in a cunfigurazione ClickHouse, ùn hè micca stata utilizata finu à chì u clickhouse-server hè stata rebootata.
Grandi richieste di ClickHouse ùn anu micca passatu, cusì in graphite-clickhouse a nostra stringa di cunnessione ClickHouse pare cusì:
ClickHouse abbastanza spessu libera novi versioni di versioni stabili; ponu cuntene sorprese: attenti.
I cuntenituri creati dinamicamente in kubernetes mandanu un gran numaru di metriche cù una vita curta è aleatoria. Ùn ci hè micca assai punti per tali metriche, è ùn ci sò micca prublemi cù u spaziu. Ma quandu custruisce e dumande, ClickHouse piglia un gran numaru di sti stessi metrichi da a tavola "metrics". In 90% di i casi, ùn ci hè micca dati nantu à elli fora di a finestra (24 ore). Ma u tempu si spende per circà sta dati in a tavola di "dati", è in fine si mette in un timeout. Per risolve stu prublema, avemu cuminciatu à mantene una vista separata cù l'infurmazioni nantu à e metriche chì sò stati scontri durante u ghjornu. Cusì, quandu custruiscenu rapporti (grafichi) per cuntenituri creati dinamicamente, interroghemu solu quelli metrichi chì sò stati scontri in una data finestra, è micca per tuttu u tempu, chì hà acceleratu significativamente a custruzzione di rapporti nantu à elli. Per a suluzione descritta sopra, aghju cullatu graphite-clickhouse (forchetta), chì include l'implementazione di travaglià cù a tabella date_metrics.
Grafite+ClickHouse. Tags
Cù a versione 1.1.0 Graphite hè diventatu ufficiale tag di supportu. È pensemu attivamente à ciò chì è cumu fà per sustene sta iniziativa in a pila di grafite+clickhouse.
Grafite+ClickHouse. Rilevatore di anomalie
Basatu nantu à l'infrastruttura descritta sopra, avemu implementatu un prototipu di un detector di anomalie, è funziona! Ma più nantu à ellu in u prossimu articulu.