Monitoring mint szolgáltatás: moduláris rendszer mikroszolgáltatás-architektúrához

A mai napon projektünkön a monolitikus kód mellett tucatnyi mikroszolgáltatás működik. Mindegyikük folyamatos figyelést igényel. Ekkora mennyiségben a DevOps mérnökök segítségével ez problémás. Kifejlesztettünk egy monitorozási rendszert, amely szolgáltatásként működik a fejlesztők számára. Ők maguk mérhetik be az adatokat a monitorozási rendszerbe, használhatják azokat, és alapjukra irányítják a dashboardokat, figyelmeztetéseket csatolhatnak hozzájuk, amelyek akkor aktiválódnak, amikor a küszöbértékek elérik. A DevOps mérnököknek – csak az infrastruktúra és a dokumentáció áll rendelkezésre.

Ez a bejegyzés a plenáris előadásomnak a szekciója a RIT++-on. Sokan kérték, hogy készítsünk szöveges változatokat az ott elhangzottakról. Ha részt vettél a konferencián vagy nézted a videót, nem találsz semmi újat. Mindenki másnak – üdvözöljük az alábbiakban. Elmondom, hogyan jutottunk el ehhez a rendszerhez, hogyan működik és hogyan tervezzük a frissítését.

Monitoring mint szolgáltatás: moduláris rendszer mikroszolgáltatás-architektúrához

A múlt: sémák és tervek

Hogyan jutottunk el a meglévő monitorozási rendszerhez? Ehhez vissza kell mennünk 2015-be. Így nézett ki akkor:

Monitoring mint szolgáltatás: moduláris rendszer mikroszolgáltatás-architektúrához

Körülbelül 24 csomópontunk volt, amelyek a monitorozásért feleltek. Itt egy egész halom különféle cron, szkript, démon működik, amelyek valamit itt-ott figyelnek, üzeneteket küldenek, funkciókat hajtanak végre. Arra gondoltunk, hogy minél tovább megyünk, annál kevésbé lesz életképes ez a rendszer. Fejleszteni nem érdemes: túl terjedelmes.
Úgy döntöttünk, hogy kiválasztjuk azokat a monitorozási elemeket, amelyeket megtartunk és fejlesztünk, valamint azokat, amelyekről lemondunk. Ezek száma 19 lett. Csak grafitok, aggregátorok és Grafana maradt fenn dashboardként. De hogyan fog kinézni az új rendszer? Így:

Monitoring mint szolgáltatás: moduláris rendszer mikroszolgáltatás-architektúrához

Van egy metrikai tárolónk: ez grafitok, amelyek gyors SSD-kre építkeznek, és bizonyos aggregátorok a metrikákhoz. Ezt követően – Grafana a dashboardok megjelenítéséhez és Moira figyelmeztetésként. Emellett egy anomáliakereső rendszert is szeretnénk kifejleszteni.

Szabvány: Monitorozás 2.0

Így néztek ki a tervek 2015-ben. De nemcsak az infrastruktúrát és magát a szolgáltatást kellett előkészítenünk, hanem a dokumentációt is. Kifejlesztettük a vállalati szabványunkat, amelyet Monitorozás 2.0 névre kereszteltünk. Mik voltak a követelmények a rendszerrel szemben?

  • folyamatos rendelkezésre állás;
  • a metrikák tárolási intervalluma = 10 másodperc;
  • strukturált metrikák és dashboardok tárolása;
  • SLA > 99,99%
  • esemény metrikák gyűjtése UDP-n keresztül (!).

Szükségünk volt UDP-re, mivel nagy forgalmunk és eseményeink vannak, amelyek metrikákat generálnak. Ha mindet egyszerre írnánk a Graphite-ba, a tárolónk összeomlana. Emellett az első szintű prefixeket választottuk minden metrikához.

Monitoring mint szolgáltatás: moduláris rendszer mikroszolgáltatás-architektúrához

