Bioyino - grumbullues i metrikës i shpërndarë, i shkallëzuar

Pra, ju mbledhni metrika. Dhe ne gjithashtu. Ne mbledhim edhe metrika. Sigurisht, ato që janë të rëndësishme për biznesin. Sot do t'ju tregojmë për lidhjen e parë në sistemin tonë të monitorimit - serverin e grumbullimit të pajtueshëm me statsd. bioyino, pse e shkruam dhe pse e braktisëm Brubeck-un.

Bioyino - grumbullues i metrikës i shpërndarë, i shkallëzuar

Nga artikujt tanĂ« tĂ« mĂ«parshĂ«m (1, 2) mund tĂ« zbuloni se deri pak kohĂ« mĂ« parĂ« ne mblidhnim etiketa duke pĂ«rdorur brubeckËshtĂ« shkruar nĂ« C. ËshtĂ« aq i thjeshtĂ« sa njĂ« maus (gjĂ« qĂ« Ă«shtĂ« e rĂ«ndĂ«sishme kur doni tĂ« kontribuoni) dhe, mĂ« e rĂ«ndĂ«sishmja, trajton vĂ«llimin tonĂ« maksimal prej 2 milionĂ« metrikash pĂ«r sekondĂ« (MPS) pa asnjĂ« problem. Dokumentacioni pretendon mbĂ«shtetje pĂ«r 4 milionĂ« MPS me njĂ« yll. Kjo do tĂ« thotĂ« qĂ« do tĂ« merrni shifrĂ«n e deklaruar nĂ«se e konfiguroni rrjetin saktĂ«. Linux(Nuk e dimĂ« se sa MPS mund tĂ« merrni nĂ«se e lini rrjetin siç Ă«shtĂ«.) PavarĂ«sisht kĂ«tyre avantazheve, patĂ«m disa ankesa serioze nĂ« lidhje me brubeck-un.

Kërkesa 1. Github, zhvilluesi i projektit, ndaloi së mbështeturi atë: duke publikuar patch-e dhe rregullime, duke pranuar kërkesat tona të klientit (dhe të të tjerëve). Aktiviteti ka rifilluar në muajt e fundit (diku rreth shkurtit-marsit 2018), por para kësaj pati pothuajse dy vjet heshtje të plotë. Për më tepër, projekti është në zhvillim e sipër. për nevojat e brendshme të Gihub, gjë që mund të bëhet një pengesë serioze për zbatimin e veçorive të reja.

Kërkesa 2. Saktësia e llogaritjes. Brubeck mbledh vetëm 65536 vlera për agregim. Në rastin tonë, për disa metrika, periudha e agregimit (30 sekonda) mund të marrë vlera dukshëm më të larta (1,527,392 në kulmin). Si rezultat i kësaj mostrimi, vlerat maksimale dhe minimale duken të padobishme. Për shembull, si kjo:

Bioyino - grumbullues i metrikës i shpërndarë, i shkallëzuar
Siç ishte

Bioyino - grumbullues i metrikës i shpërndarë, i shkallëzuar
Si duhej të kishte qenë

Për të njëjtën arsye, shumat llogariten gabimisht. Shtojini kësaj një gabim me mbingarkesat e numrave të float-it 32-bit, i cili e dërgon serverin në një gabim segfault kur merr një metrikë në dukje të pafajshme, dhe gjithçka bëhet perfekte. Rastësisht, ky gabim nuk është rregulluar kurrë.

Dhe, së fundi, Kërkesa XNë kohën e shkrimit, jemi gati ta testojmë atë kundrejt të gjitha 14 implementimeve pak a shumë funksionale të statsd që kemi gjetur. Le të imagjinojmë se një infrastrukturë e caktuar është rritur aq shumë saqë gëlltitja e 4 milionë MPS nuk është më e mjaftueshme. Ose, edhe nëse nuk është rritur ende, metrikat janë aq të rëndësishme për ju saqë edhe uljet e shkurtra, 2-3-minutëshe në grafikë mund të bëhen kritike dhe të shkaktojnë periudha depresioni të pakapërcyeshëm tek menaxherët. Meqenëse trajtimi i depresionit është një detyrë e pafalshme, nevojiten zgjidhje teknike.

Së pari, toleranca ndaj defekteve, në mënyrë që një problem i papritur i serverit të mos shkaktojë një apokalips psikiatrik zombi në zyrë. Së dyti, shkallëzueshmëria, në mënyrë që të mund të përballojë mbi 4 milionë MPS pa pasur nevojë të gërmojë thellë në rrjet. Linux dhe rriten me qetësi "në gjerësi" në madhësinë e kërkuar.

