Tere, kĂ”igile! Oma olen kirjutanud mikroteenuste arhitektuuri modulaarsĂŒsteemi jĂ€lgimise korraldamisest. Miski ei seisa paigal, meie projekt kasvab pidevalt ning salvestatavate mÔÔdikute arv samuti. Kuidas me korraldasime ĂŒlemineku Graphite+Whisperilt Graphite+ClickHouse'ile kĂ”rgete koormuste tingimustes, ootustest selle suhtes ja migreerimise tulemustest lugege allpool.

Enne kui rÀÀgin, kuidas me korraldasime ĂŒlemineku Graphite+Whisperilt Graphite+ClickHouse'ile, tahaksin jagada teavet sellise otsuse vastuvĂ”tmise pĂ”hjuste ja Whisperi puuduste kohta, millega oleme pikka aega elanud.
Graphite+Whisperi probleemid
1. KĂ”rge koormus ketasĂŒsteemile
Kui meile ĂŒle mindi, tuli umbes 1,5 miljonit mÔÔdikut minutis. Sellise mahuga oli serverite ketaste kasutus umbes 30%. Ăldiselt oli see tĂ€iesti vastuvĂ”etav â kĂ”ik toimis stabiilselt, kirjutas kiiresti, luges kiiresti... Kuni hetkeni, mil ĂŒks arendusmeeskond kĂ€ivitas uue funktsiooni ja hakkas meile saatma 10 miljonit mÔÔdikut minutis. Siis lĂ€ks ketasĂŒsteem tĂ”eliselt koormusse ja nĂ€gime 100% kasutust. Probleem suudeti kiiresti lahendada, kuid maitse jĂ€i.
2. Replikatsiooni ja jÀrjepidevuse puudumine
TĂ”enĂ€oliselt, nagu kĂ”ik, kes on kasutanud /kasutavad Graphite+Whisper, saatsime me sama mÔÔdikute voolu mitmele Graphite-serverile, et saavutada juurutatud usaldusvÀÀrsus. Sellega ei olnud erilisi probleeme â kuni hetkeni, mil ĂŒks server mingil pĂ”hjusel ei kukkunud. MĂ”nikord suutsime kukkunud serveri piisavalt kiiresti ĂŒles tĂ”sta, ja carbon-c-relay jĂ”udis selle kasti sisestada mÔÔdikud oma vahemĂ€lust, mĂ”nikord aga mitte. Ja siis jĂ€i mÔÔdikutesse auk, mille me tĂ€itsime rsync`i abil. Protseduur oli piisavalt pikk. Aitas ainult see, et selline asi juhtus vĂ€ga harva. Samuti vĂ”tsime aeg-ajalt juhusliku mÔÔdikute komplekti ja vĂ”rdlesime neid teiste samalaadsete andmetega naabernodes klastris. Umbes 5% juhtudest erinevad mĂ”ned vÀÀrtused, mis ei olnud meelepĂ€rane.
3. Suur ruumihulk
Kuna me kirjutame Graphitese mitte ainult infrastruktuuri, vaid ka Ă€rinĂ€itajaid (ja nĂŒĂŒd isegi Kubernetesest tulevaid nĂ€itajaid), siis satume ĂŒsna sageli olukorda, kus nĂ€itajas on ainult mĂ”ned vÀÀrtused, samas kui .wsp-faili luuakse kogu sĂ€ilitamisperioodi arvesse vĂ”ttes ja see vĂ”tab ettenĂ€htud mĂ€lu, mis meile oli umbes 2 MB. Probleemi sĂŒvendab veel see, et selliseid faile tekib aja jooksul vĂ€ga palju ning aruande koostamisel nende ĂŒle kulub arvukate tĂŒhjade punktide lugemisele palju aega ja ressursse.
Tahaks kohe mÀrkida, et eespool kirjeldatud probleemidega saab tÔhusalt vÔidelda erinevate meetoditega, kuid mida rohkem andmeid te hajate, seda teravamaks need probleemid muutuvad.
Kuna meil on kÔik eeltoodud (arvestades eelnevat ), samuti pidev kasv saadud nÀitajate arvu osas ja soov viia kÔik nÀitajad 30-sekundit sÀilitamisintervallile (vajadusel kuni 10 sekundit), otsustasime proovida Graphite+ClickHouse kui perspektiivikat alternatiivi Whisperile.
Graphite+ClickHouse. Ootused
KĂŒlastades mitmeid Yandexi ĂŒritusi ja lugedes , lĂ€bivaatamisel dokumentatsiooni ja leidmisel mĂ”istlikke komponente ClickHouse'i Graphite'i sidumiseks, otsustasime tegutsema asuda!
Soovisime saavutada jÀrgmist:
- vĂ€heneda ketasĂŒsteemi kasutamine 30%-lt 5%-le;
- vÀhendada hÔivatud ruumi 1TB-lt 100GB-le;
- omada vÔimet vastu vÔtta 100 miljonit mÔÔtme minutis serverisse;
- andmete replikatsioon ja tÔrke kestvus vÀlja pakutud lahenduses;
- mitte viibida selle projekti juures aastat, vaid teha ĂŒleminek mĂ”istliku aja jooksul;
- lĂŒlituda ilma seisakuta.
Seda on ĂŒsna ambitsioonikas, eks?
Graphite+ClickHouse. Komponendid
Andmete saamiseks Graphite'i protokolli kaudu ja nende edasiseks salvestamiseks ClickHouse'i, valiti (golang).
Ajavahemike salvestamiseks valiti selle hetke uusim ClickHouse'i stabiilne versioon 1.1.54253. Selle kasutamisel esines probleeme: logides ilmnes palju vigu ja ei olnud pĂ€ris selge, mida nendega teha. Koos (carbon-clickhouse, graphite-clickhouse ja veel paljude muude autor) valiti vanem Vead kadusid â kĂ”ik hakkas tööle suurepĂ€raselt.
Andmete lugemiseks ClickHouse'ist valiti (golang). Graphite'i API-liidese jaoks â (golang). Klientide vahelise replikatsiooni korraldamiseks ClickHouse'i tabelite vahel kasutati . Meie vĂ€ga armastatud jaoks metrikate suunamiseks jĂ€tsime (C) .
Graphite+ClickHouse. Tabelite struktuur
âgraphiteâ â andmebaas, mille lĂ”ime jĂ€lgimistabelite jaoks.
âgraphite.metricsâ â tabel ReplikaadiAsendavaMerePuuna (replicating ). See tabel sisaldab metrikate nimesid ja teede viiteid.
Loo tabel graphite.metrics ( KuupĂ€ev KuupĂ€ev, Tase UInt32, Tee String, Kustutatud UInt8, Versioon UInt32 ) MOOTOR = ReplikaadiAsendavaMerePuuna('/clickhouse/tables/replicator/graphite.metrics', âr1â, KuupĂ€ev, (Tase, Tee), 8192, Versioon);âgraphite.dataâ â tabel ReplikaadiGraafikaMerePuuna (replicating ). See tabel sisaldab metrikate vÀÀrtusi.
Loo tabel graphite.data ( Tee String, VÀÀrtus Float64, Aeg UInt32, KuupĂ€ev KuupĂ€ev, Ajatemperatuur UInt32 ) MOOTOR = ReplikaadiGraafikaMerePuuna('/clickhouse/tables/replicator/graphite.data', 'r1', KuupĂ€ev, (Tee, Aeg), 8192, 'graphite_rollup')âgraphite.date_metricsâ â tingimuse alusel tĂ€idetav tabel, ReplikaadiAsendavaMerePuuna mootoriga. Selles tabelis salvestatakse kĂ”ikide metrikate nimed, mis on pĂ€eva jooksul esinenud. Loomise pĂ”hjused on kirjeldatud jaotises kĂ€esoleva artikli lĂ”pus.
LOO KERQUJUK 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, mis tĂ€idetakse tingimustes, ReplicatedAggregatingMergeTree (replicating) ). Sellesse tabelisse salvestatakse sissetulevate mÔÔdikute arv, eraldiseisvusega kuni 4 taseme sĂŒgavusest.
LOO KERQUJUK 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. Komponentide koostöö skeem

Graphite+ClickHouse. Andmete rÀndamine
Kuna me mĂ€letame, olid oodata, et see projekt peaks toimuma ilma katkestusteta, seega pidime me viima kogu meie seire sĂŒsteemi uude salvestusse nii, et see oleks meie kasutajatele vĂ”imalikult lĂ€bipaistev.
Me tegime seda nii.
carbon-c-relay'le on lisatud reegel, et saata tĂ€iendav mÔÔdikute voog carbon-clickhouse'i ĂŒhest serverist, mis osaleb ClickHouse tabelite replikatsioonis.
Kirjutasime vĂ€ikese python skripti, mis kasutas whisper-dump teeki, et lugeda meie salvestusest vĂ€lja kĂ”ik .wsp-failid ja saata need andmed ĂŒlalmainitud carbon-clickhouse'i 24 voogus. Saadetud mÔÔdikute vÀÀrtuste arv carbon-clickhouse'is ulatus 125 miljonini minutis, ja ClickHouse ei vĂ€sinud isegi.
Loomisime Grafanas eraldi DataSource'i, et testida funktsioone, mida kasutatakse olemasolevates armatuurlaudades. Tuvasime loendi funktsioonidest, mida kasutasime, kuid need ei olnud carbonapi's rakendatud. Kirjutasime need funktsioonid juurde ja saatsime PR'id carbonapi autoritele (teise kordame nendele tÀnu).
- Lugemisekoormuse vahetamiseks muutsime tasakaalustajate seadetes lÔpp-punkte graphite-api'lt (Graphite + Whisperi API liides) carbonapi'le.
Graphite + ClickHouse. Tulemused
vĂ€hendasime diskisĂŒsteemi kasutust 30%-lt 1%-ni;

- vÀhendasime hÔivatava ruumi 1 TB-lt 300 GB-le;
- saame vastu vÔtta 125 miljonit mÔÔdikut minutis serverisse (tipud migreerimise ajal);
- oleme kĂ”ik mÔÔdikud viinud kolmekĂŒmne sekundi sĂ€ilitamisintervallile;
- saime andmete replikatsioon ja tÔrkeotsing;
- lĂŒlitusime suutmata katkestusteta;
- kulutasime sellele umbkaudu 7 nÀdalat.
Graphite+ClickHouse. Probleemid
Meie olukord ei lahenenud ilma tagasilöögita. Siin on, millega me silmitsi seisime pĂ€rast ĂŒleminekut.
- ClickHouse ei loe konfigureerimisi alati automaatselt, mĂ”nikord tuleb seda taaskĂ€ivitada. NĂ€iteks, kui tegemist on zookeeperi klastriga ClickHouse'i konfiguratsioonis â see ei rakendunud enne clickhouse-serveri taaskĂ€ivitamist.
- Suurte ClickHouse pĂ€ringute kaudu ei saadud lĂ€bi, seega nĂ€eb meie graphite-clickhouse ĂŒhenduse string ClickHouse'iga vĂ€lja niimoodi:
url = "http://localhost:8123/?max_query_size=268435456&max_ast_elements=1000000" - ClickHouse'is ilmub ĂŒsna tihti uusi stabiilsete versioonide vĂ€ljaandeid, milles vĂ”ivad olla ĂŒllatused: ole ettevaatlik.
- DĂŒnaamiliselt loodud konteinerid Kuberneteses saadavad suures koguses mÔÔdikute andmeid lĂŒhikese ja juhusliku elueaga. Selliseid mÔÔdikute punkte on vĂ€he ja ruumi probleemidega ei ole. Kuid ClickHouse'i pĂ€ringute koostamisel tĂ”stab see tohutult palju neid mÔÔdikute andmeid tabelist 'metrics'. 90% juhtudel puuduvad nende andmed antud ajavahemikus (24 tundi). Aeg, mis kulub nende andmete leidmiseks tabelist 'data', on samuti tĂ€helepanuvÀÀrne ja lĂ”ppkokkuvĂ”ttes ulatub see ajapiirangute tĂ”ttu ajaĂŒlevaatusse. Selle probleemi lahendamiseks hakkasime pidama eraldi vaadet mÔÔdikute kohta, mis leiti ĂŒhe pĂ€eva jooksul. SeetĂ”ttu kĂŒsitleme aruandeid (grafikuid) koostades dĂŒnaamiliselt loodud konteinerite kohta ainult neid mÔÔdikuid, mis leiti mÀÀratud ajavahemiku jooksul, mitte kogu ajaloos, mis kiirendas nende aruannete koostamist mĂ€rkimisvÀÀrselt. Ălaltoodud lahenduse jaoks on koostatud , sealhulgas rakenduse rakendamine tabeliga date_metrics.
Graphite+ClickHouse. Silte
Versioonist 1.1.0 hakkas Graphite ametlikult . Ja me mÔtleme aktiivselt, mida ja kuidas tuleks teha, et toetada seda algatust graphite+clickhouse virnas.
Graphite+ClickHouse. Anomaaliate avastamise sĂŒsteem
Ălaltoodud infrastruktuuri pĂ”hjal oleme loonud anomaaliate avastamise prototĂŒĂŒbi, ja see töötab! Kuid sellest rÀÀgime jĂ€rgmises artiklis.
Tellige, vajutage ĂŒlespoole noolt ja olge Ă”nnelikud!
Allikas: habr.com

