Iwwerwaachung als Service: e modulare System fir Mikroservicearchitektur

Haut, nieft dem monolithesche Code, enthält eise Projet Dosende vu Mikroservicer. Jiddereng vun hinnen erfuerdert iwwerwaacht ginn. Dëst op esou enger Skala ze maachen mat DevOps Ingenieuren ass problematesch. Mir hunn en Iwwerwaachungssystem entwéckelt deen als Service fir Entwéckler funktionnéiert. Si kënnen onofhängeg Metriken an d'Iwwerwaachungssystem schreiwen, se benotzen, Dashboards baséieren op hinnen, an Alarmer un hinnen befestigen, déi ausgeléist ginn wann d'Schwellwäerter erreecht ginn. Fir DevOps Ingenieuren, nëmmen Infrastruktur an Dokumentatioun.

Dëse Post ass en Transkript vu menger Ried mat eisem Rubriken bei RIT++. Vill Leit hunn eis gefrot fir vun do aus Textversioune vu Berichter ze maachen. Wann Dir op der Konferenz war oder de Video gekuckt hutt, fannt Dir näischt Neies. An all aner - wëllkomm op der Kaz. Ech soen Iech wéi mir zu sou engem System komm sinn, wéi et funktionnéiert a wéi mir plangen et ze aktualiséieren.

Iwwerwaachung als Service: e modulare System fir Mikroservicearchitektur

D'Vergaangenheet: Schemaen a Pläng

Wéi si mer zum aktuellen Iwwerwaachungssystem ukomm? Fir dës Fro ze beäntweren, musst Dir op 2015 goen. Sou huet et dann ausgesinn:

Iwwerwaachung als Service: e modulare System fir Mikroservicearchitektur

Mir haten ongeféier 24 Noden déi verantwortlech waren fir d'Iwwerwaachung. Et gëtt e ganze Pak vu verschiddene Krounen, Scripten, Daemonen déi iergendwéi eppes iwwerwaachen, Messagen schécken a Funktiounen ausféieren. Mir hu geduecht, wat ee méi wäit geet, wat esou ee System manner liewensfäeg wier. Et huet kee Sënn et z'entwéckelen: et ass ze ëmständlech.
Mir hu beschloss déi Iwwerwaachungselementer ze wielen déi mir behalen an entwéckelen, an déi déi mir opginn. Et waren der der 19. Nëmmen graphites, aggregators an Grafana als Dashboard bliwwen. Awer wéi wäert den neie System ausgesinn? Esou:

Iwwerwaachung als Service: e modulare System fir Mikroservicearchitektur

Mir hunn eng Metrikspäicherung: dëst si Graphiten, déi op schnelle SSD-Laufwerke baséieren, dëst si gewësse Aggregater fir Metriken. Nächst - Grafana fir Dashboards ze weisen an Moira fir Alarm. Mir wollten och e System entwéckelen fir no Anomalien ze sichen.

Standard: Iwwerwachung 2.0

Esou hunn d’Pläng 2015 ausgesinn. Mir hunn awer net nëmmen d’Infrastruktur an de Service selwer misse virbereeden, mä och d’Dokumentatioun dofir. Mir hunn e Firmestandard fir eis selwer entwéckelt, dee mir Iwwerwaachung 2.0 nennen. Wat waren d'Ufuerderunge fir de System?

  • konstant Disponibilitéit;
  • Metrik Späicherintervall = 10 Sekonnen;
  • strukturéiert Späichere vu Metriken an Dashboards;
  • SLA > 99,99%
  • Sammlung vun Event Metriken iwwer UDP (!).

Mir brauche UDP well mir e grousse Flux vum Traffic an Eventer hunn déi Metriken generéieren. Wann Dir se all an d'Grafit gläichzäiteg schreift, wäert d'Späichere kollapsen. Mir hunn och Präfixe vum éischte Niveau fir all Metrik gewielt.

Iwwerwaachung als Service: e modulare System fir Mikroservicearchitektur

