{"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\/et\/blog\/administrirovanie\/bioyino-raspredelyonnyj-masshtabiruemyj-agregator-metrik","title":{"rendered":"Bioyino \u2014 jaotatud, skaleeritav m\u00f5\u00f5dikute koondaja","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Nii et, teie kogute m\u00f5\u00f5dikuid. Nagu meie. Meie kogume samuti m\u00f5\u00f5dikuid. Loomulikult selliseid, mis on \u00e4ri jaoks vajalikud. T\u00e4na r\u00e4\u00e4gime meie j\u00e4lgimiss\u00fcsteemi esimesest elemendist \u2014 statsd-\u00fchilduvast aggregeerimiserverist. <noindex><a rel=\"nofollow\" href=\"http:\/\/bit.ly\/2Noxg1M\">bioyino<\/a><\/noindex>, miks me selle kirjutasime ja miks loobusime brubeckist. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bioyino \u2014 jaotatud, skaleeritav m\u00f5\u00f5dikute koondaja\" 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>Meie varasematest artiklitest (<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>) saab teada, et kuni teatud ajani kogusime m\u00e4rke brubecki abil. <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/github\/brubeck\">brubeck<\/a><\/noindex>. See on kirjutatud C-s. Koodivaates \u2014 lihtne nagu kork (see on oluline, kui soovite panustada) ja, mis k\u00f5ige t\u00e4htsam, suudab see meie mahtudega 2 miljonit m\u00f5\u00f5dikut sekundis (MPS) tipptasemel probleemideta hakkama saada. Dokumentatsioon lubab 4 miljonit MPS t\u00e4hega. See t\u00e4hendab, et nimetatud number saavutatakse, kui seadistate v\u00f5rgu Linuxis \u00f5igesti. (Kui palju MPS on v\u00f5imalik saada, kui v\u00f5rku j\u00e4tta selliseks nagu on, ei ole meile teada). Hoolimata neist eeliseid oli brubecki suhtes mitmeid t\u00f5siseid pretensioone.<\/p>\n<p><\/p>\n<p><em>Pretensioon 1.<\/em> Github \u2014 projekti arendaja \u2014 l\u00f5petas selle toetamise: plaastrite ja paranduste avaldamise, meie ja (mitte ainult meie) PR-de vastuv\u00f5tmise. Viimastel kuudel (umbes alates veebruari-m\u00e4rtsi 2018) on aktiivsus taaselustatud, kuid enne seda oli peaaegu 2 aastat t\u00e4ielikku vaikust. Lisaks on projekt arendatud <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/github\/brubeck\/pull\/31#issuecomment-325907734\">Gihubi sisemiste vajaduste jaoks<\/a><\/noindex>, mis v\u00f5ib saada t\u00f5siseks takistuseks uute v\u00f5imaluste rakendamisel.<\/p>\n<p><\/p>\n<p><em>Pretensioon 2.<\/em> Arvutuste t\u00e4psus. Brubeck kogub aggregeerimiseks vaid 65536 v\u00e4\u00e4rtust. Meie puhul v\u00f5ib m\u00f5nede m\u00f5\u00f5dikute puhul aggregeerimise perioodi (30 sek) jooksul tulla palju rohkem v\u00e4\u00e4rtusi (tipptasemel 1 527 392). Sellise prooviv\u00f5tmise tulemusena n\u00e4evad maksimumide ja miinimumide v\u00e4\u00e4rtused t\u00e4iesti kasutud. N\u00e4iteks, nii: <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bioyino \u2014 jaotatud, skaleeritav m\u00f5\u00f5dikute koondaja\" src=\"\/wp-content\/uploads\/2019\/11\/4222a1a7d1e127137220595241f5276c.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<em>Kuidas oli<\/em><\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bioyino \u2014 jaotatud, skaleeritav m\u00f5\u00f5dikute koondaja\" src=\"\/wp-content\/uploads\/2019\/11\/c8f0025c61f708584328ea30aacf7bc0.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<em>Nii nagu oleks pidanud olema<\/em><\/p>\n<p><\/p>\n<p>Sama p\u00f5hjusel arvestatakse summasid \u00fcldiselt valesti. Lisage siia 32-bitisest floatist tulenev \u00fclevoolu viga, mis saadab serveri segfault'i, kui see saab n\u00e4iliselt s\u00fc\u00fctuid m\u00f5\u00f5dikuid, ja asi muutub veelgi paremaks. Viga, muide, pole siiani parandatud.<\/p>\n<p><\/p>\n<p>Ja l\u00f5puks, <em>Pretensioon X<\/em>. Artikli kirjutamise hetkeks oleme valmis esitama selle k\u00f5igile 14 enam-v\u00e4hem t\u00f6\u00f6tavale statsd rakendusele, mida oleme suutnud leida. Kujutame ette, et m\u00f5ni infrastruktuur on kasvanud piisavalt suureks, et 4 miljoni MPS vastuv\u00f5tmine ei ole enam piisav. V\u00f5i olgu see veel kasvanud, kuid m\u00f5\u00f5dikud on teie jaoks juba nii olulised, et isegi l\u00fchikesed, 2-3 minuti pikkused katkestused graafikutes v\u00f5ivad olla kriitilised ja tekitada halbu tujusi juhtide seas. Kuna depressiooni ravimine on t\u00e4namatu t\u00f6\u00f6, vajame tehnilisi lahendusi.<\/p>\n<p><\/p>\n<p>Esiteks, talitlush\u00e4irete vastupidavus, et ootamatud serveriprobleemid ei cause`iks kontoris ps\u00fchhiaatrilist zombiapokalypsi. Teiseks, skaleeritavus, et saaksime vastu v\u00f5tta rohkem kui 4 miljonit MPS, ilma et peaksime s\u00fcgavale Linuxi v\u00f5rgu kihti kaevama ja rahulikult laienema \u201elaiusesse\u201c soovitud suuruseni.<\/p>\n<p><\/p>\n<p>Kuna meil oli skaleeritavuse osas varu, otsustasime alustada talitlush\u00e4irete vastupidavusest. \"O! Talitlush\u00e4irete vastupidavus! See on lihtne, me oskame seda!\" \u2014 m\u00f5tlesime ja k\u00e4ivitasime 2 serverit, t\u00f5stes iga\u00fchele \u00fcles brubeck koopia. Selleks pidime kopeerima liikluse m\u00f5\u00f5dikutega m\u00f5lemasse serverisse ja isegi kirjutama selle jaoks <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/Albibek\/udpdup\">v\u00e4ikese utiliidi<\/a><\/noindex>. Me lahendasime talitlush\u00e4irete vastupidavuse probleemi, kuid... mitte eriti h\u00e4sti. Algul tundus k\u00f5ik olevat suurep\u00e4rane: iga brubeck kogub oma aggregeerimise versiooni, kirjutab andmed Graphite'i iga 30 sekundi tagant, \u00fclekirjutades vana intervalli (see toimub Graphite'i pool). Kui \u00fcks server peaks riknema, on meil alati olemas teine server koos oma aggregeeritud andmete koopia. Kuid probleem on selles, et kui server rikneb, tekib graafikutesse \"saag\". See on tingitud sellest, et brubeck'i 30-sekundi intervallid ei ole s\u00fcnkroonitud ja katkestuse hetkel ei \u00fclekirjutata \u00fchte neist. Kui teine server k\u00e4ivitatakse, toimub sama asi. T\u00e4iesti talutav, kuid tahaks parem! Skaleeritavuse probleem pole samuti kuhugi kadunud. K\u00f5ik m\u00f5\u00f5dikud jooksevad endiselt \u00fchele serverile, seega oleme piiratud samade 2-4 miljoni MPS-ga, s\u00f5ltuvalt v\u00f5rgu j\u00f5udlusest.<\/p>\n<p><\/p>\n<p>Kui m\u00f5elda probleemile ja samal ajal l\u00fchikese labidaga lund kaevata, v\u00f5ib p\u00e4he tulla \u00fcks ilmne m\u00f5te: meil on vaja statsd, mis suudab t\u00f6\u00f6tada jaotatud re\u017eiimis. See t\u00e4hendab, et see v\u00f5imaldab s\u00fcnkroniseerida nodede vahel aega ja m\u00f5\u00f5dikuid. \"Loomulikult on selline lahendus juba olemas,\" \u00fctlesime ja l\u00e4ksime guugeldama... Ja ei leidnud midagi. Uurides erinevate statsd dokumentatsiooni (<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/etsy\/statsd\/wiki#server-implementations\">https:\/\/github.com\/etsy\/statsd\/wiki#server-implementations<\/a><\/noindex> 31.12.2017), ei leidnud me tegelikult mitte midagi. Tundub, et ei arendajad ega kasutajad ei ole sellise KOGUSE m\u00f5\u00f5dikutega seni kokku puutunud, muidu oleks nad kindlasti midagi v\u00e4lja m\u00f5elnud.<\/p>\n<p><\/p>\n<p>Ja siis meenutasime me \"m\u00e4nguasja\" statsd - bioyino, mille olime kirjutatud hackathonil lihtsalt l\u00f5bu p\u00e4rast (projekti nimi genereeris skript enne hackathoni algust) ja m\u00f5istsime, et meil on h\u00e4dasti vaja oma statsd. Miks?<\/p>\n<p><\/p>\n<ul>\n<li>sest maailmas on liiga v\u00e4he statsd kloone,<\/li>\n<li>sest on v\u00f5imalik tagada soovitud v\u00f5i soovitavale l\u00e4hedane vigade taluvus ja skalaarne kasv (sealhulgas s\u00fcnkroniseerida agreetitud m\u00f5\u00f5dikud serverite vahel ja lahendada konfliktid edastamise ajal),<\/li>\n<li>sest m\u00f5\u00f5dikuid on v\u00f5imalik arvestada t\u00e4psemalt kui brubeck,<\/li>\n<li>sest saame ise koguda detailsemat statistikat, mida brubeck meile praktiliselt ei pakkunud,<\/li>\n<li>sest tekkis v\u00f5imalus programmeerida oma h\u00fcperperformantne jaotatud skaleeritav rakendus, mis ei j\u00e4lgi t\u00e4ielikult teise sarnase h\u00fcperperform... nuviponeli arhitektuuri. <\/li>\n<\/ul>\n<p><\/p>\n<p>Millega me kirjutame? Loomulikult Rustiga. Miks?<\/p>\n<p><\/p>\n<ul>\n<li>sest protot\u00fc\u00fcp lahendus oli juba olemas,<\/li>\n<li>sest artikli autor teadis tol ajal juba Rusti ja tahtis sellel kirjutada midagi tootmises koos v\u00f5imalusega avaldada see open-source,<\/li>\n<li>sest GC-ga keelad ei sobi meile saadud liikluse loomuse t\u00f5ttu (peaaegu reaalajas) ja GC-pausid on peaaegu vastuv\u00f5etamatud, <\/li>\n<li>sest maksimaalne j\u00f5udlus on vajalik, v\u00f5rreldav C-ga<\/li>\n<li>sest Rust pakub meile fearless concurrency, ja kui me oleksime hakanud seda kirjutama C\/C++-ga, oleksime saanud veel rohkem haavatavusi, puhkerikkumisi, race conditions ja muid hirmutavaid s\u00f5nu kui brubeck.<\/li>\n<\/ul>\n<p><\/p>\n<p>Oli ka argumente ka Rusti vastu. Ettev\u00f5ttel ei olnud kogemusi projektide loomisel Rustis ning praegu me ka ei plaani seda oma peamises projektis kasutada. Seet\u00f5ttu oli t\u00f5siseid muresid, et midagi ei \u00f5nnestu, kuid otsustasime riskida ja proovida.<\/p>\n<p><\/p>\n<p>Aeg m\u00f6\u00f6dus...<\/p>\n<p><\/p>\n<p>L\u00f5puks, p\u00e4rast mitmeid eba\u00f5nnestunud katseid, oli esimene t\u00f6\u00f6tav versioon valmis. Mis v\u00e4lja tuli? Tuli just selline.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bioyino \u2014 jaotatud, skaleeritav m\u00f5\u00f5dikute koondaja\" src=\"\/wp-content\/uploads\/2019\/11\/322c4136ed033b80b31a89d7b5f63af8.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Iga s\u00f5lm saab oma m\u00f5\u00f5dikute komplekti ja kogub need enda juurde, kuid ei agrega m\u00f5\u00f5dikuid nende t\u00fc\u00fcpide jaoks, kus l\u00f5ppagregatsiooni jaoks on vajalik nende t\u00e4iskomplekt. S\u00f5lmed on \u00fchendatud mingi jaotatud lukustuse protokolliga, mis v\u00f5imaldab valida nende seast selle ainsa (siin me nutame), mis on teeninud \u00f5iguse edastada m\u00f5\u00f5dikud Suurele. Praegu lahendab seda probleemi <noindex><a rel=\"nofollow\" href=\"https:\/\/www.consul.io\/docs\/guides\/leader-election.html\">Consul<\/a><\/noindex>, kuid tulevikus ulatuvad autori ambitsioonid <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/Albibek\/raft-consensus\">oma<\/a><\/noindex> <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/Albibek\/raft-tokio\">tehnoloogia<\/a><\/noindex> Rafti, kus see ainu\u00f5igust saanud on loomulikult konsensuse juht. Lisaks konsensusele saadavad s\u00f5lmed \u00fcsna sageli (vaikimisi \u00fcks kord sekundis) oma naabritele need eel-agreggeeritud m\u00f5\u00f5dikute osad, mida \u00f5nnestus selle sekundi jooksul koguda. Selgub, et skaleeritavus ja t\u00f5rketaluvus s\u00e4ilivad - iga s\u00f5lm hoiab endas endiselt t\u00e4iskiht m\u00f5\u00f5dikuid, kuid m\u00f5\u00f5dikud saadetakse n\u00fc\u00fcd juba agreggeeritult, TCP kaudu ja binaarprotokolli kodeerimisega, seega kulud dubleerimisele on v\u00f5rreldes UDP-ga m\u00e4rkimisv\u00e4\u00e4rselt v\u00e4henenud. Hoolimata \u00fcsna suurest sisenevate m\u00f5\u00f5dikute arvust, vajab kogumine v\u00e4ga v\u00e4he m\u00e4lu ja veel v\u00e4hem CPU-d. Meie h\u00e4sti tihendatud m\u00f5\u00f5dikute jaoks on see vaid paar k\u00fcmmet megabaiti andmeid. T\u00e4iendava boonuseks saame andmete liigsete \u00fcle kirjutamiste puudumise Graphites, nagu see oli burbeckiga.<\/p>\n<p><\/p>\n<p>UDP-paketid koos m\u00f5\u00f5dikute v\u00e4\u00e4rtustega jagunevad v\u00f5rguseadmestikuna lihtsalt Round Robin'i meetodil. Loomulikult ei anal\u00fc\u00fcsi v\u00f5rgu riistvara pakettide sisu ning seega suudab see k\u00e4sitleda palju rohkem kui 4M paketti sekundis, r\u00e4\u00e4kimata m\u00f5\u00f5dikutest, millest see \u00fcldse midagi ei tea. Arvestades, et m\u00f5\u00f5dikud saabuvad mitte \u00fckshaaval igas pakendis, ei prognoosi me siin j\u00f5udluse probleeme. Kui server peaks alla minema, tuvastab v\u00f5rgu seade kiiresti (1-2 sekundi jooksul) selle olukorra ning eemaldab langemisega serveri rotatsioonist. Tulemuseks on see, et passiivseid (st mitte liidri) node saab sisse ja v\u00e4lja l\u00fclitada peaaegu m\u00e4rkamatult graafikute langemisi. Maksimum, mida me kaotame, on osa m\u00f5\u00f5dikuid, mis saabusid viimase sekundi jooksul. \u00c4kiline kadumine\/l\u00fclitamine\/liidri vahetus joonistab endiselt v\u00e4ikese anomaalia (30-sekundiline intervall j\u00e4\u00e4b endiselt des\u00fcnkroniseerituks), kuid node'ide vaheline side aitab minimeerida ka need probleemid, n\u00e4iteks saatmisega s\u00fcnkroonimis paketid.<\/p>\n<p><\/p>\n<p>Natuke meie sisemisest seadistusest. Rakendus on muidugi mitme l\u00f5imega, kuid l\u00f5imed arhitektuur erineb sellest, mida on kasutatud brubeck'is. L\u00f5imed brubeck'is on \u00fchesugused \u2014 iga\u00fche \u00fclesanne on samaaegselt koguda teavet ja teha selle agregatsiooni. bioyino's on t\u00f6\u00f6 l\u00f5imed (workers) jagatud kaheks grupiks: \u00fched vastutavad v\u00f5rgu eest ja teised vastutavad agregatsiooni eest. Selline jaotus v\u00f5imaldab rakendust paindlikumalt juhtida s\u00f5ltuvalt m\u00f5\u00f5dikute t\u00fc\u00fcbist: seal, kus vajatakse intensiivset agregatsiooni, saab suurendada agregaatoreid, seal, kus on palju v\u00f5rgu liiklust \u2014 suurendada v\u00f5rgul\u00f5imede arvu. Hetkel t\u00f6\u00f6tame meie serverites 8 v\u00f5rgl\u00f5ime ja 4 agregatsioonil\u00f5imega.<\/p>\n<p><\/p>\n<p>Agregeerimise (arvestava) osa t\u00f6\u00f6 on piisavalt igav. V\u00f5rgul\u00f5imede poolt t\u00e4idetud puhvri jaotamine toimub arvestavatel l\u00f5imedel, kus andmed parseli ja agrigeeritakse. Kui palutakse m\u00f5\u00f5dikud, antakse need edasi teistele node'idele. K\u00f5ik see, sealhulgas andmete edastamine node'ide vahel ja t\u00f6\u00f6 Consul'iga, toimub as\u00fcnkroonselt, t\u00f6\u00f6tab raamistiku peal. <noindex><a rel=\"nofollow\" href=\"https:\/\/tokio.rs\">tokio<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>Arendusplatside arendamise k\u00e4igus esines palju probleeme v\u00f5rguosas, mis oli vastutav m\u00f5\u00f5tmiste vastuv\u00f5tu eest. Peamine eesm\u00e4rk v\u00f5rguvoogude eraldamiseks eraldi \u00fcksusteks oli p\u00fc\u00fcd v\u00e4hendada aega, mida voog kulutab <em>ei<\/em> andmete lugemiseks soketist. As\u00fcnkroonseid UDP ja tavap\u00e4rase recvmsg'i variandid langesid kiiresti v\u00e4lja: esimene kasutab liiga palju user-space CPU-d s\u00fcndmuste t\u00f6\u00f6tlemiseks, teine \u2014 liiga palju konteksti vahetusi. Seet\u00f5ttu kasutatakse praegu <noindex><a rel=\"nofollow\" href=\"https:\/\/linux.die.net\/man\/2\/recvmmsg\">recvmmsg<\/a><\/noindex> suurte puhverdate (ja puhv\u00e4rd, h\u00e4rra ohvitserid, see pole mingisugune nalja asi!). Tavalise UDP toe s\u00e4ilitamine on j\u00e4\u00e4nud koormamata juhtumitele, kus recvmmsg'i ei ole tingimata vaja. Multimeetsere\u017eiimis suudetakse saavutada p\u00f5hiline eesm\u00e4rk: enamik aega veedab v\u00f5rguvoog OS-i j\u00e4rjekorra sorteerimisel \u2014 loeb andmeid soketist ja paneb need userspace'i puhvri, vaid harva vahetades, et anda t\u00e4idetud puhver edasi agregaatoritele. Soketi j\u00e4rjekord praktiliselt ei kogune, visatud pakettide arv praktiliselt ei kasva. <\/p>\n<p>\n<b class=\"spoiler_title\">M\u00e4rkus<\/b><\/p>\n<p>Vaikimisi s\u00e4tetega on puhvri suurus seadistatud piisavalt suureks. Kui otsustate serverit ise proovida, v\u00f5ite kokku puutuda olukorraga, kus p\u00e4rast v\u00e4ikese hulga m\u00f5\u00f5tmiste saatmist need ei j\u00f5ua Graphite'i, j\u00e4\u00e4des v\u00f5rguvoo puhvri. V\u00e4ikese hulga m\u00f5\u00f5tmiste t\u00f6\u00f6tlemiseks tuleb seadistuses m\u00e4\u00e4rata bufsize ja task-queue-size v\u00e4iksemate v\u00e4\u00e4rtustega.<\/p>\n<p><\/p>\n<p>L\u00f5petuseks \u2014 veidi graafikuid graafikute armastajatele.<\/p>\n<p><\/p>\n<p>Sisse tulevate m\u00f5\u00f5tmiste statistika igas serveris: \u00fcle 2 miljoni MPS.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bioyino \u2014 jaotatud, skaleeritav m\u00f5\u00f5dikute koondaja\" src=\"\/wp-content\/uploads\/2019\/11\/c6cb1a36c267657d55ec22df518f8d03.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u00dche node v\u00e4ljal\u00fclitamine ja sisse tulevate m\u00f5\u00f5tmiste \u00fcmberjaotamine.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bioyino \u2014 jaotatud, skaleeritav m\u00f5\u00f5dikute koondaja\" src=\"\/wp-content\/uploads\/2019\/11\/106af265a6bc2a8b31fe34df69e9c200.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>V\u00e4ljuvate m\u00f5\u00f5tmiste statistika: saadab alati ainult \u00fcks node \u2014 raidboss.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bioyino \u2014 jaotatud, skaleeritav m\u00f5\u00f5dikute koondaja\" src=\"\/wp-content\/uploads\/2019\/11\/582730b501a42bb3a371a84bf2e2394b.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Iga node'i t\u00f6\u00f6 statistika, arvesse v\u00f5ttes s\u00fcsteemi erinevate moodulite vigu.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bioyino \u2014 jaotatud, skaleeritav m\u00f5\u00f5dikute koondaja\" src=\"\/wp-content\/uploads\/2019\/11\/101377281c3add8c598c6439ca25d271.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Sisse tulevate m\u00f5\u00f5tmiste detailiseerimine (m\u00f5\u00f5tmiste nimed on varjatud).<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bioyino \u2014 jaotatud, skaleeritav m\u00f5\u00f5dikute koondaja\" src=\"\/wp-content\/uploads\/2019\/11\/6cf0b61b454b0414799460c482e03242.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u0427\u0442\u043e \u043c\u044b \u043f\u043b\u0430\u043d\u0438\u0440\u0443\u0435\u043c \u0441 \u044d\u0442\u0438\u043c \u0432\u0441\u0435\u043c \u0434\u0435\u043b\u0430\u0442\u044c \u0434\u0430\u043b\u044c\u0448\u0435? \u041a\u043e\u043d\u0435\u0447\u043d\u043e \u0436\u0435 \u043f\u0438\u0441\u0430\u0442\u044c \u043a\u043e\u0434, \u0431\u043b&#8230;! \u041f\u0440\u043e\u0435\u043a\u0442 \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043b\u0441\u044f \u043a\u0430\u043a open-source \u0438 \u043e\u0441\u0442\u0430\u043d\u0435\u0442\u0441\u044f \u0442\u0430\u043a\u0438\u043c \u0432\u0441\u044e \u0435\u0433\u043e \u0436\u0438\u0437\u043d\u044c. \u0412 \u0431\u043b\u0438\u0436\u0430\u0439\u0448\u0438\u0445 \u043f\u043b\u0430\u043d\u0430\u0445 \u2014 \u043f\u0435\u0440\u0435\u0445\u043e\u0434 \u043d\u0430 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e Raft, \u0441\u043c\u0435\u043d\u0430 peer-\u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430 \u043d\u0430 \u0431\u043e\u043b\u0435\u0435 \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0438\u043c\u044b\u0439, \u0432\u043d\u0435\u0441\u0435\u043d\u0438\u0435 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u0439 \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0438, \u043d\u043e\u0432\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 \u043c\u0435\u0442\u0440\u0438\u043a, \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043e\u0448\u0438\u0431\u043e\u043a \u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u044f. <\/p>\n<p><\/p>\n<p>Loomulikult on k\u00f5ik, kes soovivad projekti arendamisele kaasa aidata, teretulnud: looge PR-e, Issues, vastame ja t\u00e4iustame v\u00f5imaluste piires jne.<\/p>\n<p><\/p>\n<p>\u041d\u0430 \u044d\u0442\u043e\u043c, \u043a\u0430\u043a \u0433\u043e\u0432\u043e\u0440\u0438\u0442\u0441\u044f, that&#8217;s all folks, \u043f\u043e\u043a\u0443\u043f\u0430\u0439\u0442\u0435 \u043d\u0430\u0448\u0438\u0445 \u0441\u043b\u043e\u043d\u043e\u0432!<\/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=\"M\u00e4ngi videot\" 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 \/>Allikas: <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.1.1 - 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\/et\/blog\/administrirovanie\/bioyino-raspredelyonnyj-masshtabiruemyj-agregator-metrik\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"et_EE\" \/>\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\/et\/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 jaotatud, skaleeritav m\u00f5\u00f5dikute kogum | ProHoster","description":"Nii et kogute m\u00f5\u00f5dikud. Nagu meiegi. Me kogume samuti m\u00f5\u00f5dikud. Loomulikult on need \u00e4ri jaoks vajalikud.","canonical_url":"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/bioyino-raspredelyonnyj-masshtabiruemyj-agregator-metrik","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"et_EE","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\/et\/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\/et\/wp-json\/wp\/v2\/posts\/52113","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/comments?post=52113"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts\/52113\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/media?parent=52113"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/categories?post=52113"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/tags?post=52113"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}