Monitooring teenusena: modulaarne sĂŒsteem mikroteenuste arhitektuuriks

TĂ€na meie projektis toimivad lisaks monoliitsele koodile ka kĂŒmned mikroteenused. IgaĂŒht nendest tuleb jĂ€lgida. Selliste mahtude puhul on DevOps-inseneride jĂ”ududes keeruline. Oleme vĂ€lja arendanud jĂ€lgimissĂŒsteemi, mis töötab teenusena arendajatele. Nad saavad ise kirjutada mÔÔdikud jĂ€lgimissĂŒsteemi, kasutada neid, luua nende pĂ”hjal armatuurlaudu ja ĂŒhendada neile hĂ€ireid, mis aktiveeruvad, kui piirvÀÀrtused on saavutatud. DevOps-insenerid on seotud vaid infrastruktuuri ja dokumentatsiooniga.

See postitus on minu esitluse salvestus meie sektori RIT++-l. Paljud palusid meil teha sealt tekstiversioone. Kui olite konverentsil vĂ”i vaatasite videot, siis ei leia te seal midagi uut. KĂ”igile teistele — tere tulemast allapoole. RÀÀgin, kuidas me sellise sĂŒsteemi juurde jĂ”udsime, kuidas see töötab ja kuidas plaanime seda uuendada.

Monitooring teenusena: modulaarne sĂŒsteem mikroteenuste arhitektuuriks

Minevik: skeemid ja plaanid

Kuidas me jĂ”udsime olemasoleva jĂ€lgimissĂŒsteemini? Sellele kĂŒsimusele vastamiseks tuleb tagasi minna 2015. aastasse. Nii see siis vĂ€lja nĂ€gi:

Monitooring teenusena: modulaarne sĂŒsteem mikroteenuste arhitektuuriks

Meil oli umbes 24 sĂ”lme, mis vastutasid jĂ€lgimise eest. Siin on hulk erinevaid crone, skripte, deemonite, mis mingil moel jĂ€lgivad, saadavad sĂ”numeid, tĂ€idavad funktsioone. MĂ”tlesime, et mida kaugemale, seda vĂ€hem on selline sĂŒsteem elujĂ”uline. Selle arendamine pole mĂ”istlik: liiga mahukas.
Otsustasime valida need jĂ€lgimise elemendid, mida jĂ€tame ja arendame, ja need, millest loobume. Nende hulk oli 19. JĂ€rele jĂ€id vaid grafiidid, agregaatid ja Grafana armatuurlaudade jaoks. Kuid kuidas nĂ€eb uus sĂŒsteem vĂ€lja? Nii:

Monitooring teenusena: modulaarne sĂŒsteem mikroteenuste arhitektuuriks

Meil on mÔÔdikute salvestus: need on grafiidid, mis pĂ”hinevad kiiretel SSD-diskidel, ja teatud agregaatide mÔÔdikud. Edasi — Grafana armatuurlaudade kuvamiseks ja Moira hĂ€irete tĂ”hususe jaoks. Samuti soovisime vĂ€lja töötada anomaaliate otsimisse sĂŒsteemi.

Standard: JĂ€lgimine 2.0

Nii nĂ€gid plaanid vĂ€lja 2015. aastal. Kuid me pidime ette valmistama mitte ainult infrastruktuuri ja teenuse ise, vaid ka dokumentatsiooni selle jaoks. Me töötasime vĂ€lja ettevĂ”tte standardi, mille nimetasime jĂ€lgimiseks 2.0. Millised olid nĂ”uded sĂŒsteemile?

  • pidev kĂ€ttesaadavus;
  • mÔÔdikute salvestusintervall = 10 sekundit;
  • struktureeritud metrikate ja juhtpaneelide salvestamine;
  • SLA > 99,99%
  • ĂŒrituste metrikate kogumine UDP kaudu (!).

Me vajasime UDP-d, kuna meil on suur liiklus ja sĂŒndmuste voog, mis genereerib metrikaid. Kui kirjutada kĂ”ik Graphite'i korraga, tahab salvestus kokku kukkuda. Samuti valisime kĂ”igi metrikate jaoks esmaklassilised prefiksid.

Monitooring teenusena: modulaarne sĂŒsteem mikroteenuste arhitektuuriks