Jiddereng vun den Präfixe huet e puer Propriétéit. Et gi Metriken fir Serveren, Netzwierker, Container, Ressourcen, Uwendungen, asw. Kloer, strikt, getippten Filteren ass ëmgesat ginn, wou mir éischt-Niveau Metriken akzeptéieren an einfach de Rescht falen. Esou hu mir dëse System am Joer 2015 geplangt. Wat ass am Moment?

Presentéieren: Diagramm vun der Interaktioun vu Iwwerwaachungskomponenten

Als éischt iwwerwaache mir Uwendungen: eise PHP Code, Uwendungen a Mikroservicer - kuerz, alles wat eis Entwéckler schreiwen. All Applikatioune schécken Metriken iwwer UDP un de Brubeck Aggregat (statsd, ëmgeschriwwen an C). Et huet sech als déi schnellsten an syntheteschen Tester erausgestallt. An et schéckt déi scho aggregéiert Metriken op Graphite iwwer TCP.

Et huet eng Aart vu Metriken genannt Timer. Dëst ass eng ganz bequem Saach. Zum Beispill, fir all Benotzerverbindung zum Service, schéckt Dir eng Metrik mat Äntwertzäit op Brubeck. Eng Millioun Äntwerte koumen eran, awer den Aggregator huet nëmmen 10 Metriken zréckginn. Dir hutt d'Zuel vun de Leit, déi komm sinn, déi maximal, minimum an duerchschnëttlech Äntwertzäit, de Median a 4 Prozent. Da ginn d'Donnéeën op Graphite transferéiert a mir gesinn alles live.

Mir hunn och Aggregatioun fir Metriken op Hardware, Software, Systemmetriken an eisen alen Munin Iwwerwaachungssystem (et huet fir eis bis 2015 geschafft). Mir sammelen dat alles duerch den C Daemon CollectD (et huet e ganze Pak vu verschiddene Plugins dran agebaut, et kann all d'Ressourcen vum Hostsystem pollen, op deem se installéiert ass, spezifizéiere just an der Konfiguratioun wou d'Donnéeën ze schreiwen) an schreift d'Donnéeën op Graphite duerch. Et ënnerstëtzt och Python Plugins a Shell Scripten, sou datt Dir Är eege personaliséiert Léisunge schreift: CollectD sammelt dës Donnéeën vun engem lokalen oder Fernhost (unhuelen Curl) a schéckt se op Graphite.

Da schécken mir all Metriken, déi mir gesammelt hunn, op Carbon-c-Relais. Dëst ass d'Carbon Relais Léisung vu Graphite, modifizéiert am C. Dëst ass e Router deen all Metriken sammelt déi mir vun eisen Aggregatoren schécken an se an d'Knäppchen routes. Och an der Routingstadium kontrolléiert et d'Validitéit vun de Metriken. Als éischt musse se dem Präfixschema entspriechen, deen ech virdru gewisen hunn an zweetens si se gëlteg fir Grafit. Soss falen se.

Kuelestoff-c-Relais schéckt dann d'Metriken an de Graphite-Cluster. Mir benotzen Carbon-Cache, ëmgeschriwwen an Go, als Haaptlagerung vu Metriken. Go-Carbon, wéinst senger Multithreading, ass vill besser wéi Carbon-Cache. Et kritt Daten a schreift se op Disken mat dem Whisper Package (Standard, am Python geschriwwen). Fir Daten aus eise Späicher ze liesen, benotze mir d'Graphite API. Et ass vill méi séier wéi Standard Graphite WEB. Wat geschitt dann mat den Donnéeën?

Si ginn op Grafana. Mir benotzen eis Graphitcluster als Haaptquell vun Daten, plus mir hunn Grafana als Webinterface fir Metriken ze weisen an Dashboards ze bauen. Fir jiddereng vun hire Servicer erstellen d'Entwéckler hiren eegene Dashboard. Da bauen se Grafike baséiert op hinnen, déi d'Metriken weisen, déi se aus hiren Uwendungen schreiwen. Nieft Grafana hu mir och SLAM. Dëst ass e Python Dämon deen SLA berechent baséiert op Daten aus Grafit. Wéi ech scho gesot hunn, hu mir e puer Dutzend Mikroservicer, déi jidderee seng eegen Ufuerderungen huet. Mat SLAM gi mir op d'Dokumentatioun a vergläichen et mat deem wat am Graphite ass a vergläichen wéi gutt d'Ufuerderunge mat der Disponibilitéit vun eise Servicer passen.