MeqenĂ«se kishim pak hapĂ«sirĂ« ​​pĂ«r shkallĂ«zueshmĂ«ri, vendosĂ«m tĂ« fillonim me tolerancĂ«n ndaj gabimeve. "Oh! TolerancĂ« ndaj gabimeve! ËshtĂ« e thjeshtĂ«, mund ta bĂ«jmĂ«", menduam, dhe lançuam dy servera, duke ekzekutuar njĂ« kopje tĂ« brubeck nĂ« secilin. PĂ«r ta bĂ«rĂ« kĂ«tĂ«, na u desh tĂ« kopjonim trafikun me metrika nĂ« tĂ« dy serverat dhe madje tĂ« shkruanim njĂ« fragment kodi pĂ«r tĂ«. njĂ« shĂ«rbim i vogĂ«lNe e zgjidhĂ«m problemin e tolerancĂ«s sĂ« defekteve nĂ« kĂ«tĂ« mĂ«nyrĂ«, por... jo shumĂ« mirĂ«. NĂ« fillim, gjithçka dukej nĂ« rregull: çdo brubeck mbledh versionin e vet tĂ« agregimit, shkruan tĂ« dhĂ«na nĂ« Graphite çdo 30 sekonda, duke mbishkruar intervalin e vjetĂ«r (kjo bĂ«het nĂ« anĂ«n e Graphite). NĂ«se njĂ« server dĂ«shton, ne gjithmonĂ« kemi njĂ« tĂ« dytĂ« me kopjen e vet tĂ« tĂ« dhĂ«nave tĂ« agreguara. Por ja ku qĂ«ndron problemi: nĂ«se njĂ« server dĂ«shton, nĂ« grafikĂ« shfaqet njĂ« model "sharrim-me-sharrim". Kjo pĂ«r shkak tĂ« faktit se intervalet 30-sekondĂ«she tĂ« brubeck nuk janĂ« tĂ« sinkronizuara, dhe kur njĂ«ri prej tyre dĂ«shton, ai nuk mbishkruan. E njĂ«jta gjĂ« ndodh kur serveri i dytĂ« fillon. ËshtĂ« e tolerueshme, por ne duam mĂ« mirĂ«! Problemi i shkallĂ«zueshmĂ«risĂ« gjithashtu mbetet. TĂ« gjitha metrikat ende shkojnĂ« nĂ« njĂ« server tĂ« vetĂ«m, dhe pĂ«r kĂ«tĂ« arsye ne jemi tĂ« kufizuar nĂ« tĂ« njĂ«jtat 2-4 milionĂ« MPS, varĂ«sisht nga performanca e rrjetit.

Nëse mendoni pak për problemin ndërsa pastroni borën, një ide e qartë mund t'ju lindë në mendje: ju nevojitet një statsd që mund të funksionojë në modalitetin e shpërndarë. Domethënë, një që zbaton sinkronizimin midis nyjeve sipas kohës dhe metrikave. "Me siguri një zgjidhje e tillë ndoshta ekziston tashmë," thamë ne, dhe shkuam të kërkonim në Google... Dhe nuk gjetëm asgjë. Pasi kërkuam në dokumentacion për statistika të ndryshme (https://github.com/etsy/statsd/wiki#server-implementations Që nga 11 dhjetori 2017, nuk gjetëm absolutisht asgjë. Me sa duket, as zhvilluesit dhe as përdoruesit e këtyre zgjidhjeve nuk kanë hasur ndonjëherë KAQ shumë metrika, përndryshe do të kishin gjetur diçka.

