{"id":52113,"date":"2019-11-01T00:00:00","date_gmt":"2019-10-31T21:00:00","guid":{"rendered":"https:\/\/prohoster.info\/blog\/blog_prohoster\/bioyino-raspredelyonnyj-masshtabiruemyj-agregator-metrik"},"modified":"2020-02-18T13:59:47","modified_gmt":"2020-02-18T10:59:47","slug":"bioyino-raspredelyonnyj-masshtabiruemyj-agregator-metrik","status":"publish","type":"post","link":"https:\/\/prohoster.info\/ro\/blog\/administrirovanie\/bioyino-raspredelyonnyj-masshtabiruemyj-agregator-metrik","title":{"rendered":"Bioyino \u2014 un agregator distribuit \u0219i scalabil de metrici","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>A\u0219adar, aduna\u021bi metrici. Ca \u0219i noi. De asemenea, adun\u0103m metrici. Bine\u00een\u021beles, cele necesare pentru afaceri. Ast\u0103zi v\u0103 vom vorbi despre primul link din sistemul nostru de monitorizare \u2014 un server de agregare compatibil cu statsd <noindex><a rel=\"nofollow\" href=\"http:\/\/bit.ly\/2Noxg1M\">bioyino<\/a><\/noindex>, de ce l-am scris \u0219i de ce am renun\u021bat la brubeck. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bioyino \u2014 un agregator distribuit \u0219i scalabil de metrici\" src=\"\/wp-content\/uploads\/2019\/11\/312c9a706828acc65f638a6a8abfc5b5.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>Din articolele noastre anterioare (<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/company\/avito\/blog\/335410\/\">1<\/a><\/noindex>, <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/company\/avito\/blog\/343928\/\">2<\/a><\/noindex>) pute\u021bi afla c\u0103, p\u00e2n\u0103 \u00eentr-un anumit moment, am adunat etichete folosind <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/github\/brubeck\">brubeck<\/a><\/noindex>. Este scris \u00een C. Din punctul de vedere al codului \u2014 simplu ca o dop, ceea ce este important atunci c\u00e2nd dori\u021bi s\u0103 contribui\u021bi \u0219i, cel mai important, face fa\u021b\u0103 f\u0103r\u0103 probleme volumului nostru de 2 milioane de metrici pe secund\u0103 (MPS) \u00een v\u00e2rf. Documenta\u021bia afirm\u0103 suport pentru 4 milioane MPS cu o stea. Aceasta \u00eenseamn\u0103 c\u0103 cifra declarat\u0103 o ve\u021bi ob\u021bine dac\u0103 configura\u021bi corect re\u021beaua pe Linux. (C\u00e2te MPS se pot ob\u021bine l\u0103s\u00e2nd re\u021beaua a\u0219a cum este, nu \u0219tim). \u00cen ciuda acestor avantaje, aveam c\u00e2teva pl\u00e2ngeri serioase fa\u021b\u0103 de brubeck.<\/p>\n<p><\/p>\n<p><em>Pl\u00e2ngerea 1.<\/em> Github \u2014 dezvoltatorul proiectului \u2014 a \u00eencetat s\u0103-l mai sus\u021bin\u0103: nu public\u0103 patch-uri \u0219i corecturi, nu accept\u0103 PR-urile noastre (\u0219i nu doar ale noastre). \u00cen ultimele c\u00e2teva luni (undeva din februarie-martie 2018) activitatea a re\u00eenceput, dar \u00eenainte de acest moment a fost aproape 2 ani de lini\u0219te total\u0103. \u00cen plus, proiectul este dezvoltat <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/github\/brubeck\/pull\/31#issuecomment-325907734\">pentru nevoile interne ale Gihub<\/a><\/noindex>, ceea ce poate deveni un obstacol serios \u00een implementarea de noi func\u021bionalit\u0103\u021bi.<\/p>\n<p><\/p>\n<p><em>Pl\u00e2ngerea 2.<\/em> Precizia calculelor. Brubeck colecteaz\u0103 pentru agregare doar 65536 de valori. \u00cen cazul nostru, pentru anumite metrici \u00een perioada de agregare (30 secunde) pot veni mult mai multe valori (1.527.392 \u00een v\u00e2rf). Ca urmare a acestui e\u0219antion, valorile maximelor \u0219i minimelor par inutile. De exemplu, astfel: <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bioyino \u2014 un agregator distribuit \u0219i scalabil de metrici\" src=\"\/wp-content\/uploads\/2019\/11\/4222a1a7d1e127137220595241f5276c.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<em>Cum a fost<\/em><\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bioyino \u2014 un agregator distribuit \u0219i scalabil de metrici\" src=\"\/wp-content\/uploads\/2019\/11\/c8f0025c61f708584328ea30aacf7bc0.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<em>Cum ar fi trebuit s\u0103 fie<\/em><\/p>\n<p><\/p>\n<p>Din acela\u0219i motiv, sumele sunt calculate gre\u0219it. Ad\u0103uga\u021bi aici un bug cu dep\u0103\u0219irea valorii float pe 32 de bi\u021bi, care trimite serverul \u00een segfault la primirea unei metrici aparent inofensive, \u0219i devine cu adev\u0103rat excelent. Bug-ul, de altfel, nu a fost corectat.<\/p>\n<p><\/p>\n<p>\u0218i, \u00een sf\u00e2r\u0219it, <em>Pl\u00e2ngerea X<\/em>. La momentul scrierii acestui articol, suntem preg\u0103ti\u021bi s\u0103-l prezent\u0103m tuturor celor 14 implement\u0103ri mai mult sau mai pu\u021bin func\u021bionale ale statsd, pe care am reu\u0219it s\u0103 le g\u0103sim. S\u0103 presupunem c\u0103 o anumit\u0103 infrastructur\u0103 a crescut at\u00e2t de mult \u00eenc\u00e2t a primi 4 milioane MPS nu mai este suficient. Sau poate c\u0103 nu a crescut \u00eenc\u0103, dar metricele pentru dvs. sunt deja at\u00e2t de importante \u00eenc\u00e2t chiar \u0219i scurtcircuit\u0103rile de 2-3 minute pe grafice pot deveni critice \u0219i pot provoca episoade de depresie profund\u0103 \u00een r\u00e2ndul managerilor. Deoarece tratamentul depresiei este o sarcin\u0103 dificil\u0103, sunt necesare solu\u021bii tehnice.<\/p>\n<p><\/p>\n<p>\u00cen primul r\u00e2nd, fiabilitate, astfel \u00eenc\u00e2t o problem\u0103 nea\u0219teptat\u0103 pe server s\u0103 nu provoace un apocalips\u0103 psihiatric\u0103 \u00een birou. \u00cen al doilea r\u00e2nd, scalabilitate, pentru a avea capacitatea de a primi mai mult de 4 milioane MPS, f\u0103r\u0103 a s\u0103pa ad\u00e2nc \u00een stiva de re\u021bea Linux \u0219i cresc\u00e2nd \u201e\u00een l\u0103\u021bime\u201d p\u00e2n\u0103 la dimensiunile necesare.<\/p>\n<p><\/p>\n<p>Av\u00e2nd \u00een vedere c\u0103 aveam o rezerv\u0103 pentru scalabilitate, am decis s\u0103 \u00eencepem cu fiabilitatea. \u201eO! Fiabilitate! Este simplu, \u0219tim cum s\u0103 facem asta\u201d, ne-am g\u00e2ndit \u0219i am pornit 2 servere, ridic\u00e2nd pe fiecare o copie a brubeck. Pentru aceasta, a fost necesar s\u0103 copiem traficul cu metrice pe ambele servere \u0219i chiar s\u0103 scriem pentru asta <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/Albibek\/udpdup\">o mic\u0103 unealt\u0103<\/a><\/noindex>. Am rezolvat problema fiabilit\u0103\u021bii cu aceasta, dar\u2026 nu foarte bine. La \u00eenceput, totul p\u0103rea grozav: fiecare brubeck adun\u0103 propria variant\u0103 de agregare, scrie date \u00een Graphite la fiecare 30 de secunde, supra\u00eenregistr\u00e2nd intervalul anterior (acest lucru se face pe partea Graphite). Dac\u0103, dintr-o dat\u0103, un server se defecteaz\u0103, avem \u00eentotdeauna un al doilea cu propria copie de date agregate. Dar problema este: dac\u0103 serverul se defecteaz\u0103, pe grafice apare un \u201edinte de fer\u0103str\u0103u\u201d. Acest lucru este legat de faptul c\u0103 intervalele de 30 de secunde la brubeck nu sunt sincronizate, iar \u00een momentul pic\u0103rii, unul dintre ele nu se supra\u00eenregistreaz\u0103. Atunci c\u00e2nd se porneste al doilea server, se \u00eent\u00e2mpl\u0103 acela\u0219i lucru. Este destul de tolerabil, dar vrem mai bine! Problema scalabilit\u0103\u021bii nu a disp\u0103rut nici ea. Toate metricele continu\u0103 s\u0103 \u201ezboare\u201d c\u0103tre un server singular, a\u0219a c\u0103 suntem restric\u021biona\u021bi de acelea\u0219i 2-4 milioane MPS, \u00een func\u021bie de capacitatea re\u021belei.<\/p>\n<p><\/p>\n<p>Dac\u0103 te g\u00e2nde\u0219ti pu\u021bin la problem\u0103 \u0219i sapi z\u0103pada \u00een acela\u0219i timp, poate s\u0103-\u021bi vin\u0103 o idee evident\u0103: este nevoie de un statsd care s\u0103 func\u021bioneze \u00een mod distribuit. Adic\u0103 un statsd care s\u0103 implementeze sincronizarea \u00eentre noduri pe baza timpului \u0219i a metodelor de m\u0103surare. \u201eDesigur, o astfel de solu\u021bie cu siguran\u021b\u0103 exist\u0103 deja\u201d, ne-am spus \u0219i am \u00eenceput s\u0103 c\u0103ut\u0103m pe Google... \u0219i nu am g\u0103sit nimic. Trec\u00e2nd prin documenta\u021bia diferitelor statsd (<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/etsy\/statsd\/wiki#server-implementations\">https:\/\/github.com\/etsy\/statsd\/wiki#server-implementations<\/a><\/noindex> la data de 11.12.2017), nu am g\u0103sit nimic. Se pare c\u0103 nici dezvoltatorii, nici utilizatorii acestor solu\u021bii cu un ASEMENEA num\u0103r de metode de m\u0103surare nu s-au confruntat \u00eenc\u0103 cu aceast\u0103 problem\u0103, altfel cu siguran\u021b\u0103 ar fi inventat ceva.<\/p>\n<p><\/p>\n<p>\u0218i atunci ne-am amintit de statsd-ul \u201ejuc\u0103rie\u201d \u2014 bioyino, pe care l-am scris la hackathon doar pentru distrac\u021bie (numele proiectului a fost generat de un script \u00eenainte de \u00eenceperea hackathon-ului) \u0219i am realizat c\u0103 avem nevoie urgent\u0103 de propriul nostru statsd. De ce?<\/p>\n<p><\/p>\n<ul>\n<li>pentru c\u0103 \u00een lume sunt prea pu\u021bini clona\u021bi statsd,<\/li>\n<li>pentru c\u0103 putem asigura redundan\u021ba dorit\u0103 sau aproape dorit\u0103 \u0219i scalabilitatea (inclusiv sincronizarea metricilor agregate \u00eentre servere \u0219i solu\u021bionarea problemelor de conflict la trimitere),<\/li>\n<li>pentru c\u0103 putem calcula metricile mai precis dec\u00e2t face brubeck,<\/li>\n<li>pentru c\u0103 putem s\u0103 str\u00e2ngem statistici mai detaliate, pe care brubeck nu ni le-a oferit aproape deloc,<\/li>\n<li>pentru c\u0103 ne-a fost oferit\u0103 ocazia de a programa propria noastr\u0103 aplica\u021bie distribuit\u0103 de ultim\u0103 genera\u021bie, care s\u0103 nu replicate complet arhitectura altui astfel de sistem performant. <\/li>\n<\/ul>\n<p><\/p>\n<p>Pe ce s\u0103 scriem? Desigur, pe Rust. De ce?<\/p>\n<p><\/p>\n<ul>\n<li>pentru c\u0103 exista deja un prototip al solu\u021biei,<\/li>\n<li>pentru c\u0103 autorul articolului la acel moment \u0219tia deja Rust \u0219i dorea s\u0103 scrie ceva pentru produc\u021bie cu posibilitatea de a face public open-source,<\/li>\n<li>pentru c\u0103 limbajele cu GC nu sunt potrivite pentru natura traficului generat (practic \u00een timp real) iar pauzele de GC sunt practic inacceptabile, <\/li>\n<li>pentru c\u0103 avem nevoie de un maxim de performan\u021b\u0103 comparabil cu C<\/li>\n<li>pentru c\u0103 Rust ne ofer\u0103 concuren\u021b\u0103 f\u0103r\u0103 fric\u0103, iar dac\u0103 am fi \u00eenceput s\u0103 scriem acest lucru \u00een C\/C++, am fi \u00eent\u00e2mpinat \u0219i mai multe probleme dec\u00e2t cu brubeck, cum ar fi vulnerabilit\u0103\u021bi, dep\u0103\u0219iri de buffer, condi\u021bii de curs\u0103 \u0219i alte cuvinte \u00eenfrico\u0219\u0103toare.<\/li>\n<\/ul>\n<p><\/p>\n<p>A existat \u0219i un argument \u00eempotriva Rust. Compania nu avea experien\u021b\u0103 \u00een crearea de proiecte pe Rust \u0219i acum nu pl\u0103nuim s\u0103-l folosim nici \u00een proiectul principal. Prin urmare, au fost temeri serioase c\u0103 nu vom reu\u0219i, dar am hot\u0103r\u00e2t s\u0103 ne asum\u0103m riscul \u0219i am \u00eencercat.<\/p>\n<p><\/p>\n<p>A trecut timpul\u2026<\/p>\n<p><\/p>\n<p>\u00cen cele din urm\u0103, dup\u0103 c\u00e2teva \u00eencerc\u0103ri nereu\u0219ite, prima versiune func\u021bional\u0103 a fost gata. Ce am ob\u021binut? Am ob\u021binut asta.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bioyino \u2014 un agregator distribuit \u0219i scalabil de metrici\" src=\"\/wp-content\/uploads\/2019\/11\/322c4136ed033b80b31a89d7b5f63af8.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Fiecare nod prime\u0219te propriul set de metrici \u0219i le acumuleaz\u0103, f\u0103r\u0103 a agrega metricile pentru tipurile pentru care pentru agregarea final\u0103 este necesar setul complet. Nodurile sunt conectate \u00eentre ele printr-un protocol de blocare distribuit\u0103, care permite selectarea uneia singure (aici am pl\u00e2ns), care este demn\u0103 s\u0103 trimit\u0103 metricile c\u0103tre Marele. \u00cen prezent, aceast\u0103 problem\u0103 este rezolvat\u0103 cu ajutorul <noindex><a rel=\"nofollow\" href=\"https:\/\/www.consul.io\/docs\/guides\/leader-election.html\">Consul<\/a><\/noindex>, dar \u00een viitor ambi\u021biile autorului se \u00eentind p\u00e2n\u0103 la <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/Albibek\/raft-consensus\">propria<\/a><\/noindex> <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/Albibek\/raft-tokio\">implementare<\/a><\/noindex> Raft, unde acea nobil\u0103 va fi, desigur, nodul lider al consensului. Pe l\u00e2ng\u0103 consens, nodurile trimit destul de frecvent (implicit, o dat\u0103 pe secund\u0103) vecinilor lor p\u0103r\u021bile pre-agregate ale metricilor pe care au reu\u0219it s\u0103 le acumuleze \u00een acea secund\u0103. Se dovede\u0219te c\u0103 scalabilitatea \u0219i rezilien\u021ba la defecte se p\u0103streaz\u0103 \u2014 fiecare nod \u00ee\u0219i p\u0103streaz\u0103 setul complet de metrici, dar metricile sunt trimise deja agregate, prin TCP \u0219i codificate \u00een protocol binar, astfel cheltuielile pe duplicare comparativ cu UDP sc\u0103z\u00e2nd semnificativ. \u00cen ciuda num\u0103rului destul de mare de metrici care vin, acumularea necesit\u0103 foarte pu\u021bin\u0103 memorie \u0219i \u0219i mai pu\u021bin CPU. Pentru metricile noastre comprimate eficient, este vorba doar de c\u00e2teva zeci de megabytes de date. Un bonus suplimentar este absen\u021ba scrierilor inutile ale datelor \u00een Graphite, a\u0219a cum s-a \u00eent\u00e2mplat cu burbeck.<\/p>\n<p><\/p>\n<p>Pachetele UDP cu metrici sunt echilibrate \u00eentre noduri pe echipamentele de re\u021bea printr-un simplu Round Robin. Evident, echipamentele de re\u021bea nu analizeaz\u0103 con\u021binutul pachetelor \u0219i, prin urmare, pot gestiona mult mai mult de 4M pachete pe secund\u0103, f\u0103r\u0103 a men\u021biona metricile despre care nu au habar. Av\u00e2nd \u00een vedere c\u0103 metricile sosesc nu c\u00e2te una \u00een fiecare pachet, nu preconiz\u0103m probleme de performan\u021b\u0103 \u00een acest domeniu. \u00cen cazul c\u0103derii unui server, echipamentul de re\u021bea detecteaz\u0103 rapid (\u00een 1-2 secunde) acest lucru \u0219i elimin\u0103 serverul c\u0103zut din rota\u021bie. Ca rezultat, nodurile pasive (adic\u0103 cele care nu sunt lideri) pot fi activate \u0219i dezactivate aproape f\u0103r\u0103 a observa sc\u0103deri pe grafice. Maximul pe care \u00eel pierdem este o parte a metricilor sosite \u00een ultima secund\u0103. O pierdere\/switchizare\/schimbare brusc\u0103 a liderului va ar\u0103ta totu\u0219i o anomaliere nesemnificativ\u0103 (intervalul de 30 de secunde r\u0103m\u00e2ne desincronizat), dar \u00een prezen\u021ba conexiunii \u00eentre noduri, aceste probleme pot fi minimizate, de exemplu, prin trimiterea pachetelor de sincronizare.<\/p>\n<p><\/p>\n<p>Pu\u021bin despre structura intern\u0103. Aplica\u021bia, desigur, este multi-threaded, dar arhitectura firelor este diferit\u0103 de cea utilizat\u0103 \u00een brubeck. Firele \u00een brubeck sunt identice \u2013 fiecare dintre ele r\u0103spunde simultan pentru colectarea informa\u021biilor \u0219i pentru agregare. \u00cen bioyino, firele de lucru (workers) sunt \u00eemp\u0103r\u021bite \u00een dou\u0103 grupuri: cele responsabile pentru re\u021bea \u0219i cele responsabile pentru agregare. Aceast\u0103 \u00eemp\u0103r\u021bire permite gestionarea mai flexibil\u0103 a aplica\u021biei \u00een func\u021bie de tipul de metrici: acolo unde este necesar\u0103 o agregare intensiv\u0103, se pot ad\u0103uga agregatori, iar acolo unde exist\u0103 mult trafic de re\u021bea \u2013 se poate cre\u0219te num\u0103rul de fire de re\u021bea. \u00cen prezent, pe serverele noastre, lucr\u0103m cu 8 fire de re\u021bea \u0219i 4 fire de agregare.<\/p>\n<p><\/p>\n<p>Partea responsabil\u0103 pentru agregare este destul de plictisitoare. Bufferele umplute cu fluxuri de re\u021bea sunt distribuite \u00eentre firele de calcul, unde sunt parsate \u0219i agregate. La cerere, metricile sunt returnate pentru a fi trimise c\u0103tre alte noduri. Toate acestea, inclusiv transmiterea datelor \u00eentre noduri \u0219i interac\u021biunea cu Consul, se execut\u0103 asynchron. Func\u021bioneaz\u0103 pe cadrul <noindex><a rel=\"nofollow\" href=\"https:\/\/tokio.rs\">tokio<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>Mult mai multe probleme \u00een dezvoltare au ap\u0103rut din partea re\u021belei, responsabil\u0103 pentru primirea metricilor. Principala sarcin\u0103 de separare a fluxurilor de re\u021bea \u00een entit\u0103\u021bi distincte a fost dorin\u021ba de a reduce timpul pe care un flux \u00eel petrece <em>nu<\/em> pentru citirea datelor din socket. Op\u021biunile cu utilizarea UDP asincron \u0219i recvmsg clasic au fost rapid abandonate: prima consum\u0103 prea mult CPU \u00een user-space pentru procesarea evenimentelor, iar a doua \u2014 prea multe schimb\u0103ri de context. De aceea, acum se folose\u0219te <noindex><a rel=\"nofollow\" href=\"https:\/\/linux.die.net\/man\/2\/recvmmsg\">recvmmsg<\/a><\/noindex> cu buffere mari (iar bufferele, domnilor ofi\u021beri, nu sunt de ici, de colo!). Suportul pentru UDP obi\u0219nuit a fost p\u0103strat pentru cazuri ne\u00eenc\u0103rcate, c\u00e2nd nu este necesar\u0103 utilizarea recvmmsg. \u00cen modul multimessage, reu\u0219im s\u0103 atingem principalul: majoritatea timpului, fluxul de re\u021bea \u00ee\u0219i desf\u0103\u0219oar\u0103 activitatea de cur\u0103\u021bare a cozii SO \u2014 cite\u0219te datele din socket \u0219i le transfer\u0103 \u00een buffer-ul din userspace, doar ocazional comut\u00e2nd pentru a livra bufferul plin agregatorilor. Coada din socket aproape c\u0103 nu se acumuleaz\u0103, iar num\u0103rul pachetelor abandonate nu cre\u0219te semnificativ. <\/p>\n<p>\n<b class=\"spoiler_title\">Not\u0103<\/b><\/p>\n<p>\u00cen set\u0103rile implicite, dimensiunea bufferului este setat\u0103 destul de mare. Dac\u0103 cumva decide\u021bi s\u0103 testa\u021bi serverul pe cont propriu, s-ar putea s\u0103 v\u0103 confrunta\u021bi cu faptul c\u0103, dup\u0103 ce trimite\u021bi un num\u0103r mic de metrici, acestea nu ajung \u00een Graphite, r\u0103m\u00e2n\u00e2nd \u00een bufferul fluxului de re\u021bea. Pentru a lucra cu un num\u0103r mic de metrici, trebuie s\u0103 ajusta\u021bi \u00een configura\u021bie valorile bufsize \u0219i task-queue-size la unele mai mici.<\/p>\n<p><\/p>\n<p>\u00cen \u00eencheiere \u2014 c\u00e2teva grafice pentru iubitorii de grafice.<\/p>\n<p><\/p>\n<p>Statistica num\u0103rului de metrici incoming pentru fiecare server: mai mult de 2 milioane MPS.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bioyino \u2014 un agregator distribuit \u0219i scalabil de metrici\" src=\"\/wp-content\/uploads\/2019\/11\/c6cb1a36c267657d55ec22df518f8d03.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Dezactivarea uneia dintre noduri \u0219i redistribuirea metricilor incoming.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bioyino \u2014 un agregator distribuit \u0219i scalabil de metrici\" src=\"\/wp-content\/uploads\/2019\/11\/106af265a6bc2a8b31fe34df69e9c200.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Statistica pentru metricile outgoing: doar un singur nod trimite \u2014 raidboss.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bioyino \u2014 un agregator distribuit \u0219i scalabil de metrici\" src=\"\/wp-content\/uploads\/2019\/11\/582730b501a42bb3a371a84bf2e2394b.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Statistica activit\u0103\u021bii fiec\u0103rui nod lu\u00e2nd \u00een considerare erorile din diferitele module ale sistemului.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bioyino \u2014 un agregator distribuit \u0219i scalabil de metrici\" src=\"\/wp-content\/uploads\/2019\/11\/101377281c3add8c598c6439ca25d271.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Detalierea metricilor incoming (numele metricelor este ascuns).<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bioyino \u2014 un agregator distribuit \u0219i scalabil de metrici\" src=\"\/wp-content\/uploads\/2019\/11\/6cf0b61b454b0414799460c482e03242.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ce vom face cu toate acestea \u00een continuare? Desigur, vom scrie cod, bla\u2026! Proiectul a fost ini\u021bial planificat ca open-source \u0219i va r\u0103m\u00e2ne astfel pe tot parcursul vie\u021bii sale. \u00cen planurile noastre imediate se afl\u0103 tranzi\u021bia la propria versiune Raft, schimbarea protocolului peer pentru a fi mai portabil, ad\u0103ugarea de statistici interne suplimentare, noi tipuri de metrici, corectarea bug-urilor \u0219i alte \u00eembun\u0103t\u0103\u021biri. <\/p>\n<p><\/p>\n<p>Desigur, to\u021bi cei interesa\u021bi de dezvoltarea proiectului sunt bineveni\u021bi: crea\u021bi PR, Issues, vom r\u0103spunde \u0219i vom \u00eembun\u0103t\u0103\u021bi pe c\u00e2t posibil, etc.<\/p>\n<p><\/p>\n<p>Pe acest subiect, dup\u0103 cum se spune, asta e tot, cump\u0103ra\u021bi elefan\u021bii no\u0219tri!<\/p>\n<p>\n<center><div class=\"youtube-placeholder\" data-id=\"siCiIyg4ZZY\" onclick=\"loadVideo(this)\">\r\n        <img decoding=\"async\" src=\"https:\/\/img.youtube.com\/vi\/siCiIyg4ZZY\/hqdefault.jpg\" alt=\"Reda\u021bi video\" loading=\"lazy\" width=\"480\" height=\"360\" style=\"width:100%;height:auto;\">\r\n        <div class=\"play-button\"><\/div>\r\n    <\/div><\/center><br \/>\n<br \/>Sursa: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/avito\/blog\/354714\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0418\u0442\u0430\u043a, \u0432\u044b \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442\u0435 \u043c\u0435\u0442\u0440\u0438\u043a\u0438. \u041a\u0430\u043a \u0438 \u043c\u044b. \u041c\u044b \u0442\u043e\u0436\u0435 \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u043c \u043c\u0435\u0442\u0440\u0438\u043a\u0438. \u041a\u043e\u043d\u0435\u0447\u043d\u043e \u0436\u0435, \u043d\u0443\u0436\u043d\u044b\u0435 \u0434\u043b\u044f \u0431\u0438\u0437\u043d\u0435\u0441\u0430. \u0421\u0435\u0433\u043e\u0434\u043d\u044f \u043c\u044b \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0435\u043c \u043e \u0441\u0430\u043c\u043e\u043c \u043f\u0435\u0440\u0432\u043e\u043c \u0437\u0432\u0435\u043d\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u043d\u0430\u0448\u0435\u0433\u043e \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433\u0430 \u2014 statsd-\u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u043c \u0441\u0435\u0440\u0432\u0435\u0440\u0435 \u0430\u0433\u0440\u0435\u0433\u0430\u0446\u0438\u0438 bioyino, \u0437\u0430\u0447\u0435\u043c \u043c\u044b \u0435\u0433\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u043b\u0438 \u0438 \u043f\u043e\u0447\u0435\u043c\u0443 \u043e\u0442\u043a\u0430\u0437\u0430\u043b\u0438\u0441\u044c \u043e\u0442 brubeck. \u0418\u0437 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0445 \u043d\u0430\u0448\u0438\u0445 \u0441\u0442\u0430\u0442\u0435\u0439 (1, 2) \u043c\u043e\u0436\u043d\u043e \u0443\u0437\u043d\u0430\u0442\u044c, \u0447\u0442\u043e \u0434\u043e \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043c\u0435\u0442\u043a\u0438 \u043c\u044b \u0441\u043e\u0431\u0438\u0440\u0430\u043b\u0438 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-52113","post","type-post","status-publish","format-standard","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.2 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u0418\u0442\u0430\u043a, \u0432\u044b \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442\u0435 \u043c\u0435\u0442\u0440\u0438\u043a\u0438. \u041a\u0430\u043a \u0438 \u043c\u044b. \u041c\u044b \u0442\u043e\u0436\u0435 \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u043c \u043c\u0435\u0442\u0440\u0438\u043a\u0438. \u041a\u043e\u043d\u0435\u0447\u043d\u043e \u0436\u0435, \u043d\u0443\u0436\u043d\u044b\u0435 \u0434\u043b\u044f \u0431\u0438\u0437\u043d\u0435\u0441\u0430.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/ro\/blog\/administrirovanie\/bioyino-raspredelyonnyj-masshtabiruemyj-agregator-metrik\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2\" \/>\n\t\t<meta property=\"og:locale\" content=\"ro_RO\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47Bioyino \u2014 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u0439, \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u0443\u0435\u043c\u044b\u0439 \u0430\u0433\u0440\u0435\u0433\u0430\u0442\u043e\u0440 \u043c\u0435\u0442\u0440\u0438\u043a | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u0418\u0442\u0430\u043a, \u0432\u044b \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442\u0435 \u043c\u0435\u0442\u0440\u0438\u043a\u0438. \u041a\u0430\u043a \u0438 \u043c\u044b. \u041c\u044b \u0442\u043e\u0436\u0435 \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u043c \u043c\u0435\u0442\u0440\u0438\u043a\u0438. \u041a\u043e\u043d\u0435\u0447\u043d\u043e \u0436\u0435, \u043d\u0443\u0436\u043d\u044b\u0435 \u0434\u043b\u044f \u0431\u0438\u0437\u043d\u0435\u0441\u0430.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/ro\/blog\/administrirovanie\/bioyino-raspredelyonnyj-masshtabiruemyj-agregator-metrik\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2019-10-31T21:00:00+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-02-18T10:59:47+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Bioyino \u2014 un aggregator de metrici distribuit \u0219i scalabil | ProHoster","description":"Deci, str\u00e2nge\u021bi metrici. Ca \u0219i noi. Noi de asemenea str\u00e2ngem metrici. Desigur, cele necesare pentru afaceri.","canonical_url":"https:\/\/prohoster.info\/ro\/blog\/administrirovanie\/bioyino-raspredelyonnyj-masshtabiruemyj-agregator-metrik","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"ro_RO","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47Bioyino \u2014 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u0439, \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u0443\u0435\u043c\u044b\u0439 \u0430\u0433\u0440\u0435\u0433\u0430\u0442\u043e\u0440 \u043c\u0435\u0442\u0440\u0438\u043a | ProHoster","og:description":"\u0418\u0442\u0430\u043a, \u0432\u044b \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442\u0435 \u043c\u0435\u0442\u0440\u0438\u043a\u0438. \u041a\u0430\u043a \u0438 \u043c\u044b. \u041c\u044b \u0442\u043e\u0436\u0435 \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u043c \u043c\u0435\u0442\u0440\u0438\u043a\u0438. \u041a\u043e\u043d\u0435\u0447\u043d\u043e \u0436\u0435, \u043d\u0443\u0436\u043d\u044b\u0435 \u0434\u043b\u044f \u0431\u0438\u0437\u043d\u0435\u0441\u0430.","og:url":"https:\/\/prohoster.info\/ro\/blog\/administrirovanie\/bioyino-raspredelyonnyj-masshtabiruemyj-agregator-metrik","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2019-10-31T21:00:00+00:00","article:modified_time":"2020-02-18T10:59:47+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"52113","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":"2026-01-24 02:30:22","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 20:49:49","updated":"2026-01-24 02:30:22","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts\/52113","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/comments?post=52113"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts\/52113\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/media?parent=52113"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/categories?post=52113"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/tags?post=52113"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}