Loosst eis méi wäit goen: Alarméieren. Et ass organiséiert mat engem staarke System - Moira. Et ass onofhängeg well et säin eegene Graphite ënner der Hood huet. Entwéckelt vun de Kärelen aus SKB "Kontur", geschriwwen am Python a Go, komplett Open Source. D'Moira kritt dee selwechte Floss deen an d'Graphite geet. Wann aus iergendengem Grond Är Lagerung stierft, funktionnéiert Är Alarm nach ëmmer.

Mir hunn Moira a Kubernetes ofgesat; et benotzt e Cluster vu Redis Serveren als Haaptdatenbank. D'Resultat war e Feeler-tolerant System. Et vergläicht de Stroum vu Metriken mat der Lëscht vun Ausléiser: wann et keng Ernimmungen dra sinn, da fällt d'Metrik. Also ass et fäeg gigabytes vu Metriken pro Minutt ze verdauen.

Mir hunn och e Corporate LDAP derbäi befestegt, mat der Hëllef vun deem all Benotzer vum Firmesystem Notifikatioune fir sech selwer op Basis vun existéierenden (oder nei erstallten) Ausléiser erstellen kann. Zënter Moira enthält Graphite, et ënnerstëtzt all seng Funktiounen. Also huelt Dir als éischt d'Linn a kopéiert se an Grafana. Kuckt wéi d'Donnéeën op de Grafike ugewise ginn. An dann huelt Dir déiselwecht Linn a kopéiert se an d'Moira. Dir hänkt et mat Grenzen a kritt eng Alarm beim Ausgang. Fir dëst alles ze maachen, brauch Dir keng spezifesch Wëssen. Moira kann iwwer SMS, E-Mail, Jira, Slack alarméieren ... Et ënnerstëtzt och d'Ausféierung vu personaliséierte Scripten. Wann en Ausléiser mat hirem geschitt, a si ass op e personaliséierte Skript oder Binär abonnéiert, leeft se et a schéckt JSON op stdin fir dës Binär. Deementspriechend muss Äre Programm et parséieren. Wat Dir mat dësem JSON maache wäert ass un Iech. Wann Dir wëllt, schéckt et op Telegram, wann Dir wëllt, oppen Aufgaben am Jira, maacht wat och ëmmer.

Mir benotzen och eis eegen Entwécklung fir Alarm - Imagotag. Mir hunn de Panel adaptéiert, deen normalerweis fir elektronesch Präisstags an de Geschäfter benotzt gëtt, fir eise Besoinen ze passen. Mir hunn Ausléiser vum Moira matbruecht. Et weist an wéi engem Zoustand se sinn a wéini se geschitt sinn. E puer vun den Entwécklungsleit hunn Notifikatiounen am Slack an E-Mail zugonschte vun dësem Panel opginn.

Iwwerwaachung als Service: e modulare System fir Mikroservicearchitektur

Gutt, well mir eng progressiv Firma sinn, hu mir och Kubernetes an dësem System iwwerwaacht. Mir hunn et am System mat Heapster abegraff, dee mir am Cluster installéiert hunn, et sammelt Daten a schéckt se op Graphite. Als Resultat gesäit d'Diagramm esou aus:

Iwwerwaachung als Service: e modulare System fir Mikroservicearchitektur

Iwwerwachung Komponente

Hei ass eng Lëscht vu Linken op d'Komponenten déi mir fir dës Aufgab benotzt hunn. All vun hinnen sinn Open Source.

Graphite:

Carbon-c-Relais:

github.com/grobian/carbon-c-relay

Brubeck:

github.com/github/brubeck

Gesammelt:

collectd.org

Moira:

github.com/moira-alert

Grafana:

grafana.com

Heapster:

github.com/kubernetes/heapster

Статистика