Dhe pastaj na u kujtua "lodra" statistikore, bioyino, të cilën e shkruam në hackathonin Just for Fun (emri i projektit u gjenerua nga një skript para hackathonit) dhe kuptuam se na duhej urgjentisht statistikat tona. Pse?

  • sepse ka shumĂ« pak klone tĂ« statsd nĂ« botĂ«,
  • sepse Ă«shtĂ« e mundur tĂ« ofrohet toleranca e dĂ«shiruar ose afĂ«r dĂ«shiruar e gabimeve dhe shkallĂ«zueshmĂ«ria (duke pĂ«rfshirĂ« sinkronizimin e metrikave tĂ« agreguara midis serverave dhe zgjidhjen e problemit tĂ« konflikteve gjatĂ« dĂ«rgimit),
  • sepse mund tĂ« llogaritni metrikat mĂ« saktĂ« sesa Brubeck,
  • sepse ne mund tĂ« mbledhim vetĂ« statistika mĂ« tĂ« detajuara, tĂ« cilat Brubeck praktikisht nuk na i dha kurrĂ«,
  • sepse pata mundĂ«sinĂ« tĂ« programoja aplikacionin tim nĂ« shkallĂ« tĂ« shpĂ«rndarĂ« me hiperperformancĂ«, i cili nuk do ta pĂ«rsĂ«riste plotĂ«sisht arkitekturĂ«n e njĂ« tjetĂ«r hiperperformance tĂ« tillĂ«... epo, e kuptoni.

Në çfarë të shkruaj? Në ndryshk, sigurisht. Pse?

  • sepse tashmĂ« ekzistonte njĂ« prototip i zgjidhjes,
  • sepse autori i artikullit e njihte tashmĂ« Rust-in nĂ« atĂ« kohĂ« dhe mezi priste tĂ« shkruante diçka nĂ« tĂ« pĂ«r prodhim me mundĂ«sinĂ« e publikimit tĂ« tij si burim tĂ« hapur,
  • sepse gjuhĂ«t me GC nuk janĂ« tĂ« pĂ«rshtatshme pĂ«r ne pĂ«r shkak tĂ« natyrĂ«s sĂ« trafikut tĂ« marrĂ« (pothuajse nĂ« kohĂ« reale) dhe pauzat e GC janĂ« praktikisht tĂ« papranueshme,
  • sepse na duhet performancĂ« maksimale e krahasueshme me C
  • Sepse Rust na jep njĂ«kohĂ«si tĂ« patrembur, dhe nĂ«se do tĂ« fillonim ta shkruanim nĂ« C/C++, do tĂ« merrnim edhe mĂ« shumĂ« sesa brubeck, dobĂ«si, tejmbushje tĂ« buffer-it, kushte race dhe fjalĂ« tĂ« tjera tĂ« frikshme.

Pati edhe një argument kundër Rust. Kompania nuk kishte përvojë në krijimin e projekteve në Rust dhe ne nuk planifikonim ta përdornim atë në projektin tonë kryesor. Pra, kishte shqetësime serioze se nuk do të funksiononte, por vendosëm ta provonim.

Koha kaloi


MĂ« nĂ« fund, pas disa pĂ«rpjekjeve tĂ« dĂ«shtuara, versioni i parĂ« funksional ishte gati. ÇfarĂ« ndodhi? Ja si dukej.

Bioyino - grumbullues i metrikës i shpërndarë, i shkallëzuar

Çdo nyje merr grupin e vet tĂ« metrikave dhe i grumbullon ato, por nuk i grumbullon metrikat pĂ«r ato lloje ku grupi i plotĂ« do tĂ« kĂ«rkohej pĂ«r grumbullimin pĂ«rfundimtar. Nyjet janĂ« tĂ« lidhura nĂ«pĂ«rmjet njĂ« protokolli tĂ« kyçjes sĂ« shpĂ«rndarĂ«, i cili u lejon atyre tĂ« zgjedhin atĂ« (e thirrĂ«m kĂ«tu) qĂ« ia vlen tĂ« dĂ«rgojĂ« metrika te i Madhi. Ky problem aktualisht po adresohet nga konsull, por nĂ« tĂ« ardhmen ambiciet e autorit shtrihen deri nĂ« zotĂ«roj zbatimi Raft, ku nyja udhĂ«heqĂ«se e konsensusit Ă«shtĂ«, sigurisht, mĂ« e denja. PĂ«rveç konsensusit, nyjet shpesh (si parazgjedhje, njĂ« herĂ« nĂ« sekondĂ«) u dĂ«rgojnĂ« fqinjĂ«ve tĂ« tyre ato pjesĂ« tĂ« metrikave tĂ« para-agreguara qĂ« kanĂ« arritur tĂ« mbledhin gjatĂ« asaj sekonde. Kjo ruan shkallĂ«zueshmĂ«rinĂ« dhe tolerancĂ«n ndaj gabimeve - çdo nyje ende mirĂ«mban njĂ« grup tĂ« plotĂ« metrikash, por metrikat dĂ«rgohen tĂ« agreguara, nĂ«pĂ«rmjet TCP dhe tĂ« koduara nĂ« njĂ« protokoll binar, duke ulur ndjeshĂ«m kostot e dublikimit krahasuar me UDP. PavarĂ«sisht numrit relativisht tĂ« madh tĂ« metrikave hyrĂ«se, akumulimi kĂ«rkon shumĂ« pak memorie dhe madje edhe mĂ« pak CPU. PĂ«r metrikat tona tĂ« kompresuara mirĂ«, kjo arrin vetĂ«m nĂ« disa dhjetĂ«ra megabajt tĂ« dhĂ«nash. NjĂ« bonus shtesĂ« Ă«shtĂ« shmangia e rishkrimeve tĂ« panevojshme tĂ« tĂ« dhĂ«nave nĂ« Graphite, siç ishte rasti me burbeck.

