MÔÔdikute salvestamine: kuidas me lÀksime Graphite+Whisperilt Graphite+ClickHousele

Tere kĂ”igile! Oma eelmisel artiklil Ma kirjutasin moodulmonitorimise sĂŒsteemi korraldamisest mikroteenuste arhitektuuris. Mitte miski ei seisa paigal, meie projekt kasvab pidevalt ning salvestatavate mÔÔdikute hulk suureneb samuti. Kuidas me korraldasime ĂŒlemineku Graphite+Whisperilt Graphite+ClickHouse'ile kĂ”rgete koormuste tingimustes, ootuste ja migratsiooni tulemustega, loe allpool.

MÔÔdikute salvestamine: kuidas me lÀksime Graphite+Whisperilt Graphite+ClickHousele

Enne kui rÀÀgin, kuidas korraldasime ĂŒlemineku mÔÔdikute hoidmisest Graphite+Whisperilt Graphite+ClickHouse'ile, tahaksin anda teavet selle otsuse pĂ”hjustest ja Whisperi puudustest, millega me pikka aega elasime.

Graphite+Whisperi probleemid

1. Suur koormus diskialusele

Ülemineku ajal jĂ”udis meile umbes 1,5 miljonit mÔÔdikut minutis. Sellise voo korral oli serverite diskikĂ€itus ~30%. Üldiselt oli see tĂ€iesti vastuvĂ”etav – kĂ”ik töötas stabiilselt, kirjutamine ja lugemine olid kiired... Kuni hetkeni, mil ĂŒks arendusmeeskond ei kĂ€ivitanud uut funktsiooni ning ei hakanud saatma meile 10 miljonit mÔÔdikut minutis. Siis sai diskialus tĂ”eliselt koormatud ning nĂ€gime 100% kĂ€itust. Probleem suudeti kiiresti lahendada, kuid jĂ€tsime selle mĂ€lestuse.

2. Replikatsiooni ja jÀrjepidevuse puudumine

TĂ”enĂ€oliselt nagu kĂ”ik, kes kasutavad/kasutasid Graphite+Whisperit, saatsime me sama mÔÔdikute voogu mitmele Graphite serverile, et tagada tĂ”rke talu. Sellega ei olnud erilisi probleeme – kuni hetkeni, mil ĂŒks server mingil pĂ”hjusel ei kukkunud. MĂ”nikord suutsime langetatud serveri piisavalt kiiresti uuesti ĂŒlesse saada ja carbon-c-relay jĂ”udis oma vahemĂ€lust sinna mÔÔdikuid laadida, kuid mĂ”nikord mitte. Siis oli mÔÔdikutel auk, mille me rsynciga kinni tĂ”mbasime. Protseduur oli piisavalt pikaajaline. Ainus, mis meid pÀÀstis, oli see, et selline olukord juhtus vĂ€ga harva. Samuti vĂ”tsime me perioodiliselt juhusliku mÔÔdikutega komplekti ja vĂ”rdlesime neid naapsete klastrinoodidega. Umbes 5% juhtudest oli mitmeid vÀÀrtusi erinevaid, mis meid ei rÔÔmustanud.

3. Suur mahukus

Kuna me kirjutame Graphite'sse mitte ainult infrastruktuuri, vaid ka Ă€rimeetreid (ja nĂŒĂŒd ka Kubernetesest saadud mÔÔtmeid), siis satume ĂŒsna tihti olukorda, kus mÔÔtmes on vaid mĂ”ned vÀÀrtused, samas kui .wsp-faili luuakse kogu sĂ€ilitustĂ€htaja arvesse vĂ”ttes, ja see nĂ”uab meie eelmise mahtude kohta umbes 2 MB. Probleemi sĂŒvendab ka see, et sarnaste failide arv aja jooksul suureneb ja nende pĂ”hjal aruandeid koostades kulub palju aega ja ressursse tĂŒhjade punktide lugemisele.

Tahaksin kohe mÀrkida, et eespool kirjeldatud probleemidega on vÔimalik erinevatel meetoditel ja erineva tÔhususega vÔidelda, kuid mida rohkem andmeid teile hakkab laekuma, seda tugevamaks need probleemid muutuvad.

Olemasoleva info (arvesse vÔttes eelnevat artikleid), samuti pidevalt kasvav mÔÔtmete hulk ja soov viia kÔik mÔÔtmed 30-sekundilise sÀilitusaegade juurde (vajadusel kuni 10 sekundit), otsustasime proovida Graphite+ClickHouse'i kui perspektiivset alternatiivi Whisperile.

