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.

Almacenamiento metricu: cumu avemu passatu da Graphite+Whisper à Graphite+ClickHouse

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.

Sceltu per leghje dati da ClickHouse grafite-clickhouse (golang). Cum'è una API per Graphite - carbonapi (golang). ClickHouse hè stata utilizata per urganizà a replicazione trà e tavule zookeeper. Per e metriche di routing, avemu lasciatu u nostru amatu relé carbone-c (C) (vede l'articulu precedente).

Grafite+ClickHouse. Struttura di a tavola

"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.

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" - 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

Almacenamiento metricu: cumu avemu passatu da Graphite+Whisper à Graphite+ClickHouse

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

    Almacenamiento metricu: cumu avemu passatu da Graphite+Whisper à Graphite+ClickHouse

  • 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.

  1. 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.
  2. Grandi richieste di ClickHouse ùn anu micca passatu, cusì in graphite-clickhouse a nostra stringa di cunnessione ClickHouse pare cusì:
    url = "http://localhost:8123/?max_query_size=268435456&max_ast_elements=1000000"
  3. ClickHouse abbastanza spessu libera novi versioni di versioni stabili; ponu cuntene sorprese: attenti.
  4. 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.

Abbonate, appughjà a freccia su è esse felice!

Source: www.habr.com

Add a comment