Paketat UDP me metrika janë të pabalancuara midis nyjeve në pajisjet e rrjetit duke përdorur një round robin të thjeshtë. Natyrisht, hardueri i rrjetit nuk e analizon përmbajtjen e paketës dhe për këtë arsye mund të trajtojë shumë më tepër se 4 milion paketa në sekondë, për të mos përmendur metrikat për të cilat nuk di asgjë. Duke pasur parasysh që metrikat nuk merren individualisht në secilën paketë, ne nuk parashikojmë ndonjë problem të performancës këtu. Nëse një server rrëzohet, pajisja e rrjetit shpejt (brenda 1-2 sekondave) e zbulon këtë dhe e heq serverin e rënë nga rrotullimi. Si rezultat, nyjet pasive (domethënë, jo-udhëheqëse) mund të ndizen dhe fiken praktikisht pa asnjë rënie të dukshme në grafikë. Më së shumti që humbasim janë disa nga metrikat që mbërritën në sekondën e fundit. Një humbje/ndërrim i papritur i udhëheqësit do të krijojë ende një anomali të vogël (intervali 30-sekondësh është ende jashtë sinkronizimit), por nëse ka komunikim midis nyjeve, këto probleme mund të minimizohen, për shembull, duke dërguar paketa sinkronizimi.

Pak rreth pjesëve të brendshme. Aplikacioni është, sigurisht, me shumë fije, por arkitektura e fijeve ndryshon nga ajo e përdorur në brubeck. Fijet në brubeck janë identike - secila është përgjegjëse si për mbledhjen e të dhënave ashtu edhe për agregimin. Në bioyino, fijet e punëtorëve ndahen në dy grupe: ato përgjegjëse për përpunimin e rrjetit dhe ato përgjegjëse për agregimin. Kjo ndarje lejon një menaxhim më fleksibël të aplikacionit në varësi të llojit të metrikave: aty ku kërkohet agregim intensiv, mund të shtohen agregues, ndërsa aty ku ka shumë trafik rrjeti, mund të shtohen më shumë fije rrjeti. Aktualisht, ne operojmë me tetë fije rrjeti dhe katër fije agregimi në serverat tanë.

Pjesa llogaritëse (e grumbullimit) është mjaft e lodhshme. Buferat e mbushura me rrjedha rrjeti shpërndahen midis fijeve llogaritëse, ku më pas analizohen dhe grumbullohen. Me kërkesë, metrikat dërgohen në nyje të tjera. E gjithë kjo, duke përfshirë transferimin e të dhënave midis nyjeve dhe ndërveprimin me Consul, kryhet në mënyrë asinkrone dhe funksionon në kornizë. tokyo.