Graphite+ClickHouse. Ootused

KĂŒlastades mitmeid Yandexi kohtumisi, lugedes paar artiklit Habrast, uurides dokumentatsiooni ja leides mĂ”istlikud komponendid ClickHouse'i Graphite'i ĂŒhendamiseks, otsustasime tegutseda!

Soovisime saavutada jÀrgmist:

  • vĂ€hendada kettaaluse kasutust 30%-lt 5%-le;
  • vĂ€hendada mahtu 1 TB-lt 100 GB-le;
  • omada vĂ”imalust vastu vĂ”tta 100 miljonit mÔÔdet minutis serverisse;
  • andmete replikatsioon ja tĂ”rkekindlus otse karbist;
  • mitte veeta selle projekti kallal aastat ning teha ĂŒleminek mĂ”istlikus ajavahemikus;
  • ĂŒlalpidamatuse vĂ€ltimine.

Piisavalt ambitsioonikas, eks?

Graphite+ClickHouse. Komponendid

Andmete saamiseks Graphite protokolli kaudu ja nende edasise salvestamise ClickHouse'is valiti carbon-clickhouse (golang).

Ajareadude hoidmiseks valiti toona kĂ”ige uuem ClickHouse'i stabiilne versioon 1.1.54253. Töösel sellega tekkis probleeme: logides ilmus tohutul hulgal vigu ja ei olnud selge, mida nendega teha. Arutades Roman Lomonosovi (carbon-clickhouse, graphite-clickhouse ja veel palju-palju muud autor) valiti vanem versioon 1.1.54236.Vead kadusid — kĂ”ik hakkas tööle suurepĂ€raselt.

Andmete lugemiseks ClickHouse'ist valiti graphite-slickhouse (golang). Graphite'i API-liidese jaoks — carbonapi (golang). ClickHouse'i tabelite vahel replikatsiooni korraldamiseks kasutati zookeeper. Meie armastatud meetrikate suunamiseks jĂ€tsime carbon-c-relay (C) (vt eelmist artiklit).

Graphite+ClickHouse. Tabelite struktuur

„graphite” — andmebaas, mille me koostasime monitorimistabelite jaoks.

„graphite.metrics” — tabel, millel on ReplicatedReplacingMergeTree (replitseeritav ReplacingMergeTree). Selles tabelis hoitakse meetrikate nimesid ja nende teid.

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” — tabel, millel on ReplicatedGraphiteMergeTree (replitseeritav GraphiteMergeTree). Selles tabelis hoitakse meetrikate vÀÀrtusi.

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” — tabel, mida tĂ€idetakse tingimuste alusel, ReplicatedReplacingMergeTree mootoriga. Sellesse tabelisse kirjutatakse kĂ”igi viimase pĂ€eva jooksul kokku puutunud meetrikate nimed. Loomise pĂ”hjused on kirjeldatud jaotises „Probleemid” selle artikli lĂ”pus.

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” — tabel, mida tĂ€idetakse tingimuste alusel, ReplicatedAggregatingMergeTree mootoriga (replitseeritav AggregatingMergeTree). Sellesse tabelisse kirjutatakse sisenenud meetrikate arv, kusjuures see on jaotatud kuni 4 taseme sĂŒgavusele.

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. Komponentide vaheline suhtlus

MÔÔdikute salvestamine: kuidas me lÀksime Graphite+Whisperilt Graphite+ClickHousele

Graphite+ClickHouse. Andmete migratsioon

Kuidas me mĂ€letame selle projekti ootusi, peaks ĂŒleminek ClickHouse'ile toimuma ilma katkestusteta, seega pidime leidma viisi, kuidas kogu meie monitorimissĂŒsteem sujuvalt uuele salvestusele ĂŒle viia, et meie kasutajad seda ei mĂ€rkaks.
Teostasime seda nii.

  • carbon-c-relay'le lisasime reegli, et saata lisakanal meetrikatest carbon-clickhouse'i ĂŒhe serveri kaudu, mis osaleb ClickHouse tabelite replitseerimises.

  • Kirjutasime vĂ€ikese skripti Pythonis, mis kasutas whisper-dump raamatukogu, et lugeda kĂ”iki .wsp-faile meie hoidlast ja edastada need andmed eelpool nimetatud carbon-clickhouse'ile 24 lĂ”ngas. Sissetulevate mÔÔdikate arv carbon-clickhouse'is ulatus 125 mln/min ning ClickHouse ei mĂ€rganud isegi pinget.

  • Loomasime Grafanas eraldi andmeallika, et siluda olemasolevates armatuurlaudades kasutatavaid funktsioone. Tuvastasime nimekirja funktsioonidest, mida kasutasime, kuid need polnud carbonapi-s rakendatud. Kirjutasime need funktsioonid juurde ja saatsime PR'id carbonapi autoritele (eriline tĂ€nu neile).

  • Lugemiskoormuse ĂŒmbersuunamiseks muutsime koormuse tasakaalustajates lĂ”pp-punkte graphite-api (Graphite+Whisperi API) carbonapi-ks.