Minden prefix valamilyen jelleggel bír. Vannak metrikák a szerverek, hálózatok, konténerek, erőforrások, alkalmazások és így tovább vonatkozásában. Pontos, szigorú, tipizált szűrést valósítottunk meg, ahol az első szintű metrikákat fogadjuk, a többit pedig egyszerűen eldobjuk. Így terveztük meg ezt a rendszert 2015-ben. Mi a helyzet most?

A jelenlegi állapot: a monitoring komponensek közötti interakciós séma

Elsősorban az alkalmazásokat monitoráljuk: a PHP kódunkat, az alkalmazásokat és a mikroszolgáltatásokat – mindent, amit a fejlesztőink írnak. Minden alkalmazás UDP-n keresztül küld metrikákat a Brubeck aggregator számára (statsd, amelyet C nyelven írtak át). Ez bizonyult a leggyorsabbnak a szintetikus tesztek eredményei alapján. Az aggregátor már aggregált metrikákat küld a Graphite-ba TCP-n keresztül.

Van egy olyan típusú metrikánk, mint a timer-ek. Ez nagyon kényelmes dolog. Például minden felhasználói kapcsolat esetén a szolgáltatással küld egy metrikát a Brubeck-nek a válaszidőről. Egymillió válasz érkezik, de az aggregátor csupán 10 metrikát ad ki. Így megvan a beérkezett látogatók száma, a maximális, minimális és átlagos válaszidő, a medián és 4 percentilis. Aztán az adatokat a Graphite-ba továbbítják, és mindezeket élőben látjuk.

Továbbá van aggregációnk a hardver, szoftver, rendszer metrikák és régi monitorozó rendszerünk, a Munin metrikáihoz (ez 2015-ig működött nálunk). Mindezt a CollectD C-s démon segítségével gyűjtjük (amelybe sokféle plugin van beépítve, képes lekérdezni azokat az erőforrásokat, amelyek a gazdagépen elérhetőek, csak állítsuk be a konfigurációt, hová írja az adatokat) és ezen keresztül írjuk az adatokat a Graphite-ba. Támogatja a python és shell script plugineket is, így saját egyedi megoldásokat is készíthet: a CollectD gyűjti az adatokat helyi vagy távoli gazdagépről (tegyük fel, létezik Curl) és elküldi őket a Graphite-ba.

A továbbiakban minden metrikkal, amelyet összegyűjtöttünk, a Carbon-c-relay-ba küldjük. Ez a Carbon Relay megoldás a Graphite-tól, C nyelven továbbfejlesztve. Ez egy router, amely összegyűjti az összes metrikkát, amelyet az aggregátorainkról küldünk, és azokat irányítja a node-okon. A routing szakaszában ellenőrzi a metrikák érvényességét. Először is, meg kell felelniük annak a séma előtagjainak, amelyet korábban bemutattam, és másodszor érvényesek a Graphite számára. Különben eldobják őket.

Ezután a Carbon-c-relay elküldi a metrikát a Graphite klaszterbe. Az alapértelmezett metrikatárolónk a Carbon-cache, amelyet Go nyelven írtunk át. A Go-carbon a párhuzamos feldolgozása miatt lényegesen felülmúlja a Carbon-cache teljesítményét. Az adatok megérkeznek, és a whisper csomag segítségével írják őket a lemezekre (ez a standard, Python nyelven íródott). Az adataink olvasásához a Graphite API-t használjuk. Ez sokkal gyorsabban működik, mint a standard Graphite WEB. Mi történik az adatokkal ezután?

Az adatok a Grafanába kerülnek. Az alapvető adatforrásunk a Graphite klaszterek, plusz van egy Grafana mint webes felület, amely megjeleníti a metrikat, és lehetővé teszi a dashboardok készítését. Minden szolgáltatásunk fejlesztői saját dashboardot hoznak létre. Ezután grafikonokat építenek rajtuk, amelyek megjelenítik az alkalmazásaikból írt metrikákat. A Grafana mellett van még SLAM is. Ez egy Python demon, amely az SLA-t számolja a Graphite-ból származó adatok alapján. Ahogy már említettem, több tucat mikroszolgáltatásunk van, mindegyiknek vannak saját követelményei. A SLAM segítségével megnézzük a dokumentációt, és összehasonlítjuk azt a meglévő Graphite-tal, hogy mennyire felelnek meg a követelmények a szolgáltatásaink elérhetőségének.