An hei sinn e puer Zuelen iwwer wéi de System fir eis funktionnéiert.

Aggregator (brubeck)

Zuel vun de Metriken: ~300 / sec
Intervall fir Metriken op Graphite ze schécken: 30 Sek
Server Ressource Notzung: ~ 6% CPU (mir schwätzen iwwer vollwäerteg Serveren); ~ 1Gb RAM; ~3 Mbps LAN

Graphit (go-carbon)

Zuel vun de Metriken: ~ 1 / min
Metriken Update Intervall: 30 Sek
Metrik Späicherschema: 30sec 35d, 5min 90d, 10min 365d (gëtt Iech e Verständnis vu wat mam Service iwwer eng laang Zäit geschitt)
Server Ressource Notzung: ~10% CPU; ~ 20Gb RAM; ~30 Mbps LAN

Flexibilitéit

Mir bei Avito schätzen wierklech Flexibilitéit an eisem Iwwerwaachungsservice. Firwat huet hien eigentlech esou eraus? Als éischt sinn seng Komponenten austauschbar: souwuel d'Komponente selwer an hir Versiounen. Zweetens, Ënnerstëtzung. Well de ganze Projet Open Source ass, kënnt Dir de Code selwer änneren, Ännerunge maachen an Funktiounen implementéieren déi net aus der Këscht verfügbar sinn. Ganz heefeg Stack gi benotzt, haaptsächlech Go a Python, sou datt dëst ganz einfach gemaach gëtt.

Hei ass e Beispill vun engem richtege Problem. Eng Metrik a Graphite ass eng Datei. Et huet en Numm. Dateinumm = metresche Numm. An et gëtt e Wee fir dohinner ze kommen. Dateinumm am Linux si limitéiert op 255 Zeechen. A mir hunn (als "interne Clienten") Kärelen aus der Datebank Departement. Si soen eis: "Mir wëllen eis SQL Ufroen iwwerwaachen. A si sinn net 255 Zeechen, mee 8 MB all. Mir wëllen se an Grafana weisen, d'Parameteren fir dës Ufro gesinn, an nach besser, mir wëllen d'Spëtzt vun esou Ufroen gesinn. Et wäert super sinn wann et an Echtzäit ugewise gëtt. Et wier wierklech cool se an d'Alarm ze setzen.

Iwwerwaachung als Service: e modulare System fir Mikroservicearchitektur
D'Beispill SQL Ufro gëtt als Beispill aus geholl Site postgrespro.ru

Mir setzen e Redis Server a benotzen eis Collectd Plugins, déi op Postgres goen an all d'Donnéeën vun do huelen, Metriken op Graphite schécken. Awer mir ersetzen de metresche Numm mat Hashes. Mir schécken gläichzäiteg deeselwechten Hash op Redis als Schlëssel, an déi ganz SQL Ufro als Wäert. Alles wat mir maache mussen ass sécherzestellen datt Grafana op Redis ka goen an dës Informatioun huelen. Mir maachen d'Graphite API op well ... Dëst ass d'Haaptinterface fir d'Interaktioun vun all Iwwerwachungskomponenten mat Grafit, a mir gitt do eng nei Funktioun genannt aliasByHash () - vu Grafana kréien mir den Numm vun der Metrik, a benotzen se an enger Ufro un Redis als Schlëssel, an Äntwert kréien mir de Wäert vum Schlëssel, dat ass eis "SQL Ufro" " Sou hu mir zu Grafana e Display vun enger SQL Query gewisen, déi an der Theorie onméiglech war, do ze weisen, zesumme mat Statistiken doriwwer (Uriff, Zeilen, total_time, ...).

Resultater

Disponibilitéit. Eis Iwwerwaachungsservice ass 24/7 verfügbar vun all Applikatioun an all Code. Wann Dir Zougang zu Stockage Ariichtungen hutt, kënnt Dir Daten un de Service schreiwen. D'Sprooch ass net wichteg, d'Entscheedunge sinn net wichteg. Dir musst just wësse wéi Dir e Socket opmaacht, eng Metrik do setzen an de Socket zoumaachen.

