Tere kĂ”igile! Oma 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.

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 ), 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 , 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 (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 (carbon-clickhouse, graphite-clickhouse ja veel palju-palju muud autor) valiti vanem Vead kadusid â kĂ”ik hakkas tööle suurepĂ€raselt.
Andmete lugemiseks ClickHouse'ist valiti (golang). Graphite'i API-liidese jaoks â (golang). ClickHouse'i tabelite vahel replikatsiooni korraldamiseks kasutati . Meie armastatud meetrikate suunamiseks jĂ€tsime (C) .
Graphite+ClickHouse. Tabelite struktuur
âgraphiteâ â andmebaas, mille me koostasime monitorimistabelite jaoks.
âgraphite.metricsâ â tabel, millel on ReplicatedReplacingMergeTree (replitseeritav ). 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 ). 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 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 ). 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, PrefixGraphite+ClickHouse. Komponentide vaheline suhtlus

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;

- 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.
- 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.
- 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" - ClickHouse'is ilmuvad suhteliselt tihti uued stabiilsed versioonid, need vĂ”ivad tuua ĂŒllatusi: olge ettevaatlik.
- 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 , mis sisaldab teostust tabeliga date_metrics töötamiseks.
Graphite+ClickHouse. MĂ€rgistused
Alates versioonist 1.1.0 on Graphite ametlikult . 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