Folytassuk: az alerting. Ez egy erős rendszer, a Moira segítségével van megszervezve. Független, mert saját Graphite-jával rendelkezik. A SKB "Kontur" csapata fejlesztette ki, Pythonban és Go-ban íródott, teljesen nyílt forráskódú. A Moira ugyanazt az adatfolyamot kapja, mint ami a Graphite-ba megy. Ha valamilyen okból leáll a tároló, az alerting működni fog.

A Moira-t a Kubernetes-ben valósítottuk meg, mint a fő adatbázist, a Redis szerverek klaszterét használva. Így egy megbízható rendszer jött létre. Összehasonlítja a metrikaáramot a kiváltók listájával: ha nincs említés a listán, akkor eldobja a metrikát. Így képes percenként gigabyte metrikákat feldolgozni.

Ezen kívül csatoltuk a vállalati LDAP-ot, amellyel minden felhasználó a vállalati rendszerben értesítéseket hozhat létre a meglévő (vagy újonnan létrehozott) kiváltók alapján. Mivel a Moira tartalmazza a Graphite-ot, támogatja annak minden funkcióját. Először egy sort vesz, és bemásolja a Grafanába. Megnézi, hogyan jelennek meg az adatok a grafikonokon. Aztán ugyanezt a sort bemásolja a Moirába, korlátokkal látja el, és így kap éles figyelmeztetéseket. Ehhez nincs szüksége semmilyen speciális tudásra. A Moira képes értesíteni SMS-ben, emailben, Jirában, Slackben... Támogatja a testreszabott szkriptek végrehajtását is. Amikor egy kiváltó bekövetkezik, és a Moira írva van egy testreszabott szkriptre vagy bináris fájlra, elindítja azt, és a JSON-t stdin-ben átadja a binárisnak. Következésképpen a programjának ezt ki kell elemeznie. Hogy mit kezd a JSON-nal, az ön döntése.

A figyelmeztetéshez egy saját fejlesztésű megoldást is használunk - Imagotag. Az üzletekben általában elektronikus árkijelzők számára alkalmazott panelt alakítottuk át a mi igényeink szerint. Kihoztuk rá a Moira kiváltóit. Ott feltüntetjük, hogy milyen állapotban vannak és mikor történt az esemény. A fejlesztő csapat egy része lemondott a Slack és email értesítésekről, ehelyett ezt a panelt használja.

Monitoring mint szolgáltatás: moduláris rendszer mikroszolgáltatás-architektúrához

Mint progresszív cég, a Kubernetes-t is monitoroztuk ebben a rendszerben. A Heapster segítségével integráltuk, amelyet a klaszterbe telepítettünk, ez összegyűjti az adatokat és elküldi őket a Graphite-nak. Ennek eredményeképpen a séma így néz ki:

Monitoring mint szolgáltatás: moduláris rendszer mikroszolgáltatás-architektúrához

Monitoring komponensek

Itt van a lista azokról a komponensekről, amelyeket ehhez a feladathoz használtunk. Mindegyik nyílt forráskódú.

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

Statisztika

És itt van néhány szám arról, hogyan működik a rendszer nálunk.

Aggregator (brubeck)

Metrikák száma: ~ 300 000 / sec
Metrikák Graphite-ba küldésének intervalluma: 30 sec
A szerver erőforrás-használata: ~ 6% CPU (teljes értékű szerverekről van szó); ~ 1Gb RAM; ~ 3 Mbps LAN

Graphite (go-carbon)