Zuverlässegkeet All Komponente si Feeler-tolerant a packen eis Lasten gutt.

Niddereg Barrière fir Entrée. Fir dëse System ze benotzen, musst Dir keng Programméierungssproochen a Ufroen zu Grafana léieren. Maacht just Är Applikatioun op, gitt e Socket an deen Metriken op Graphite schéckt, zoumaachen, Grafana opmaachen, do Dashboards erstellen a kuckt d'Behuele vun Äre Metriken, kritt Notifikatiounen duerch Moira.

Onofhängegkeet. Dir kënnt dat alles selwer maachen, ouni d'Hëllef vun DevOps Ingenieuren. An dëst ass e Virdeel, well Dir kënnt Äre Projet elo iwwerwaachen, Dir musst kee froen - entweder fir ze schaffen oder fir Ännerungen ze maachen.

Wat ziele mir fir?

Alles hei ënnendrënner ass net nëmmen abstrakt Gedanken, mee eppes zu deem op d'mannst déi éischt Schrëtt gemaach goufen.

  1. Anomalie Detektor. Mir wëllen e Service erstellen deen an eis Graphite-Späichere geet an all Metrik iwwerpréift mat verschiddenen Algorithmen. Et gi scho Algorithmen déi mir kucke wëllen, et gëtt Daten, mir wësse wéi mir domat schaffen.
  2. Metadaten. Mir hu vill Servicer, si änneren mat der Zäit, grad wéi déi Leit, déi mat hinnen schaffen. Konstant d'Dokumentatioun manuell z'erhalen ass keng Optioun. Dat ass firwat mir elo Metadaten an eise Mikroservicer embetteren. Et seet wien et entwéckelt huet, d'Sprooche mat deenen et interagéiert, SLA Ufuerderunge, wou a wien Notifikatioune solle geschéckt ginn. Wann Dir e Service ofsetzt, ginn all Entitéitsdaten onofhängeg erstallt. Als Resultat kritt Dir zwee Linken - een op Ausléiser, deen aneren op Dashboards zu Grafana.
  3. Iwwerwaachung an all Heem. Mir gleewen datt all Entwéckler sou e System solle benotzen. An dësem Fall versteet Dir ëmmer wou Äre Traffic ass, wat mat him geschitt, wou et fällt, wou seng Schwächten sinn. Wann zum Beispill eppes kommt an Äre Service ofbriechen, da léiert Dir doriwwer net während engem Uruff vum Manager, mee vun enger Alarm, an Dir kënnt direkt déi lescht Logbicher opmaachen a kucken wat do geschitt ass.
  4. Staark Leeschtung. Eise Projet wiisst konstant, an haut veraarbecht et ongeféier 2 metresch Wäerter pro Minutt. Virun engem Joer war dës Figur 000 000. An de Wuesstum geet weider, an dat heescht datt no enger Zäit Graphite (Flüster) fänkt un d'Disk-Subsystem staark ze laden. Wéi ech scho gesot hunn, ass dëst Iwwerwaachungssystem zimlech universell wéinst der Austauschbarkeet vu Komponenten. Eppes ënnerhält a stänneg hir Infrastruktur speziell fir Graphite erweidert, awer mir hunn decidéiert en anere Wee ze goen: benotzen clickhouse als Repository fir eis Metriken. Dësen Iwwergank ass bal komplett, a ganz geschwënn wäert ech Iech méi detailléiert soen wéi dëst gemaach gouf: wéi eng Schwieregkeeten et waren a wéi se iwwerwonne goufen, wéi de Migratiounsprozess gaangen ass, wäert ech d'Komponente beschreiwen, déi als bindend gewielt goufen an hir Konfiguratiounen.

Merci fir är Opmierksamkeet! Stellt Är Froen zum Thema, ech probéieren hei oder an de folgende Posts ze beäntweren. Vläicht huet een Erfahrung mat engem ähnlechen Iwwerwaachungssystem ze bauen oder op Clickhouse an enger ähnlecher Situatioun ze wiesselen - deelt et an de Kommentaren.

Source: will.com

Setzt e Commentaire