Beraz, neurriak biltzen dituzu. Garen bezala. Neurriak ere biltzen ditugu. Jakina, negozioetarako beharrezkoa. Gaur gure monitorizazio sistemaren lehen estekari buruz hitz egingo dugu: statsd-ekin bateragarria den agregazio zerbitzaria
Gure aurreko artikuluetatik (
Erreklamazioa 1. Github-ek, proiektuaren garatzaileak, laguntza emateari utzi zion: adabakiak eta konponketak argitaratzeari, gurea eta (ez bakarrik gurea) PR onartuz. Azken hilabeteotan (2018ko otsailetik martxotik nonbait), jarduera berriro ekin da, baina aurretik ia 2 urteko lasaitasun osoa egon zen. Horrez gain, proiektua garatzen ari da
Erreklamazioa 2. Kalkuluen zehaztasuna. Brubeck-ek guztira 65536 balio biltzen ditu agregaziorako. Gure kasuan, metrika batzuentzat, agregazio-aldian (30 segundo), askoz balio gehiago iritsi daitezke (gailurrean 1). Laginketa honen ondorioz, balio maximoak eta minimoak alferrikakoak dirudite. Adibidez, honela:
zen bezala
Nola izan behar zuen
Arrazoi beragatik, oro har, oker kalkulatzen dira zenbatekoak. Gehitu hemen 32 biteko flotatzaile gainezka duen akats bat, eta horrek orokorrean zerbitzaria segfault-era bidaltzen du itxuraz errugabea den metrika jasotzean, eta dena bikain bihurtzen da. Akatsa, bide batez, ez da konpondu.
Eta, azkenik, X erreklamazioa. Idazteko unean, prest gaude aurkitu ahal izan ditugun 14 estatistika-inplementazio gutxi-asko funtzionatzen dutenei aurkezteko. Imajina dezagun azpiegitura bakar batzuk hainbeste hazi direla non 4 milioi MPS onartzea nahikoa ez dela. Edo oraindik hazi ez bada ere, baina neurketak dagoeneko oso garrantzitsuak dira zuretzat, zerrendetan 2-3 minutuko jaitsiera laburrak ere kritiko bihur daitezkeela eta kudeatzaileen artean depresio gaindiezinak eragin ditzakete. Depresioa tratatzea esker oneko zeregina denez, irtenbide teknikoak behar dira.
Lehenik eta behin, akatsen tolerantzia, zerbitzarian bat-bateko arazo batek ez dezan bulegoan zonbi apokalipsi psikiatrikorik eragin. Bigarrenik, 4 milioi MPS baino gehiago onartu ahal izateko eskalatzea, Linux sareko pilan sakondu gabe eta behar den tamainara "zabalean" lasai hazten.
Eskalatzeko tokia geneukanez, akatsen tolerantziatik hastea erabaki genuen. " BURUZ! Akatsen tolerantzia! Erraza da, egin dezakeguΒ», pentsatu genuen eta 2 zerbitzari abiarazi genituen, bakoitzari brubeck kopia bat altxatuz. Horretarako, bi zerbitzarietan metrikekin trafikoa kopiatu behar izan dugu eta baita horretarako idatzi ere
Arazoari buruz pixka bat pentsatzen baduzu eta, aldi berean, pala batekin elurra ateratzen baduzu, ondoko ideia argia etor daiteke burura: modu banatuan funtziona dezakeen statsd bat behar duzu. Hau da, nodoen arteko sinkronizazioa denboran eta metriketan ezartzen duena. "Noski, ziurrenik dagoeneko existitzen da horrelako irtenbide bat", esan genuen eta Google-ra joan ginen... Eta ez zuten ezer aurkitu. Estatistika desberdinetarako dokumentazioa aztertu ondoren (
Eta gero, Just for Fun hackathon-en idatzitako "jostailu" estatistikaz - bioyinoz gogoratu ginen (proiektuaren izena hackatona hasi baino lehen sortu zuen gidoiak) eta gure estatistikak premiazkoan behar genituela konturatu ginen. Zertarako?
- munduan statsd klon gutxiegi daudelako,
- nahi den akatsen tolerantzia eta eskalagarritasuna eskaintzea posible baita (zerbitzarien arteko metrika agregatuak sinkronizatzea eta gatazkak bidaltzeko arazoa konpontzea barne),
- Brubeck-ek baino zehatzago kalkulatzea posible baita neurriak,
- izan ere, zuk zeuk bildu ditzakezu estatistika zehatzagoak, Brubeck-ek ia eman ez dizkigunak,
- izan ere, nire hiperperformance banatutako eskala laborategiko aplikazioa programatzeko aukera izan nuen, antzeko beste hipererredikzio baten arkitektura guztiz errepikatuko ez duena... tira, hori da.
Zertan idatzi? Noski, Rust-en. Zergatik?
- jada bazegoen irtenbide prototipo bat,
- artikuluaren egileak garai hartan jada ezagutzen zuen Rust eta irrikitan zegoelako zerbait idazteko ekoizpenerako, kode irekian jartzeko aukerarekin,
- izan ere, GC duten hizkuntzak ez zaizkigu egokiak jasotako trafikoaren izaeragatik (ia denbora errealean) eta GC etenaldiak ia onartezinak dira,
- C-ren pareko errendimendu maximoa behar duzulako
- izan ere, Rustek beldurrik gabeko konkurrentzia eskaintzen digu, eta C/C++-n idazten hasi bagina, are ahultasun gehiago, buffer gainezka, lasterketa-baldintzak eta brubeck baino beste hitz beldurgarri batzuk bilduko genituzke.
Herdoilaren aurkako eztabaida ere egon zen. Enpresak ez zuen Rust-en proiektuak sortzen esperientziarik, eta orain ere ez dugu proiektu nagusian erabiltzeko asmorik. Hori dela eta, ezerk aterako ez ote zen beldur handia zegoen, baina arriskua hartzea erabaki genuen eta saiatu ginen.
Denbora pasa zen...
Azkenik, huts egindako hainbat saiakeraren ondoren, lehen lan-bertsioa prest zegoen. Zer gertatu da? Hau da gertatu dena.
Nodo bakoitzak bere metrika-multzoa jasotzen du eta metatzen ditu, eta ez ditu metrikarik agregatzen beren multzo osoa azken agregaziorako beharrezkoa den mota horietarako. Nodoak elkarren artean konektatzen dira banatutako blokeo-protokolo baten bidez, hautatzeko aukera ematen duena Handiari metrikak bidaltzea merezi duen bakarra (hemen negar egin genuen). Arazo hau konpontzen ari da
Neurridun UDP paketeak sareko ekipoetako nodoen artean desorekatuta daude Round Robin sinple baten bidez. Jakina, sareko hardwareak ez du paketeen edukia analizatzen eta, beraz, segundoko 4M pakete baino askoz gehiago atera ditzake, ezer ez dakien metrikak aipatu gabe. Kontuan hartzen badugu neurriak ez direla pakete bakoitzean banan-banan etortzen, orduan ez dugu errendimendu-arazorik aurreikusten leku honetan. Zerbitzari bat huts egiten bada, sareko gailuak azkar (1-2 segundoko epean) detektatzen du gertakari hori eta huts egin duen zerbitzaria biratzetik kentzen du. Horren ondorioz, nodo pasiboak (hau da, liderrak ez direnak) ia aktibatu eta desaktibatu daitezke diagrametan beherapenak nabaritu gabe. Galtzen dugun maximoa azken segundoan sartutako neurketen zati bat da. Lider baten bat-bateko galerak/itzaliak/aldatzeak anomalia txiki bat sortuko du oraindik (30 segundoko tartea sinkronizatu gabe dago oraindik), baina nodoen arteko komunikazioa badago, arazo hauek gutxitu daitezke, adibidez, sinkronizazio paketeak bidaliz. .
Barne egiturari buruz pixka bat. Aplikazioa, noski, hari anitzekoa da, baina hari-arkitektura Brubeck-en erabiltzen denaren desberdina da. Brubeck-en hariak berdinak dira: horietako bakoitza informazioa biltzeaz eta gehitzeaz arduratzen da. Bioyinoan, langileak bi taldetan banatzen dira: sarearen arduradunak eta agregazio arduradunak. Zatiketa honek aplikazioa malgutasun handiagoz kudeatzeko aukera ematen du metrika motaren arabera: agregazio intentsiboa behar den lekuetan, agregatzaileak gehi ditzakezu, sareko trafiko handia dagoen tokietan, sare-fluxu kopurua gehi dezakezu. Momentu honetan, gure zerbitzarietan 8 sare eta 4 agregazio fluxutan lan egiten dugu.
Zenbaketa (agregazioaren arduraduna) zatia nahiko aspergarria da. Sare-fluxuek betetako bufferak zenbaketa-fluxuen artean banatzen dira, non gero analizatu eta agregatu egiten diren. Eskatuz gero, beste nodo batzuetara bidaltzeko metrikak ematen dira. Hori guztia, nodoen artean datuak bidaltzea eta Consul-ekin lan egitea barne, modu asinkronoan egiten da, esparruan exekutatzen.
Garapenean zehar askoz arazo gehiago sortu ziren metrikak jasotzeaz arduratzen den sareko zatiak. Sare-fluxuak entitate bereizietan banatzearen helburu nagusia fluxu batek igarotzen duen denbora murrizteko nahia zen ez socketeko datuak irakurtzeko. UDP asinkronoa eta recvmsg erregularra erabiltzen dituzten aukerak azkar desagertu dira: lehenengoak erabiltzaile-espazio gehiegi kontsumitzen du gertaerak prozesatzeko, bigarrenak testuinguru-aldaketa gehiegi behar ditu. Horregatik, gaur egun erabiltzen da
Kontuan izan
Ezarpen lehenetsietan, buffer-aren tamaina nahiko handia izango da. Bat-batean zerbitzaria zuk zeuk probatzea erabakitzen baduzu, baliteke metrika kopuru txiki bat bidali ondoren ez direla Graphite-ra iritsiko, sareko korronteen bufferean geratuko direla. Neurri kopuru txiki batekin lan egiteko, busize eta zeregin-ilararen tamaina balio txikiagoak ezarri behar dituzu konfigurazioan.
Azkenik, taula zaleentzat zerrenda batzuk.
Zerbitzari bakoitzeko sarrerako metrika kopuruari buruzko estatistikak: 2 milioi MPS baino gehiago.
Nodoetako bat desgaitu eta sarrerako neurketak birbanatzea.
Irteerako neurketei buruzko estatistikak: nodo bakarrak bidaltzen ditu beti: raid-burua.
Nodo bakoitzaren funtzionamenduaren estatistikak, sistemaren hainbat modulutako akatsak kontuan hartuta.
Sarrerako neurketen xehetasunak (metrikoen izenak ezkutatuta daude).
Zer egiteko asmoa dugu hurrengo honekin guztiarekin? Noski, idatzi kodea, alajaina...! Proiektua hasiera batean kode irekia izateko pentsatuta zegoen eta horrela jarraituko du bere bizitzan zehar. Gure berehalako planak Raft-en gure bertsiora aldatzea, pareko protokoloa eramangarriagoa den batera aldatzea, barne-estatistika osagarriak, neurketa mota berriak, akatsen konponketak eta beste hobekuntza batzuk sartzea dira.
Noski, denek ongietorria dute proiektuaren garapenean laguntzera: PR sortu, Arazoak, ahal bada erantzungo dugu, hobetu, etab.
Hori esanda, hori guztia lagunok, erosi gure elefanteak!
Iturria: www.habr.com