Metrikák száma: ~ 1 600 000 / min
Metrikák frissítési intervalluma: 30 sec
Metrikák tárolási sémája: 30sec 35d, 5min 90d, 10min 365d (ez segít megérteni, mi történik a szolgáltatással hosszabb időszakok alatt)
A szerver erőforrás-használata: ~ 10% CPU; ~ 20Gb RAM; ~ 30 Mbps LAN

Rugalmasság

Mi az Avito-nál nagyon értékeljük a monitoring szolgáltatásunk rugalmasságát. Miért lett ilyen? Először is, az alkotóelemei kölcsönösen helyettesíthetők: mind az összetevők, mind a verzióik. Másodszor — karbantarthatóság. Mivel az egész projekt nyílt forráskódú, saját maguk módosíthatják a kódot, változásokat hozhatnak létre, megvalósíthatják azokat a funkciókat, amelyek dobozból nem állnak rendelkezésre. Elég elterjedt technológiai stack-eket használnak, főként Go-t és Python-t, így ez viszonylag egyszerűen kivitelezhető.

Íme egy például felmerült probléma. A metrika a Graphite-ban — ez egy fájl. Van egy neve. A fájl neve = a metrika neve. És van egy útvonal hozzá. A fájlnevek a Linux-ban 255 karakterre korlátozódnak. És nekünk van (mint 'belső megrendelők') egy csapat az adatbázis-értékesítési osztályból. Ők azt mondják nekünk: "Szeretnénk figyelemmel kísérni az SQL-lekérdezéseinket. És ezek nem 255 karakteresek, hanem 8 MB mindegyik. Szeretnénk, ha Grafanában láthatnánk ezeket a lekérdezéseket, látni szeretnénk a paramétereket, és ami még jobb, szeretnénk látni a legjobb ilyen lekérdezéseket. Jó lenne, ha valós időben megjelenhetnének. És igazán szuper lenne, ha ezen belül alerteket is be tudnánk állítani."

Monitoring mint szolgáltatás: moduláris rendszer mikroszolgáltatás-architektúrához
Az SQL lekérdezés példaként szerepel a következő címről a postgrespro.ru weboldalról

Felemeljük a Redis szervert a Collectd plugineinkkel, amelyek a Postgres-t keresik, és onnan összes adatot gyűjtenek, a metrikákat pedig Graphite-ba küldjük. Azonban a metrika nevét hash-ekre cseréljük. Ugyanezt a hash-t egyszerre küldjük a Redis-be kulcsként, és az egész SQL lekérdezést értékként. Annyit kell még megoldanunk, hogy a Grafana tudjon a Redis-be menni és ezeket az információkat megkapni. Megnyitjuk a Graphite API-t, mivel ez a fő interfész a monitorozó komponensek és a Graphite közötti interakcióhoz, és beleírunk egy új funkciót, amelyet aliasByHash()-nak nevezünk — a Grafana a metrika nevét megadja, és ezt kulcsként használjuk a Redis lekérdezésében, válaszként megkapjuk a kulcs értékét, ami a mi “SQL lekérdezésünk”. Így a Grafana-ban megjelenik az SQL lekérdezés, amelyet elvileg ott nem lehetett megjeleníteni, a hozzá kapcsolódó statisztikákkal (hívások, sorok, teljes idő, …).

Összegzés

Elérhetőség. Monitoring szolgáltatásunk 24/7 elérhető bármilyen alkalmazásból és bármilyen kódból. Ha hozzáférése van a tárolókhoz, akkor adatokat írhat a szolgáltatásba. A nyelv nem számít, a megoldások nem számítanak. Csak annyit kell tudnia, hogyan nyisson egy socket-et, dobja be oda a metrikát, és zárja be a socket-et.

Megbízhatóság. Minden komponens megbízható, és jól kezeli a terheléseinket.

