{"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, te kogute m\u00f5\u00f5dikute andmeid. Nagu ka meie. Me kogume samuti m\u00f5\u00f5dikute andmeid. Loomulikult on need \u00e4ritegevuseks vajalikud. T\u00e4na r\u00e4\u00e4gime meie monitooringu s\u00fcsteemi esimesest komponendist \u2014 statsd-\u00fchilduvast agregatsiooniserverist. <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>Eelmistest 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>) saate teada, et m\u00f5nda aega kogusime meie m\u00e4rgid kasutades <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/github\/brubeck\">brubeck<\/a><\/noindex>. See on kirjutatud C-s. Koodi seisukohalt \u2014 lihtne nagu kork (mis on oluline, kui soovite sellele panustada) ja mis k\u00f5ige t\u00e4htsam, suudab see ilma eriliste probleemideta hakkama saada meie 2 miljoni m\u00f5\u00f5dikuga sekundis (MPS) tipptasemel. Dokumentatsioon v\u00e4idab, et see toetab 4 miljonit MPS, kuid ainult tingimusel. See t\u00e4hendab, et selle arvu saate, kui seadistate v\u00f5rgu \u00f5igesti Linuxis. (Kui palju MPS v\u00f5ime saada, kui v\u00f5rku niisama j\u00e4tta, seda me ei tea). Vaatamata nendele eelistustele oli meil brubecki suhtes mitmeid t\u00f5siseid pretensioone.<\/p>\n<p><\/p>\n<p><em>Pretensioon 1.<\/em> Github \u2014 projekti arendaja \u2014 on l\u00f5petanud selle toetamise: ei avalda pat\u0161e ega parandusi, ei v\u00f5ta vastu meie ja (mitte ainult meie) PR-e. Viimase paari kuu jooksul (umbes alates 2018. aasta veebruarist v\u00f5i m\u00e4rtsist) on aktiivsus taas alanud, 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 osutuda t\u00f5siseks takistuseks uute funktsioonide juurutamisel.<\/p>\n<p><\/p>\n<p><em>Pretensioon 2.<\/em> Arvutuste t\u00e4psus. Brubeck kogub agregeerimiseks vaid 65536 v\u00e4\u00e4rtust. Meie juhtumil v\u00f5ib m\u00f5nede m\u00f5\u00f5dikute puhul aggregeerimise (30 sek) ajal tulla palju rohkem v\u00e4\u00e4rtusi (tipptasemel 1 527 392). Tulemuseks on, et maksimumide ja miinimumide v\u00e4\u00e4rtused tunduvad kasutud. N\u00e4iteks, nagu see: <\/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 pidi olema<\/em><\/p>\n<p><\/p>\n<p>Sama p\u00f5hjuse t\u00f5ttu arvutatakse summad kokku \u00fcldse vale. Lisage siia 32-bitise float \u00fclevoolu bug, mis saadab serveri segfault'i, kui see saab osaliselt s\u00fc\u00fctu m\u00f5\u00f5diku, ja k\u00f5ik muutub suurep\u00e4raseks. See bug, muide, pole ikka veel 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, mille suutsime leida. Kujutame ette, et mingi eraldi infrastruktuur on kasvanud nii palju, et 4 miljoni MPS vastuv\u00f5tmine on juba ebapiisav. V\u00f5i oletame, et see pole veel kasvanud, kuid m\u00f5\u00f5dikud on teie jaoks nii olulised, et isegi l\u00fchikesed, 2-3 minutilised katkestused graafikutel v\u00f5ivad muutuda kriitiliseks ja kutsub esile halbu meeleolusid juhtide seas. Kuna depressiooni ravimine on t\u00e4namatu asi, on vajalikud tehnilised lahendused.<\/p>\n<p><\/p>\n<p>Esiteks, talitluses etten\u00e4htud usaldusv\u00e4\u00e4rsus, et \u00e4kiline probleem serveris ei tekitaks kontoris ps\u00fchhiaatrilist zombi apokal\u00fcpsist. Teiseks, kaalutavus, et oleks v\u00f5imalus vastu v\u00f5tta rohkem kui 4 miljonit MPS, ilma et peaks s\u00fcgavale Linuxi v\u00f5rgu lahti kaevama ja rahulikult \u201elaiendada\u201c vajalike m\u00f5\u00f5tmete saavutamiseks.<\/p>\n<p><\/p>\n<p>Kuna meil oli laienemise osas varu, otsustasime alustada usaldusv\u00e4\u00e4rsusest. \"Oi! Usaldusv\u00e4\u00e4rsus! See on lihtne, me oskame seda,\" m\u00f5tlesime ja t\u00f5stsime \u00fcles 2 serverit, k\u00e4ivitades igas brubecki koopia. Selleks pidime kopeerima m\u00f5\u00f5dikute liiklus m\u00f5lemasse serverisse ja isegi kirjutama selle jaoks <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/Albibek\/udpdup\">v\u00e4ikese utiliidi<\/a><\/noindex>. Usaldusv\u00e4\u00e4rsuse probleem lahendati, kuid\u2026 mitte v\u00e4ga h\u00e4sti. Alguses oli k\u00f5ik nagu h\u00e4sti: iga brubeck kogub oma aggregeerimise variandi, kirjutab andmed Graphite'i iga 30 sekundi j\u00e4rel, kirjutades \u00fcle vana intervalli (see toimub Graphite'i pool). Kui \u00fcks server siiski eba\u00f5nnestub, on meil alati teine, millel on oma koopia aggregeeritud andmetest. Kuid probleem on see: kui server eba\u00f5nnestub, ilmuvad graafikud \"saagimise\" m\u00e4rgid. See on seotud sellega, et brubecki 30-sekundi intervallid ei ole s\u00fcnkroniseeritud ja eba\u00f5nnestumise hetkest ei kirjutata \u00fckski neist \u00fcle. Teise serveri k\u00e4ivitamise hetkel toimub sama. T\u00e4iesti talutav, kuid v\u00f5iks parem olla! Kaalu\u00f5iguslikkuse probleem ei ole samuti kuhugi kadunud. K\u00f5ik m\u00f5\u00f5dikud lendavad endiselt \u00fchele serverile, seet\u00f5ttu oleme piiratud sama 2-4 miljoni MPS-ga s\u00f5ltuvalt v\u00f5rgu v\u00f5imekusest.<\/p>\n<p><\/p>\n<p>Kui veidi probleemi \u00fcle m\u00f5elda ja samal ajal lund labidaga kaevata, v\u00f5ib p\u00e4he tulla selline ilmne idee: on vajalik statsd, mis suudab t\u00f6\u00f6tada jaotatud re\u017eiimis. See t\u00e4hendab, et sellise, kus on rakendatud s\u00fcnkroniseerimine s\u00f5lmede vahel aja ja m\u00f5\u00f5dikute osas. \"Loomulikult on selline lahendus kindlasti olemas,\" \u00fctlesime ja hakkasime guugeldama\u2026 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> 11.12.2017 seisuga, me ei leidnud sisuliselt midagi. Tundub, et ei arendajad ega kasutajad nendel lahendustel KOHUTAVALT suure hulga m\u00f5\u00f5dikute osas sellist asja kokku puutunud ei ole, muidu oleks nad kindlasti midagi v\u00e4lja m\u00f5elnud.<\/p>\n<p><\/p>\n<p>Ja siis meenutasime \u201em\u00e4nguasi\u201d statsd - bioyino, mille kirjutasime hackathonil lihtsalt l\u00f5bu p\u00e4rast (projekti nimi genereeriti enne hackathonit skripti abil) ning m\u00f5istsime, et me vajame kiiresti omaenda statsd-d. Miks?<\/p>\n<p><\/p>\n<ul>\n<li>sest maailmas on liiga v\u00e4he statsd kloone,<\/li>\n<li>kuna on v\u00f5imalik tagada soovitud v\u00f5i soovitavale l\u00e4hedane talitlush\u00e4ired ja skaleeritavus (sealhulgas s\u00fcnkroniseerida kokku kogutud m\u00f5\u00f5dikud serverite vahel ja lahendada konfliktid saatmise ajal),<\/li>\n<li>sest on v\u00f5imalik m\u00f5\u00f5dikud t\u00e4psemalt lugeda kui seda teeb brubeck,<\/li>\n<li>sest on v\u00f5imalik koguda ise rohkem \u00fcksikasjalikku statistikat, mida brubeck meile praktiliselt ei pakkunud,<\/li>\n<li>sest tuli v\u00f5imalus programmeerida omaenda h\u00fcperperformantne ja jaotatud rakendus, mis ei kopeeri t\u00e4ielikult teise sarnase h\u00fcperperformantsi arhitektuuri. <\/li>\n<\/ul>\n<p><\/p>\n<p>Millest kirjutada? Loomulikult Rustis. Miks?<\/p>\n<p><\/p>\n<ul>\n<li>sest protot\u00fc\u00fcp lahendus oli juba olemas,<\/li>\n<li>sest artikli autor teadis siis juba Rusti ja tahtis midagi sellel kirjutada tootmisvalmis variandina, mille ta saaks avalikuks teha,<\/li>\n<li>sest j\u00e4\u00e4tmed juhtimisprotsessidele ei sobi, arvestades saadud liiklust (peaaegu reaalajas) ja j\u00e4\u00e4tmete pausid on praktiliselt vastuv\u00f5etamatud, <\/li>\n<li>sest on vajalik maksimaalne j\u00f5udlus, mis on v\u00f5rdne C-ga<\/li>\n<li>sest Rust pakub meile kartmatut \u00fchekordset t\u00f6\u00f6tlemist, ja kui me oleksime hakanud seda kirjutama C\/C++, oleksime saanud rohkem haavatavusi, puhverdus\u00fclevalt ja v\u00f5idulepestust kui brubeckis.<\/li>\n<\/ul>\n<p><\/p>\n<p>Oli ka argument Rusti vastu. Firmal polnud Rusti projektide loomise kogemust ja praegu ei plaanita seda ka p\u00f5hiprojektis kasutada. Seega olid t\u00f5sised mured, et miski ei toimi, kuid otsustasime riskida ja proovisime.<\/p>\n<p><\/p>\n<p>Aeg kulges\u2026<\/p>\n<p><\/p>\n<p>L\u00f5puks, p\u00e4rast mitmeid eba\u00f5nnestunud katseid, oli esimene t\u00f6\u00f6tav versioon valmis. Mida saime? Saime sellise.<\/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 nod saab oma m\u00f5\u00f5dikute kogumi ja kogub neid enda juurde, kuid ei kogune m\u00f5\u00f5dikuid neid t\u00fc\u00fcpe, kus l\u00f5pliku kogumise jaoks on vaja nende t\u00e4is kogumi. Nod on omavahel \u00fchendatud m\u00f5ne jaotatud lukustamise protokolliga, mis v\u00f5imaldab valida neist selle ainulaadse (siin me nutame), kes on v\u00e4\u00e4riline saatma m\u00f5\u00f5dikud Suurele. Praegu lahendatakse see k\u00fcsimus vahendite kaudu, <noindex><a rel=\"nofollow\" href=\"https:\/\/www.consul.io\/docs\/guides\/leader-election.html\">Consul<\/a><\/noindex>, kuid tulevikus autori ambitsioonid ulatuvad tohutusse <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\">rakenduste<\/a><\/noindex> Rafti, kus see v\u00e4\u00e4riline on kindlasti konsensuse liider node. Lisaks konsensusele saadavad nod sageli (vaikimisi \u00fcks kord sekundis) oma naabritele neid eelnevalt kogutud m\u00f5\u00f5dikute osi, mis \u00f5nnestus selle sekundi jooksul koguda. See t\u00e4hendab, et skaleeritavus ja talitlush\u00e4ired s\u00e4ilivad - iga nod hoiab siiski t\u00e4ieliku kogumi m\u00f5\u00f5dikute, kuid m\u00f5\u00f5dikud saadetakse juba kogutud, TCP ja binaarprotokolli kodeerimise kaudu, mist\u00f5ttu kulud dubleerimise suunas v\u00f5rreldes UDP-d v\u00e4henevad. Hoolimata \u00fcsna suurest sisenevate m\u00f5\u00f5dikute hulgast, n\u00f5uab kogumine v\u00e4ga v\u00e4he m\u00e4lu ja veel v\u00e4hem CPU-d. Meie h\u00e4sti kokkusurutud m\u00f5\u00f5dikute puhul on see vaid paar k\u00fcmmend megabaiti andmeid. T\u00e4iendavaks kasuks on t\u00f5husate andmete \u00fcle kirjutamise puudumine Graphites, nagu see oli burbecki puhul.<\/p>\n<p><\/p>\n<p>UDP paketid koos m\u00f5\u00f5dikutega jaotatakse nodesse v\u00f5rguvarustuse kaudu lihtsa Round Robini teel. Loomulikult ei saa v\u00f5rgu riistvara pakettide sisu, seega v\u00f5ib see leida palju rohkem kui 4M paketti sekundis, r\u00e4\u00e4kimata m\u00f5\u00f5dikutest, millest ta midagi ei tea. Kui arvestada, et m\u00f5\u00f5dikud ei tule mitte \u00fcheski pakendis, siis ei prognoosime t\u00f5hususe probleeme sel hetkel. Serveri kokkuvarisemise korral tuvastab v\u00f5rgu seade t\u00f5husalt (1-2 sekundi jooksul) selle fakti ja eemaldab kukkunud serveri rotatsioonist. Selle tulemuseks on, et passiivseid (st mitte liidri) nodi saab sisse ja v\u00e4lja l\u00fclitada praktiliselt m\u00e4rkamatult. Maksimaalne, mida kaotame, on osa m\u00f5\u00f5dikuid, mis on saabunud viimase sekundi jooksul. \u00dcksik kadumine\/ v\u00e4ljal\u00fclitamine\/ liidri vahetamine joonistab siiski v\u00e4ikese anomaalia (30-sekundiline intervall j\u00e4\u00e4b endiselt s\u00fcnkroniseerimata), kuid nodide vahelise side olemasolul v\u00f5ime need probleemid minimeerida, n\u00e4iteks s\u00fcnkroniseerivate pakettide saatmise teel.<\/p>\n<p><\/p>\n<p>Veidi sisemistest struktuuridest. Rakendus on loomulikult mitmeotstarbeline, kuid voogude arhitektuur erineb brubeckist. Brubecki vood on \u00fchesugused \u2014 iga\u00fche \u00fclesanne on samaaegselt nii teabe kogumine kui ka aggregeerimine. Bioyino t\u00f6\u00f6vood (workers) on jagatud kaheks r\u00fchmaks: v\u00f5rgu- ja aggregeerimisvood. Selline jaotamine v\u00f5imaldab rakendust paindlikumalt hallata s\u00f5ltuvalt m\u00f5\u00f5dikute t\u00fc\u00fcbist: seal, kus on n\u00f5utav intensiivne aggregeerimine, saab lisada aggregeerijaid, seal, kus on palju v\u00f5rgu liiklust \u2014 suurendada v\u00f5rguvoogude arvu. Praegu t\u00f6\u00f6tame meie serverites 8 v\u00f5rku ja 4 aggregeerimisvoo.<\/p>\n<p><\/p>\n<p>Aggregeerimise eest vastutav osa on piisavalt igav. V\u00f5rguvoogudest t\u00e4idetud puhvrid jaotatakse aggregeerimise t\u00f6\u00f6tlemise voogude vahel, kus need hiljem anal\u00fc\u00fcsitakse ja kogutakse. N\u00f5utud m\u00f5\u00f5dikud saadetakse edastamiseks teistele nodidele. K\u00f5ik see, sealhulgas andmete edastamine nodide vahel ja t\u00f6\u00f6 Consuliga, toimub as\u00fcnkroonselt, tuginedes raamistikele <noindex><a rel=\"nofollow\" href=\"https:\/\/tokio.rs\">tokio<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>Arendamise ajal tekitas rohkem probleeme v\u00f5rguosa, mis vastutab m\u00f5\u00f5dikute vastuv\u00f5tmise eest. Peamine eesm\u00e4rk v\u00f5rguvoogude eraldamisel eraldi \u00fcksusteks oli aja v\u00e4hendamine, mida voog kulutab <em>ei<\/em> andmete lugemiseks soketist. Variandid as\u00fcnkroonse UDP ja tavalise recvmsg kasutamiseks langesid kiiresti v\u00e4lja: esimene kulutab 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> suuremate puhvritega (ja see, daamid ja h\u00e4rrad, ei ole sugugi t\u00fchine asi!). Tavalise UDP toimetamine on s\u00e4ilinud mittekoormatud olukordade jaoks, kus recvmmsg-i pole vaja. Multimessage re\u017eiimis saavutatakse peamine eesm\u00e4rk: enamik v\u00f5rgu voost kulutab aega OS-i j\u00e4rjekorra puhastamisel \u2014 loetakse andmeid soketist ja liigitatakse need userspace-puhvrisse, vaid harva vahetatakse aggregeerijatele edastatud t\u00e4idetud puhvrit. Soketi j\u00e4rjekord ei kogune praktiliselt, \u00e4ra visatud pakettide arv ei suurene. <\/p>\n<p>\n<b class=\"spoiler_title\">M\u00e4rkus<\/b><\/p>\n<p>Vaikes\u00e4tetes on puhver seatud piisavalt suureks. Kui otsustate serverit iseseisvalt proovida, v\u00f5ite sattuda olukorda, kus p\u00e4rast v\u00e4ikese arvu m\u00f5\u00f5dikute saatmist ei j\u00f5ua need Graphite'i, j\u00e4\u00e4des v\u00f5rgu voolu puhvris. V\u00e4ikese arvu m\u00f5\u00f5dikute jaoks tuleb seadistustes m\u00e4\u00e4rata bufsize ja task-queue-size v\u00e4\u00e4rtused v\u00e4iksemaks.<\/p>\n<p><\/p>\n<p>L\u00f5puks \u2014 m\u00f5ned grafikud graafikuhuvilistele.<\/p>\n<p><\/p>\n<p>Statistika saabuvate m\u00f5\u00f5dikute arvu kohta iga serveri kohta: \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 nodi v\u00e4ljal\u00fclitamine ja saabuvate m\u00f5\u00f5dikute \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>Statistika v\u00e4ljuvate m\u00f5\u00f5dikute kohta: ainult \u00fcks nodule saadab \u2014 raidend boss.<\/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>Statistika iga nodi t\u00f6\u00f6 kohta arvestades vigu erinevates s\u00fcsteemi moodulites.<\/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>Sissetulevate m\u00f5\u00f5dikute detailimine (m\u00f5\u00f5dikute 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>Mida me plaanime k\u00f5ikide nende tegemistega edasi teha? Loomulikult kirjutame koodi, bl\u2026! Projekt algselt plaaniti avatud l\u00e4htekoodiga ja j\u00e4\u00e4b selliseks kogu oma elu jooksul. L\u00e4hitulevikus on plaanis \u00fcleminek meie enda Rafti versioonile, peer-protokolli vahetamine kandvamaks, sisemise statistika, uute m\u00f5\u00f5dikate t\u00fc\u00fcpide lisamine, vigade parandamine ja muud t\u00e4iustused. <\/p>\n<p><\/p>\n<p>Loomulikult oodatakse k\u00f5iki, kes soovivad projekti arendamisel aidata: looge PR, Issues, ja vastuste v\u00f5imalusel teeme koost\u00f6\u00f6d jne.<\/p>\n<p><\/p>\n<p>Sellega, nagu \u00f6eldakse, that's all folks, ostke meie elevante!<\/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=\"Vaata 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.0.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.0.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 aggregeerija | ProHoster","description":"Nii, te kogute m\u00f5\u00f5dikuid. Nagu meie. Meie kogume ka m\u00f5\u00f5dikuid. Muidugi, need on \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}]}}