Iga prefiks omab mĂ”nda omadust. On metrikad serverite, vĂ”rkude, konteinerite, ressursside, rakenduste ja nii edasi. On rakendatud selge, range ja tĂŒpiseeritud filtreerimine, kus me vĂ”tame esmaklassilised metrikad ja ĂŒlejÀÀnud lihtsalt lĂŒkkame kĂ”rvale. Nii me plaanisime seda sĂŒsteemi 2015. aastal. Mis on aga reaalsus?

Reaalsus: monitooringu komponentide interaktsiooni skeem

Esiteks jĂ€lgime rakendusi: meie PHP-koodi, rakendusi ja mikroteenuseid – sĂ”naga, kĂ”ike, mida meie arendajad kirjutavad. KĂ”ik rakendused saadavad UDP kaudu metrikad koondajale Brubeck (statsd, C-keeles ĂŒmber kirjutatud). Tulemuseks oli see, et see osutus sĂŒnteetiliste testide tulemusel kĂ”ige kiiremaks. Ning see saadab koondatud metrikad Graphite'i kaudu TCP.

Sel on selline metrikate tĂŒĂŒp nagu taimerid. See on ÀÀrmiselt mugav asi. NĂ€iteks igakord, kui kasutaja teenusega ĂŒhendust vĂ”tab, saadate Brubeck'i metrika response time. Kui miljon vastust saabus, antakse koondajale vaid 10 metrikat. Teil on teada tulnud inimeste arv, maksimaalne, minimaalne ja keskmine vastusaeg, mediaan ja 4 persentiili. SeejĂ€rel edastatakse andmed Graphite'i ja me nĂ€eme neid kĂ”ik reaalajas.

Samuti on meil andmete koondamine riistvara, tarkvara, sĂŒsteemsete metrikate ja meie vana monitooringusĂŒsteemi Munin jaoks (mis töötas meil kuni 2015. aastani). KĂ”ike seda kogume C-demoniga CollectD (millesse on sisse ehitatud terve hulk erinevaid pluginaid, mis oskab kĂŒsida kĂ”iki hostimise sĂŒsteemi ressursse, millele see on installitud, lihtsalt mÀÀrake konfiguratsioonis, kuhu andmed kirjutada) ja kirjutame andmed Graphite'i kaudu. Samuti toetab see python ja shell-skriptide pluginaid, nii et saate kirjutada oma kohandatud lahendusi: CollectD kogub neid andmeid kohalikult vĂ”i eemalt hostilt (kui eeldada, et seal on Curl) ja saadab need Graphite'i.

JÀtkame: kÔik mÔÔdikud, mida oleme kogunud, saadame Carbon-c-relay'le. See on Carbon Relay Graphitelt, C keeles tÀiustatud lahendus. See on ruuter, mis kogub endasse kÔik mÔÔdikud, mille me saadame oma aggregeerijatelt, ja suunab need nodidesse. Samuti kontrollib see suunamise etapis mÔÔdikute kehtivust. Esiteks peavad nad vastama sellele scheemile koos eelliidetega, mida ma varem nÀitasin, ja teiseks peavad nad olema Graphitele kehtivad. Vastasel juhul visatakse nad vÀlja.

Siis saadab Carbon-c-relay mÔÔdikud Graphite klastrisse. Kasutame peamise mÔÔdikute salvestusena Carbon-cache'i, mis on kirjutatud Go-s. Go-carbon ĂŒletab oma mitme töötluse tĂ”ttu oluliselt Carbon-cache'i jĂ”udlust. See vĂ”tab andmed enda alla ja salvestab need kettale kasutades whisperi paketti (tavaline, kirjutatud pythonis). Andmete lugemiseks meie salvestitest kasutame Graphite API-d. See töötab oluliselt kiiremini kui standardne Graphite WEB. Mis juhtub andmetega edasi?