Alacsony belépési küszöb. Ahhoz, hogy használni tudja ezt a rendszert, nem kell programozási nyelveket és Grafana lekérdezéseket tanulmányoznia. Egyszerűen nyissa meg az alkalmazását, írja be a socket-et, amely az adatokat a Graphite-ba küldi, zárja be, nyissa meg a Grafana-t, hozzon létre dashboardokat, és figyelje meg a metrikák viselkedését, értesítéseket kapva a Moira által.

Önállóság. Mind ezt meg lehet csinálni egyedül, DevOps mérnökök segítsége nélkül. Ez túlzás, mert most azonnal figyelheti a projektjét, senkit sem kell megkérdeznie - sem a munka megkezdése előtt, sem a változtatásokhoz.

Mire törekszünk?

Az alább felsoroltak nem csupán absztrakt gondolatok, hanem olyan célok, amelyekhez legalább az első lépéseket megtettük.

  1. Anomáliadetektor. Szeretnénk létrehozni egy szolgáltatást, amely a Graphite tárolóinkban jár, és minden metrikát különböző algoritmusok alapján ellenőriz. Már vannak olyan algoritmusok, amelyeket szeretnénk vizsgálni, vannak adatok, tudunk velük dolgozni.
  2. Metaadatok. Sok szolgáltatásunk van, amelyek idővel változnak, ahogyan azok is, akik velük dolgoznak. A dokumentáció kézi vezetése folyamatosan nem megoldás. Ezért most a mikroszolgáltatásainkba metaadatokat építünk be. Ezekben fel van tüntetve, ki fejlesztette, milyen nyelvekkel lép kapcsolatba, SLA követelmények, hova és kinek kell küldeni a értesítéseket. A szolgáltatás telepítésekor minden entitás adata automatikusan létrejön. Végül két linket kapsz - az egyik a triggerekről, a másik a Grafana műszerfalakról.
  3. Monitoring minden házhoz. Úgy gondoljuk, hogy egy ilyen rendszert minden fejlesztőnek használnia kell. Így mindig tudod, hol van a forgalmad, mi történik vele, hol esik le, hol vannak a gyenge pontjai. Ha véletlenül valami történik és összeomlik a szolgáltatásod, akkor erről nem a menedzsertől értesülsz telefonon, hanem egy riasztásból, és azonnal meg tudod nyitni a friss naplókat, és meg tudod nézni, mi történt.
  4. Magas teljesítmény. A projektünk folyamatosan növekszik, és ma körülbelül 2 000 000 metrikus értéket dolgoz fel percenként. Egy évvel ezelőtt ez a szám 500 000 volt. A növekedés folytatódik, és ez azt jelenti, hogy egy idő után a Graphite (whisper) nagyon meg fogja terhelni a lemez alrendszert. Ahogyan már mondtam, ez a monitoring rendszer meglehetősen univerzális, köszönhetően a komponensek kölcsönös helyettesíthetőségének. Valaki kifejezetten a Graphite-hoz karbantartja és folyamatosan bővíti az infrastruktúráját, de mi úgy döntöttünk, hogy más utat követünk: használni fogjuk clickhousedb_fdw mint a metrikáink tárolójaként. Ez az áttérés gyakorlatilag befejeződött, és hamarosan részletesebben is mesélek arról, hogyan történt: milyen nehézségekkel szembesültünk és hogyan oldottuk meg őket, hogyan zajlott a migrációs folyamat, leírom a választott komponenseket és azok konfigurációit.

Köszönöm a figyelmet! Kérdezzétek meg a témával kapcsolatban, próbálok itt vagy a következő posztokban válaszolni. Lehet, hogy valakinek van tapasztalata egy hasonló monitorozó rendszer kialakításával vagy a Clickhouse-ra való áttéréssel hasonló helyzetben - osszátok meg a hozzászólásokban.

Forrás: habr.com

Megbízható hosting vásárlása weboldalak számára, DDoS védelemmel, VPS VDS szerverek. 🔥 Megbízható webtárhely vásárlása DDoS védelemmel, VPS VDS szerverek | ProHoster