Nii et, te kogute mÔÔdikute andmeid. Nagu ka meie. Me kogume samuti mÔÔdikute andmeid. Loomulikult on need Ă€ritegevuseks vajalikud. TĂ€na rÀÀgime meie monitooringu sĂŒsteemi esimesest komponendist â statsd-ĂŒhilduvast agregatsiooniserverist. , miks me selle kirjutasime ja miks loobusime brubeckist.

Eelmistest artiklitest (, ) saate teada, et mĂ”nda aega kogusime meie mĂ€rgid kasutades . See on kirjutatud C-s. Koodi seisukohalt â lihtne nagu kork (mis on oluline, kui soovite sellele panustada) ja mis kĂ”ige tĂ€htsam, suudab see ilma eriliste probleemideta hakkama saada meie 2 miljoni mÔÔdikuga sekundis (MPS) tipptasemel. Dokumentatsioon vĂ€idab, et see toetab 4 miljonit MPS, kuid ainult tingimusel. See tĂ€hendab, et selle arvu saate, kui seadistate vĂ”rgu Ă”igesti Linuxis. (Kui palju MPS vĂ”ime saada, kui vĂ”rku niisama jĂ€tta, seda me ei tea). Vaatamata nendele eelistustele oli meil brubecki suhtes mitmeid tĂ”siseid pretensioone.
Pretensioon 1. Github â projekti arendaja â on lĂ”petanud selle toetamise: ei avalda patĆĄe ega parandusi, ei vĂ”ta vastu meie ja (mitte ainult meie) PR-e. Viimase paari kuu jooksul (umbes alates 2018. aasta veebruarist vĂ”i mĂ€rtsist) on aktiivsus taas alanud, kuid enne seda oli peaaegu 2 aastat tĂ€ielikku vaikust. Lisaks on projekt arendatud , mis vĂ”ib osutuda tĂ”siseks takistuseks uute funktsioonide juurutamisel.
Pretensioon 2. Arvutuste tÀpsus. Brubeck kogub agregeerimiseks vaid 65536 vÀÀrtust. Meie juhtumil vÔib mÔnede mÔÔdikute puhul aggregeerimise (30 sek) ajal tulla palju rohkem vÀÀrtusi (tipptasemel 1 527 392). Tulemuseks on, et maksimumide ja miinimumide vÀÀrtused tunduvad kasutud. NÀiteks, nagu see:

Kuidas oli