Need lĂ€hevad Grafanasse. Peamise andmeallikana kasutame meie Graphite klastreid, pluss meil on Grafana veebiliides mÔÔdikute kuvamiseks ja armatuurlaudade koostamiseks. Iga teenuse arendaja loob oma armatuuri. SeejĂ€rel koostavad nad graafikuid, millel kuvatakse mÔÔdikud, mida nad oma rakendustest saadavad. Peale Grafana on meil ka SLAM. See on Pythonis kirjutatud demon, mis arvutab SLA-d Graphite andmete pĂ”hjal. Nagu ma juba ĂŒtlesin, on meil mitu tosinat mikroteenust, millest igaĂŒhel on oma nĂ”uded. SLAM-i abil vaatame dokumentatsiooni ja vĂ”rdleme seda Graphite'is oleva infoga, kontrollime, kui hĂ€sti nĂ”uded vastavad meie teenuste saadavusele.

JĂ€tkame: hĂ€irituse jĂ€lgimise sĂŒsteem. See on organiseeritud tugeva sĂŒsteemi, Moira, abil. See on iseseisev, kuna selle all on oma Graphite. Arendatud SКB 'Kontur' poolt, kirjutatud pythonis ja Go-s, tĂ€iesti avatud lĂ€htekoodiga. Moira saab endasse kĂ”ik sama voogu, mis suundub Graphite'idesse. Kui mingil pĂ”hjusel sureb teie salvestus, töötab teie hĂ€dahĂ€iresĂŒsteem ikka.

Moira on laotud Kubernetesesse ja see kasutab peamise andmebaasina Redis-serverite klastrit. Tulemuseks on talitlushĂ€irekindel sĂŒsteem. See vĂ”rdleb mÔÔdikute voogu triggereid loendiga: kui see ei sisalda nimetusi, siis visatakse mÔÔdiku andmed minema. Nii suudab see töödelda gigabaite mÔÔdikute andmeid minutis.

Lisaks integreerisime sellele ettevĂ”tte LDAP-i, mille abil saavad kĂ”ik ettevĂ”tte sĂŒsteemi kasutajad luua endale teateid olemasolevate (vĂ”i uute) triggereid pĂ”hjal. Kuna Moira sisaldab Graphite'i, toetab see kĂ”iki selle funktsioone. Esiteks vĂ”tate rea ja kopeerite selle Grafanasse. Vaadake, kuidas andmed graafikutel kuvatakse. SeejĂ€rel vĂ”tate selle sama rea ja kopeerite selle Moira-sse. Lisate sellele piirangud ja saate alarme. KĂ”ik see ei nĂ”ua mingeid spetsiifilisi teadmisi. Moira suudab genereerida teateid SMS-i, e-posti, Jira, Slack'i kaudu... Samuti toetab see kohandatud skriptide tĂ€itmist. Kui tal tekib trigger ja see on seotud kohandatud skripti vĂ”i binaariga, siis kĂ€ivitab ta selle ja annab sellele stdin-is JSON-i. SeetĂ”ttu peab teie programm selle parsima. Mida te selle JSON-iga teete, on teie otsustada. Kui soovite — saatke see Telegrammi, kui soovite — avage ĂŒlesandeid Jira's, tehke mida iganes.

Meie alarmeerimiseks kasutame ka oma arengut — Imagotag. Oleme kohandanud paneeli, mida tavaliselt kasutatakse poodides elektrooniliste hinnasiltide jaoks, meie vajaduste jaoks. Oleme sellele vĂ€lja toonud Moira triggereid. Seal on nĂ€idatud, millises olekus need on ja millal need toimusid. Osa arendusmeeskonnast loobus teavitustest Slack'is ja e-kirjas selle paneeli kasuks.

Monitooring teenusena: modulaarne sĂŒsteem mikroteenuste arhitektuuriks

Kuna oleme progressiivne ettevĂ”te, seetĂ”ttu seirasime selles sĂŒsteemis ka Kubernetes'i. LĂŒlitasime selle sĂŒsteemi lĂ€bi Heapsteri, mille paigaldasime klastrisse, mis kogub andmeid ja saadab need Graphite'i. Tulemuseks on jĂ€rgmine skeem:

Monitooring teenusena: modulaarne sĂŒsteem mikroteenuste arhitektuuriks

Monitooringu komponendid

Siin on linkide loend nende komponentide jaoks, mida kasutasime selle ĂŒlesande tĂ€itmiseks. KĂ”ik need on avatud lĂ€htekoodiga.

Graphite:

Carbon-c-relay:

github.com/grobian/carbon-c-relay

Brubeck:

github.com/github/brubeck

Collectd:

collectd.org

Moira:

github.com/moira-alert

Grafana:

grafana.com

Heapster:

github.com/kubernetes/heapster

Statistika

Ja natuke numbreid selle kohta, kuidas meie sĂŒsteem töötab.

Koguja (brubeck)

MÔÔdikute arv: ~ 300 000 / sec
MÔÔdikute saatmise intervall Graphitesse: 30 sec
Serveri ressursikasutus: ~ 6% CPU (tÀisfunktsionaalsed serverid); ~ 1Gb RAM; ~ 3 Mbps LAN

Graphite (go-carbon)

MÔÔdikute arv: ~ 1 600 000 / min
MÔÔdikute uuendamise intervall: 30 sec
MÔÔdikute sĂ€ilitamise skeem: 30sec 35d, 5min 90d, 10min 365d (annab ĂŒlevaate sellest, mis teenusega pikemas perspektiivis toimub)
Serveri ressursikasutus: ~ 10% CPU; ~ 20Gb RAM; ~ 30 Mbps LAN

Paindlikkus

Me hindame Avitos oma jĂ€lgimisteenuses paindlikkust. Miks see tĂ€pselt selline on? Esiteks on selle koostisosad omavahel asendatavad: nii komponendid kui ka nende versioonid. Teiseks — hooldatavus. Kuna kogu projekt on rajatud avatud lĂ€htekoodiga, saate ise koodi muuta, muudatusi sisse viia, luua funktsioone, mis ei ole vĂ€lja toodud. Kasutatakse ĂŒsna levinud tehnoloogiaid, peamiselt Go ja Python, seega on see ĂŒsna lihtne.

Siin on nĂ€ide tĂ”eliselt tekkinud probleemist. MÔÔdik Graphites on fail. Sellel on nimi. Faili nimi = mÔÔdiku nimi. Ja on tee selle juurde. Linuxis on failinimede pikkus piiratud 255 sĂŒmboliga. Ja meil on (siseprojektide “tellijatena”) inimesed andmebaasi osakonnast. Nad ĂŒtlevad meile: “Tahame jĂ€lgida oma SQL-pĂ€ringuid. Need ei ole 255 sĂŒmbolit, vaid 8 MB igaĂŒhe kohta. Tahame neid kuvada Grafanas, nĂ€ha selle pĂ€ringu parameetreid, ja veel parem, tahame nĂ€ha selliste pĂ€ringute topi. Oleks tore, kui see kuvataks reaalajas. Ja tĂ€iuslik oleks see sisse panna hĂ€iretesse.”

Monitooring teenusena: modulaarne sĂŒsteem mikroteenuste arhitektuuriks
SQL-pÀringu nÀide on toodud nÀiteks saidilt postgrespro.ru

Me tĂ”stame Redis serveri ja meie Collectd-pluginad, mis kĂ€ivad Postgreses ja vĂ”tavad sealt kĂ”ik andmed, saadame mÔÔdikud Graphite'i. Aga me asendame mÔÔdiku nime hash'ideks. See sama hash saadame samuti Redis'esse vĂ”tmena ja kogu SQL-pĂ€ringu vÀÀrtusena. Meil on jÀÀnud veel teha nii, et Grafana oskaks Redis'esse minna ja selle teabe kĂ€tte saada. Me avame Graphite API, kuna see on peamine liides kĂ”igi jĂ€lgimiskomponentide vahel, ja kirjutame sinna uue funktsiooni, mida kutsutakse aliasByHash() — Grafanast saame mÔÔdiku nime ja kasutame seda Redis'e pĂ€ringus vĂ”tmena, millele saame vastuseks vĂ”tme vÀÀrtuse, milleks on meie "SQL pĂ€ring". Nii oleme Grafanas vĂ€lja toonud SQL pĂ€ringu, mida seal muidu kuidagi ei saanud nĂ€idata, koos selle statistika (calls, rows, total_time, 
) nĂ€gemisega.

Summary

Saadavus. Meie jĂ€lgimisteenus on saadaval 24/7 igast rakendusest ja igast koodist. Kui teil on ligipÀÀs ladustamissĂŒsteemidele, vĂ”ite teenusele andmeid kirjutada. Keel ei ole oluline, lahendused ei ole olulised. Teil on vaja ainult teada, kuidas avada pesa, saata sinna mÔÔdik ja siis pesa sulgeda.