Graphite+ClickHouse. Tulemused

  • vĂ€hendasime ketasĂŒsteemi kasutust 30%lt 1%ni;

    MÔÔdikute salvestamine: kuidas me lÀksime Graphite+Whisperilt Graphite+ClickHousele

  • vĂ€hendasime kogumahtu 1 TB-lt 300 GB-le;
  • meil on vĂ”imalus vastu vĂ”tta 125 mln mÔÔdikate minutis serverisse (tipud migreerimise hetkel);
  • ĂŒle viisime kĂ”ik mÔÔdikad kolmekĂŒmnesekundiliste sĂ€ilitusaegadele;
  • saime andmete replikatsiooni ja talitluse usaldusvÀÀrsuse;
  • ĂŒlemineku korraldasime katkestusteta;
  • kĂ”igega kulus meil umbes 7 nĂ€dalat.

Graphite+ClickHouse. Probleemid

Kahjuks ei lĂ€inud meie puhul kĂ”ik valutult. Siin on, millega pĂ€rast ĂŒleminekut silmitsi seisisime.

  1. ClickHouse ei loe alati konfigureerimise faile reaalajas, mĂ”nikord tuleb see taaskĂ€ivitada. NĂ€iteks, klastrikirjeldust zookeeper’is ClickHouse konfiguraatoris ei rakendatud enne clickhouse-server’i taaskĂ€ivitamist.
  2. Suurte ClickHouse pĂ€ringute lĂ€bimine ei Ă”nnestunud, seetĂ”ttu nĂ€eb meie graphite-clickhouse ĂŒhenduse rea ClickHouse'iga vĂ€lja nii:
    url = "http://localhost:8123/?max_query_size=268435456&max_ast_elements=1000000"
  3. ClickHouse'is ilmuvad suhteliselt tihti uued stabiilsed versioonid, need vĂ”ivad tuua ĂŒllatusi: olge ettevaatlik.
  4. DĂŒnaamiliselt loodud konteinerid kubernetes saadavad suurt hulka mÔÔdikuid lĂŒhikese ja juhusliku elueaga. Selliste mÔÔdikute punkte ei ole palju ja ruumi probleemidega pole. Kuid ClickHouse'i pĂ€ringute koostamisel tĂ”stetakse tohutult neid samu mÔÔdikuid tabelist ‘metrics’. 90% juhtudest puuduvad nende andmed akna (24 tunni) jooksul. Kuid nende andmete leidmiseks tabelis ‘data’ kulub aega ja lĂ”puks jĂ”uab see ajaĂŒlesande piiranguni. Selle probleemi lahendamiseks hakkasime pidama eraldi vaadet, kus on teave mÔÔdikute kohta, mis ilmnesid ĂŒhe pĂ€eva jooksul. Seega, aruannete (graafikute) koostamisel dĂŒnaamiliselt loodud konteinerite kohta kĂŒsime ainult neid mÔÔdikuid, mis ilmnesid antud akna jooksul, mitte kogu aja jooksul, mis kiirendas nende aruannete koostamist mitu korda. Ülaltoodud lahenduse jaoks koostati graphite-clickhouse (fork), mis sisaldab teostust tabeliga date_metrics töötamiseks.

Graphite+ClickHouse. MĂ€rgistused

Alates versioonist 1.1.0 on Graphite ametlikult toetanud mÀrke. Ja me mÔtleme aktiivselt, mida ja kuidas teha, et seda algatust graphite+clickhouse tehnoloogias toetada.

Graphite+ClickHouse. Anomaaliate detektor

Ülaltoodud infrastruktuuri baasil oleme ellu viinud anomaaliate detektori prototĂŒĂŒbi ja see töötab! Kuid sellest — jĂ€rgmises artiklis.

Tellige, vajutage ĂŒlespoole ja olge Ă”nnelikud!

Allikas: habr.com

Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid | ProHoster