Nii pidi olema
Sama pĂ”hjuse tĂ”ttu arvutatakse summad kokku ĂŒldse vale. Lisage siia 32-bitise float ĂŒlevoolu bug, mis saadab serveri segfault'i, kui see saab osaliselt sĂŒĂŒtu mÔÔdiku, ja kĂ”ik muutub suurepĂ€raseks. See bug, muide, pole ikka veel parandatud.
Ja lĂ”puks, Pretensioon X. Artikli kirjutamise hetkeks oleme valmis esitama selle kĂ”igile 14 enam-vĂ€hem töötavale statsd rakendusele, mille suutsime leida. Kujutame ette, et mingi eraldi infrastruktuur on kasvanud nii palju, et 4 miljoni MPS vastuvĂ”tmine on juba ebapiisav. VĂ”i oletame, et see pole veel kasvanud, kuid mÔÔdikud on teie jaoks nii olulised, et isegi lĂŒhikesed, 2-3 minutilised katkestused graafikutel vĂ”ivad muutuda kriitiliseks ja kutsub esile halbu meeleolusid juhtide seas. Kuna depressiooni ravimine on tĂ€namatu asi, on vajalikud tehnilised lahendused.
Esiteks, talitluses ettenĂ€htud usaldusvÀÀrsus, et Ă€kiline probleem serveris ei tekitaks kontoris psĂŒhhiaatrilist zombi apokalĂŒpsist. Teiseks, kaalutavus, et oleks vĂ”imalus vastu vĂ”tta rohkem kui 4 miljonit MPS, ilma et peaks sĂŒgavale Linuxi vĂ”rgu lahti kaevama ja rahulikult âlaiendadaâ vajalike mÔÔtmete saavutamiseks.
Kuna meil oli laienemise osas varu, otsustasime alustada usaldusvÀÀrsusest. "Oi! UsaldusvÀÀrsus! See on lihtne, me oskame seda," mĂ”tlesime ja tĂ”stsime ĂŒles 2 serverit, kĂ€ivitades igas brubecki koopia. Selleks pidime kopeerima mÔÔdikute liiklus mĂ”lemasse serverisse ja isegi kirjutama selle jaoks . UsaldusvÀÀrsuse probleem lahendati, kuid⊠mitte vĂ€ga hĂ€sti. Alguses oli kĂ”ik nagu hĂ€sti: iga brubeck kogub oma aggregeerimise variandi, kirjutab andmed Graphite'i iga 30 sekundi jĂ€rel, kirjutades ĂŒle vana intervalli (see toimub Graphite'i pool). Kui ĂŒks server siiski ebaĂ”nnestub, on meil alati teine, millel on oma koopia aggregeeritud andmetest. Kuid probleem on see: kui server ebaĂ”nnestub, ilmuvad graafikud "saagimise" mĂ€rgid. See on seotud sellega, et brubecki 30-sekundi intervallid ei ole sĂŒnkroniseeritud ja ebaĂ”nnestumise hetkest ei kirjutata ĂŒkski neist ĂŒle. Teise serveri kĂ€ivitamise hetkel toimub sama. TĂ€iesti talutav, kuid vĂ”iks parem olla! KaaluĂ”iguslikkuse probleem ei ole samuti kuhugi kadunud. KĂ”ik mÔÔdikud lendavad endiselt ĂŒhele serverile, seetĂ”ttu oleme piiratud sama 2-4 miljoni MPS-ga sĂ”ltuvalt vĂ”rgu vĂ”imekusest.
Kui veidi probleemi ĂŒle mĂ”elda ja samal ajal lund labidaga kaevata, vĂ”ib pĂ€he tulla selline ilmne idee: on vajalik statsd, mis suudab töötada jaotatud reĆŸiimis. See tĂ€hendab, et sellise, kus on rakendatud sĂŒnkroniseerimine sĂ”lmede vahel aja ja mÔÔdikute osas. "Loomulikult on selline lahendus kindlasti olemas," ĂŒtlesime ja hakkasime guugeldama⊠ja ei leidnud midagi. Uurides erinevate statsd dokumentatsiooni ( 11.12.2017 seisuga, me ei leidnud sisuliselt midagi. Tundub, et ei arendajad ega kasutajad nendel lahendustel KOHUTAVALT suure hulga mÔÔdikute osas sellist asja kokku puutunud ei ole, muidu oleks nad kindlasti midagi vĂ€lja mĂ”elnud.
Ja siis meenutasime âmĂ€nguasiâ statsd - bioyino, mille kirjutasime hackathonil lihtsalt lĂ”bu pĂ€rast (projekti nimi genereeriti enne hackathonit skripti abil) ning mĂ”istsime, et me vajame kiiresti omaenda statsd-d. Miks?
- sest maailmas on liiga vÀhe statsd kloone,
- kuna on vĂ”imalik tagada soovitud vĂ”i soovitavale lĂ€hedane talitlushĂ€ired ja skaleeritavus (sealhulgas sĂŒnkroniseerida kokku kogutud mÔÔdikud serverite vahel ja lahendada konfliktid saatmise ajal),
- sest on vÔimalik mÔÔdikud tÀpsemalt lugeda kui seda teeb brubeck,
- sest on vĂ”imalik koguda ise rohkem ĂŒksikasjalikku statistikat, mida brubeck meile praktiliselt ei pakkunud,
- sest tuli vĂ”imalus programmeerida omaenda hĂŒperperformantne ja jaotatud rakendus, mis ei kopeeri tĂ€ielikult teise sarnase hĂŒperperformantsi arhitektuuri.
Millest kirjutada? Loomulikult Rustis. Miks?
- sest prototĂŒĂŒp lahendus oli juba olemas,
- sest artikli autor teadis siis juba Rusti ja tahtis midagi sellel kirjutada tootmisvalmis variandina, mille ta saaks avalikuks teha,
- sest jÀÀtmed juhtimisprotsessidele ei sobi, arvestades saadud liiklust (peaaegu reaalajas) ja jÀÀtmete pausid on praktiliselt vastuvÔetamatud,
- sest on vajalik maksimaalne jÔudlus, mis on vÔrdne C-ga
- sest Rust pakub meile kartmatut ĂŒhekordset töötlemist, ja kui me oleksime hakanud seda kirjutama C/C++, oleksime saanud rohkem haavatavusi, puhverdusĂŒlevalt ja vĂ”idulepestust kui brubeckis.
Oli ka argument Rusti vastu. Firmal polnud Rusti projektide loomise kogemust ja praegu ei plaanita seda ka pÔhiprojektis kasutada. Seega olid tÔsised mured, et miski ei toimi, kuid otsustasime riskida ja proovisime.
Aeg kulgesâŠ
LÔpuks, pÀrast mitmeid ebaÔnnestunud katseid, oli esimene töötav versioon valmis. Mida saime? Saime sellise.

Iga nod saab oma mÔÔdikute kogumi ja kogub neid enda juurde, kuid ei kogune mÔÔdikuid neid tĂŒĂŒpe, kus lĂ”pliku kogumise jaoks on vaja nende tĂ€is kogumi. Nod on omavahel ĂŒhendatud mĂ”ne jaotatud lukustamise protokolliga, mis vĂ”imaldab valida neist selle ainulaadse (siin me nutame), kes on vÀÀriline saatma mÔÔdikud Suurele. Praegu lahendatakse see kĂŒsimus vahendite kaudu, , kuid tulevikus autori ambitsioonid ulatuvad tohutusse Rafti, kus see vÀÀriline on kindlasti konsensuse liider node. Lisaks konsensusele saadavad nod sageli (vaikimisi ĂŒks kord sekundis) oma naabritele neid eelnevalt kogutud mÔÔdikute osi, mis Ă”nnestus selle sekundi jooksul koguda. See tĂ€hendab, et skaleeritavus ja talitlushĂ€ired sĂ€ilivad - iga nod hoiab siiski tĂ€ieliku kogumi mÔÔdikute, kuid mÔÔdikud saadetakse juba kogutud, TCP ja binaarprotokolli kodeerimise kaudu, mistĂ”ttu kulud dubleerimise suunas vĂ”rreldes UDP-d vĂ€henevad. Hoolimata ĂŒsna suurest sisenevate mÔÔdikute hulgast, nĂ”uab kogumine vĂ€ga vĂ€he mĂ€lu ja veel vĂ€hem CPU-d. Meie hĂ€sti kokkusurutud mÔÔdikute puhul on see vaid paar kĂŒmmend megabaiti andmeid. TĂ€iendavaks kasuks on tĂ”husate andmete ĂŒle kirjutamise puudumine Graphites, nagu see oli burbecki puhul.
UDP paketid koos mÔÔdikutega jaotatakse nodesse vĂ”rguvarustuse kaudu lihtsa Round Robini teel. Loomulikult ei saa vĂ”rgu riistvara pakettide sisu, seega vĂ”ib see leida palju rohkem kui 4M paketti sekundis, rÀÀkimata mÔÔdikutest, millest ta midagi ei tea. Kui arvestada, et mÔÔdikud ei tule mitte ĂŒheski pakendis, siis ei prognoosime tĂ”hususe probleeme sel hetkel. Serveri kokkuvarisemise korral tuvastab vĂ”rgu seade tĂ”husalt (1-2 sekundi jooksul) selle fakti ja eemaldab kukkunud serveri rotatsioonist. Selle tulemuseks on, et passiivseid (st mitte liidri) nodi saab sisse ja vĂ€lja lĂŒlitada praktiliselt mĂ€rkamatult. Maksimaalne, mida kaotame, on osa mÔÔdikuid, mis on saabunud viimase sekundi jooksul. Ăksik kadumine/ vĂ€ljalĂŒlitamine/ liidri vahetamine joonistab siiski vĂ€ikese anomaalia (30-sekundiline intervall jÀÀb endiselt sĂŒnkroniseerimata), kuid nodide vahelise side olemasolul vĂ”ime need probleemid minimeerida, nĂ€iteks sĂŒnkroniseerivate pakettide saatmise teel.
Veidi sisemistest struktuuridest. Rakendus on loomulikult mitmeotstarbeline, kuid voogude arhitektuur erineb brubeckist. Brubecki vood on ĂŒhesugused â igaĂŒhe ĂŒlesanne on samaaegselt nii teabe kogumine kui ka aggregeerimine. Bioyino töövood (workers) on jagatud kaheks rĂŒhmaks: vĂ”rgu- ja aggregeerimisvood. Selline jaotamine vĂ”imaldab rakendust paindlikumalt hallata sĂ”ltuvalt mÔÔdikute tĂŒĂŒbist: seal, kus on nĂ”utav intensiivne aggregeerimine, saab lisada aggregeerijaid, seal, kus on palju vĂ”rgu liiklust â suurendada vĂ”rguvoogude arvu. Praegu töötame meie serverites 8 vĂ”rku ja 4 aggregeerimisvoo.
Aggregeerimise eest vastutav osa on piisavalt igav. VĂ”rguvoogudest tĂ€idetud puhvrid jaotatakse aggregeerimise töötlemise voogude vahel, kus need hiljem analĂŒĂŒsitakse ja kogutakse. NĂ”utud mÔÔdikud saadetakse edastamiseks teistele nodidele. KĂ”ik see, sealhulgas andmete edastamine nodide vahel ja töö Consuliga, toimub asĂŒnkroonselt, tuginedes raamistikele .
Arendamise ajal tekitas rohkem probleeme vĂ”rguosa, mis vastutab mÔÔdikute vastuvĂ”tmise eest. Peamine eesmĂ€rk vĂ”rguvoogude eraldamisel eraldi ĂŒksusteks oli aja vĂ€hendamine, mida voog kulutab ei andmete lugemiseks soketist. Variandid asĂŒnkroonse UDP ja tavalise recvmsg kasutamiseks langesid kiiresti vĂ€lja: esimene kulutab liiga palju user-space CPU-d sĂŒndmuste töötlemiseks, teine â liiga palju konteksti vahetusi. SeetĂ”ttu kasutatakse praegu suuremate puhvritega (ja see, daamid ja hĂ€rrad, ei ole sugugi tĂŒhine asi!). Tavalise UDP toimetamine on sĂ€ilinud mittekoormatud olukordade jaoks, kus recvmmsg-i pole vaja. Multimessage reĆŸiimis saavutatakse peamine eesmĂ€rk: enamik vĂ”rgu voost kulutab aega OS-i jĂ€rjekorra puhastamisel â loetakse andmeid soketist ja liigitatakse need userspace-puhvrisse, vaid harva vahetatakse aggregeerijatele edastatud tĂ€idetud puhvrit. Soketi jĂ€rjekord ei kogune praktiliselt, Ă€ra visatud pakettide arv ei suurene.
MĂ€rkus
VaikesÀtetes on puhver seatud piisavalt suureks. Kui otsustate serverit iseseisvalt proovida, vÔite sattuda olukorda, kus pÀrast vÀikese arvu mÔÔdikute saatmist ei jÔua need Graphite'i, jÀÀdes vÔrgu voolu puhvris. VÀikese arvu mÔÔdikute jaoks tuleb seadistustes mÀÀrata bufsize ja task-queue-size vÀÀrtused vÀiksemaks.
LĂ”puks â mĂ”ned grafikud graafikuhuvilistele.
Statistika saabuvate mÔÔdikute arvu kohta iga serveri kohta: ĂŒle 2 miljoni MPS.

Ăhe nodi vĂ€ljalĂŒlitamine ja saabuvate mÔÔdikute ĂŒmberjaotamine.

Statistika vĂ€ljuvate mÔÔdikute kohta: ainult ĂŒks nodule saadab â raidend boss.

Statistika iga nodi töö kohta arvestades vigu erinevates sĂŒsteemi moodulites.

Sissetulevate mÔÔdikute detailimine (mÔÔdikute nimed on varjatud).

Mida plaanime selle kĂ”igega edasi teha? Loomulikult kirjutame koodi, bl...! Projekt oli algselt planeeritud open-source'ina ja jÀÀb selliseks kogu oma elu. LĂ€hitulevikus plaanime ĂŒleminekut enda versioonile Raft, peer-protokolli vahetamist ĂŒha ĂŒlekantavamaks, tĂ€iendava sisemise statistika lisamist, uute mÔÔdikute liikide loomist, vigade parandamist ja muid tĂ€iustusi.
Loomulikult oodatakse kÔiki, kes soovivad projekti arendamisel aidata: looge PR, Issues, ja vastuste vÔimalusel teeme koostööd jne.
Sellega, nagu öeldakse, thatâs all folks, ostke meie elevante!

Allikas: habr.com