UsaldusvÀÀrsus. KÔik komponendid on talitlushÀireteta ja suudavad meie koormusi hÀsti taluda.

Madala sisenemise kĂŒnnis. Selle sĂŒsteemi kasutamiseks ei pea te Ă”ppima programmeerimiskeeli ega pĂ€ringuid Grafanas. Lihtsalt avage oma rakendus, kirjutage sinna pesa, mis saadab mÔÔdikud Graphite'i, sulgege see, avage Grafana, looge seal armatuurlaud ja vaadake oma mÔÔdikute kĂ€itumist, saades hoiatusi Moira kaudu.

Iseseisvus. Kogu seda saab teha iseseisvalt, DevOps- inseneride abita. Ja see on pealehakkamiseks ideaalne, kuna saate oma projekti jĂ€lgida kohe, kedagi ei pea paluma — ei alguses ega muudatuste tegemiseks.

Mille poole me pĂŒĂŒdleme?

KÔik allpool loetletud on mitte lihtsalt abstraktsed mÔtted, vaid see, mille suunal on tehtud vÀhemalt esimesed sammud.

  1. Anomaaliate tuvastaja. Tahame luua teenuse, mis lÀheb meie Graphite'i ladustamisse ja kontrollib iga mÔÔdiku erinevate algoritmide jÀrgi. Algoritmid on juba olemas, mida tahame vaadata, andmed on olemas, me oskame nendega töötada.
  2. Metaandmed. Meil on palju teenuseid, mis ajas muutuvad, samuti nagu ka inimesed, kes nendega töötavad. Dokumentatsiooni pidev kĂ€sitsi pidamine ei ole variant. SeetĂ”ttu integreerime praegu oma mikroteenustesse metaandmed. Seal on kirjas, kes selle arendas, milliste keeltega ta suhtleb, SLA nĂ”udmised, kuhu ja kellele saata teavitusi. Teenuse juurutamisel luuakse kĂ”ik andmed iseseisvalt. LĂ”puks saad kaks linki — ĂŒks triggerite jaoks, teine — Grafana armatuurlaudade jaoks.
  3. Seire iga koju. Usume, et sellisest sĂŒsteemist peaksid kĂ”ik arendajad kasutama. Sel juhul tead alati, kus on su liiklus, mis temaga toimub, kus see langeb, kus on nĂ”rgad kohad. Kui nĂ€iteks juhtub midagi, mis rikub su teenuse, saad sellest teada mitte telefonikĂ”nest haldurilt, vaid hĂ€iresignaalist ning saad kohe avada vĂ€rsked logid ja vaadata, mis juhtus.
  4. KĂ”rge jĂ”udlus. Meie projekt kasvab pidevalt ja tĂ€na töödeldakse selles umbes 2 000 000 mÔÔtmevÀÀrtust minutis. Aasta tagasi oli see number 500 000. Ja kasv jĂ€tkub, mis tĂ€hendab, et mĂ”ne aja pĂ€rast hakkab Graphite (whisper) vĂ€ga tugevalt koormama salvestussĂŒsteemi. Nagu ma juba ĂŒtlesin, on see seiresĂŒsteem ĂŒsna universaalne oma komponentide vahetatavuse tĂ”ttu. Keegi hooldab ja laiendab oma infrastruktuuri spetsiaalselt Graphite'i jaoks, kuid me otsustasime minna teist teed: kasutada ClickHouse kui meie mÔÔtmete salvestust. See ĂŒleminek on peaaegu lĂ”pule jĂ”udnud ning peagi rÀÀgin detailselt, kuidas see tehti: millised olid raskused ja kuidas need ĂŒletati, kuidas toimus migratsiooniprotsess, kirjeldan valitud komponentide sidumist ja nende seadistusi.

AitĂ€h tĂ€helepanu eest! Esitage oma kĂŒsimusi teema kohta, pĂŒĂŒan siin vĂ”i jĂ€rgnevates postitustes vastata. VĂ”ib-olla on kellelgi kogemusi sarnase seiresĂŒsteemi loomise vĂ”i Clickhouse'ile ĂŒlemineku osas — jagage neid kommentaarides.

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