Komponenti i rrjetit pĂ«rgjegjĂ«s pĂ«r marrjen e metrikave paraqiti shumĂ« mĂ« tepĂ«r sfida zhvillimi. QĂ«llimi kryesor i ndarjes sĂ« rrjedhave tĂ« rrjetit nĂ« entitete tĂ« ndara ishte zvogĂ«limi i kohĂ«s sĂ« shpenzuar pĂ«r secilĂ«n rrjedhĂ«. jo pĂ«r tĂ« lexuar tĂ« dhĂ«na nga njĂ« socket. Opsionet e pĂ«rdorimit tĂ« UDP asinkron dhe recvmsg tĂ« rregullt shpejt u lanĂ« jashtĂ« pĂ«rdorimit: e para konsumon shumĂ« hapĂ«sirĂ« ​​CPU tĂ« pĂ«rdoruesit pĂ«r pĂ«rpunimin e ngjarjeve, ndĂ«rsa e dyta konsumon shumĂ« çelĂ«sa konteksti. Prandaj, qasja aktuale Ă«shtĂ« recvmmsg Me buffer-a tĂ« mĂ«dhenj (dhe buffer-at, zotĂ«rinj oficerĂ«, nuk janĂ« thjesht çdo gjĂ«!). MbĂ«shtetja pĂ«r UDP-nĂ« e rregullt Ă«shtĂ« e rezervuar pĂ«r rastet me ngarkesĂ« tĂ« ulĂ«t kur recvmmsg nuk Ă«shtĂ« i nevojshĂ«m. Modaliteti shumĂ«mesazhesh arrin qĂ«llimin kryesor: fija e rrjetit kalon pjesĂ«n mĂ« tĂ« madhe tĂ« kohĂ«s duke pastruar radhĂ«n e sistemit operativ - duke lexuar tĂ« dhĂ«na nga soketi dhe duke i transferuar ato nĂ« buffer-in e hapĂ«sirĂ«s sĂ« pĂ«rdoruesit, vetĂ«m herĂ« pas here duke kaluar pĂ«r t'ia dorĂ«zuar buffer-in e plotĂ« agreguesve. Radha e soketit praktikisht nuk grumbullohet kurrĂ« dhe numri i paketave tĂ« humbura mezi rritet.

Shënim

Si parazgjedhje, madhësia e memorjes së përkohshme është vendosur mjaft e madhe. Nëse vendosni ta testoni vetë serverin, mund të zbuloni se pas dërgimit të një numri të vogël metrikash, ato nuk mbërrijnë në Graphite, duke mbetur në memorjen e transmetimit të rrjetit. Për të trajtuar një numër të vogël metrikash, duhet të vendosni vlera më të vogla në skedarët e konfigurimit bufsize dhe task-queue-size.

Më në fund, disa grafikë për dashamirësit e grafikëve.

Statistikat mbi numrin e metrikave hyrëse për secilin server: më shumë se 2 milion MPS.

Bioyino - grumbullues i metrikës i shpërndarë, i shkallëzuar

Çaktivizimi i njĂ«rĂ«s prej nyjeve dhe rishpĂ«rndarja e metrikave hyrĂ«se.

Bioyino - grumbullues i metrikës i shpërndarë, i shkallëzuar

Statistikat mbi metrikat dalëse: vetëm një nyje dërgon ndonjëherë - shefi i bastisjes.

Bioyino - grumbullues i metrikës i shpërndarë, i shkallëzuar

Statistikat e funksionimit të secilës nyje, duke marrë parasysh gabimet në module të ndryshme të sistemit.

Bioyino - grumbullues i metrikës i shpërndarë, i shkallëzuar

Detajet e metrikave hyrëse (emrat e metrikave janë të fshehura).

Bioyino - grumbullues i metrikës i shpërndarë, i shkallëzuar

ÇfarĂ« planifikojmĂ« tĂ« bĂ«jmĂ« me tĂ« gjitha kĂ«to mĂ« pas? TĂ« shkruajmĂ« kod tĂ« mallkuar, sigurisht! Projekti fillimisht ishte planifikuar si me burim tĂ« hapur dhe do tĂ« mbetet i tillĂ« pĂ«r gjithĂ« jetĂ«n e tij. Planet tona tĂ« menjĂ«hershme pĂ«rfshijnĂ« kalimin nĂ« versionin tonĂ« tĂ« Raft, ndryshimin e protokollit tĂ« kolegĂ«ve nĂ« njĂ« mĂ« tĂ« lĂ«vizshĂ«m, shtimin e statistikave tĂ« brendshme shtesĂ«, llojeve tĂ« reja metrike, rregullimeve tĂ« gabimeve dhe pĂ«rmirĂ«simeve tĂ« tjera.

Sigurisht, kushdo që është i gatshëm të ndihmojë në zhvillimin e projektit është i mirëpritur: të krijojë PR, probleme dhe ne do t'u përgjigjemi atyre sa herë që të jetë e mundur, t'i përmirësojmë ato, etj.

Kaq është e gjitha, njerëz, siç thonë, blini elefantët tanë!

Luaj Video


Burimi: www.habr.com
Bleni njĂ« host tĂ« besueshĂ«m pĂ«r faqet me mbrojtje DDoS, serverĂ« VPS VDS đŸ”„ Bleni hosting tĂ« besueshĂ«m tĂ« faqeve tĂ« internetit me mbrojtje DDoS, servera VPS VDS | ProHoster