{"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\/sv\/blog\/administrirovanie\/bioyino-raspredelyonnyj-masshtabiruemyj-agregator-metrik","title":{"rendered":"Bioyino - en distribuerad, skalbar aggregator av metrik","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>S\u00e5, ni samlar in m\u00e4tv\u00e4rden. Precis som vi. Vi samlar ocks\u00e5 in m\u00e4tv\u00e4rden. Sj\u00e4lvklart s\u00e5dana som \u00e4r viktiga f\u00f6r aff\u00e4ren. Idag kommer vi att ber\u00e4tta om den f\u00f6rsta l\u00e4nken i v\u00e5rt \u00f6vervakningssystem \u2013 en statsd-kompatibel aggregationsserver. <noindex><a rel=\"nofollow\" href=\"http:\/\/bit.ly\/2Noxg1M\">bioyino<\/a><\/noindex>, varf\u00f6r vi skrev den och varf\u00f6r vi \u00f6vergav brubeck. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bioyino - en distribuerad, skalbar aggregator av metrik\" 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>Fr\u00e5n v\u00e5ra tidigare artiklar (<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>) kan man f\u00f6rst\u00e5 att vi tills f\u00f6r en tid sedan samlade in etiketterna med hj\u00e4lp av <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/github\/brubeck\">brubeck<\/a><\/noindex>. Den \u00e4r skriven i C. Ur kodens synvinkel \u00e4r den enkel som en kork (detta \u00e4r viktigt n\u00e4r du vill bidra) och, viktigast av allt, klarar den utan st\u00f6rre problem av v\u00e5ra volymer p\u00e5 2 miljoner m\u00e4tv\u00e4rden per sekund (MPS) i toppen. Dokumentationen p\u00e5st\u00e5r sig st\u00f6dja 4 miljoner MPS med en asterisk. Det betyder att du kommer att f\u00e5 den angivna siffran om du konfigurerar n\u00e4tverket korrekt p\u00e5 Linux. (Vi vet inte hur m\u00e5nga MPS man f\u00e5r om man l\u00e4mnar n\u00e4tverket som det \u00e4r). Trots dessa f\u00f6rdelar hade vi flera allvarliga klagom\u00e5l p\u00e5 brubeck.<\/p>\n<p><\/p>\n<p><em>Klagom\u00e5l 1.<\/em> Github \u2013 projektets utvecklare \u2013 har slutat att st\u00f6dja den: publicera patchar och fixar, ta emot v\u00e5ra och (inte bara v\u00e5ra) PR. Under de senaste m\u00e5naderna (n\u00e5gon g\u00e5ng fr\u00e5n februari-mars 2018) har aktiviteten \u00f6kat igen, men f\u00f6re det var det n\u00e4stan tv\u00e5 \u00e5r av total tystnad. Dessutom utvecklas projektet <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/github\/brubeck\/pull\/31#issuecomment-325907734\">f\u00f6r Gihubs interna behov<\/a><\/noindex>, vilket kan bli ett allvarligt hinder f\u00f6r att inf\u00f6ra nya funktioner.<\/p>\n<p><\/p>\n<p><em>Klagom\u00e5l 2.<\/em> Noggrannheten i ber\u00e4kningarna. Brubeck samlar in endast 65536 v\u00e4rden f\u00f6r aggregation. I v\u00e5rt fall kan det komma mycket fler v\u00e4rden under aggregationsperioden (30 sekunder) f\u00f6r vissa m\u00e4tv\u00e4rden (1 527 392 i toppen). Som ett resultat av s\u00e5dan sampling verkar max- och minv\u00e4rdena vara v\u00e4rdel\u00f6sa. Till exempel s\u00e5 h\u00e4r: <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bioyino - en distribuerad, skalbar aggregator av metrik\" src=\"\/wp-content\/uploads\/2019\/11\/4222a1a7d1e127137220595241f5276c.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<em>Som det var<\/em><\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bioyino - en distribuerad, skalbar aggregator av metrik\" src=\"\/wp-content\/uploads\/2019\/11\/c8f0025c61f708584328ea30aacf7bc0.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<em>S\u00e5 som det borde ha varit<\/em><\/p>\n<p><\/p>\n<p>Av samma anledning r\u00e4knas summor \u00f6verhuvudtaget felaktigt. L\u00e4gg till en bugg med \u00f6verfl\u00f6de av 32-bitars flyttal, som helt enkelt f\u00e5r servern att krascha vid mottagande av en till synes oskyldig m\u00e4tning, och det blir verkligen utm\u00e4rkt. Buggen har f\u00f6r \u00f6vrigt inte blivit \u00e5tg\u00e4rdad.<\/p>\n<p><\/p>\n<p>Och slutligen, <em>Klagom\u00e5l X<\/em>. Vid tidpunkten f\u00f6r artikelns skrivning \u00e4r vi redo att presentationera alla 14 mer eller mindre fungerande implementationer av statsd, som vi kunnat hitta. L\u00e5t oss f\u00f6rest\u00e4lla oss att en viss avgr\u00e4nsad infrastruktur har vuxit s\u00e5 mycket att 4 miljoner MPS inte l\u00e4ngre \u00e4r tillr\u00e4ckligt. Eller s\u00e5 har den kanske \u00e4nnu inte vuxit, men metrik f\u00f6r er \u00e4r redan s\u00e5 viktiga att \u00e4ven korta, 2\u20133 minuters avbrott i graferna kan bli kritiska och orsaka okontrollerbar \u00e5ngest hos cheferna. Eftersom behandling av \u00e5ngest \u00e4r en tacksam uppgift kr\u00e4vs tekniska l\u00f6sningar.<\/p>\n<p><\/p>\n<p>F\u00f6r det f\u00f6rsta, redundans, s\u00e5 att ett pl\u00f6tsligt problem p\u00e5 servern inte utl\u00f6ser en psykiatrisk zombieapokalyps p\u00e5 kontoret. F\u00f6r det andra, skalbarhet, f\u00f6r att f\u00e5 m\u00f6jlighet att hantera mer \u00e4n 4 miljoner MPS, utan att gr\u00e4va djupt i Linux n\u00e4tverksstack och kunna v\u00e4xa \"brett\" till \u00f6nskad storlek.<\/p>\n<p><\/p>\n<p>Eftersom vi hade marginal f\u00f6r skalbarhet beslutade vi att b\u00f6rja med redundans. \"\u00c5h! Redundans! Det \u00e4r enkelt, det kan vi\", t\u00e4nkte vi och startade 2 servrar, d\u00e4r vi s\u00e4tter upp en kopia av brubeck p\u00e5 varje. F\u00f6r detta beh\u00f6vde vi kopiera trafiken med metrik till b\u00e5da servrar och till och med skriva en <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/Albibek\/udpdup\">liten verktygsprogram.<\/a><\/noindex>. Redundansproblemet l\u00f6ste vi s\u00e5, men... inte s\u00e4rskilt bra. F\u00f6rst verkade allt vara bra: var och en brubeck samlar sin variant av aggregering, skriver data till Graphite var 30:e sekund, skrivandes \u00f6ver det gamla intervallet (detta g\u00f6rs p\u00e5 Graphite-sidan). Om en server skulle fallera har vi alltid en andra med en egen kopia av de aggregerade data. Men h\u00e4r \u00e4r problemet: om en server fallerar uppst\u00e5r en \"s\u00e5g\" i graferna. Detta beror p\u00e5 att 30-sekundersintervallen vid brubeck inte \u00e4r synkroniserade, och i \u00f6gonblicket av ett fall registreras inte en av dem. Vid uppstart av den andra servern sker samma sak. Ganska acceptabelt, men vi vill ha b\u00e4ttre! Problemet med skalbarhet f\u00f6rsvann inte heller. Alla metrik forts\u00e4tter att \"flyga\" till en enda server, och d\u00e4rf\u00f6r \u00e4r vi begr\u00e4nsade av de samma 2\u20134 miljoner MPS beroende p\u00e5 n\u00e4tverkskapaciteten.<\/p>\n<p><\/p>\n<p>Om man t\u00e4nker lite p\u00e5 problemet och samtidigt gr\u00e4ver sn\u00f6n med en spade, kan en s\u00e5 uppenbar id\u00e9 dyka upp: vi beh\u00f6ver statsd som kan fungera i distribuerat l\u00e4ge. Det vill s\u00e4ga, ett som har synkronisering mellan noderna baserat p\u00e5 tid och m\u00e4tdata. \"Sj\u00e4lvklart finns det s\u00e4kert redan en s\u00e5dan l\u00f6sning\", sa vi och b\u00f6rjade googla... och hittade ingenting. Efter att ha gr\u00e4vt igenom dokumentationen f\u00f6r olika statsd (<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/etsy\/statsd\/wiki#server-implementations\">https:\/\/github.com\/etsy\/statsd\/wiki#server-implementations<\/a><\/noindex> den 11.12.2017), hittade vi faktiskt ingenting. Tydligen har varken utvecklarna eller anv\u00e4ndarna av dessa l\u00f6sningar med S\u00c5DANA m\u00e4ngder m\u00e4tningar st\u00f6tt p\u00e5 det \u00e4nnu, annars hade de s\u00e4kert kommit p\u00e5 n\u00e5got.<\/p>\n<p><\/p>\n<p>Och h\u00e4r kom vi ih\u00e5g den \"leksaks\" statsd - bioyino, som vi skrev p\u00e5 hackathonet just for fun (projektets namn genererade en script inf\u00f6r hackathonet) och ins\u00e5g att vi akut beh\u00f6vde v\u00e5r egen statsd. Varf\u00f6r?<\/p>\n<p><\/p>\n<ul>\n<li>F\u00f6r att det finns f\u00f6r f\u00e5 kloner av statsd i v\u00e4rlden,<\/li>\n<li>f\u00f6r att man kan s\u00e4kerst\u00e4lla \u00f6nskad eller n\u00e4rliggande tolerans mot fel och skalbarhet (inklusive synkronisering av aggregerade m\u00e4tv\u00e4rden mellan servrar och l\u00f6sa problemet med konflikter vid s\u00e4ndning),<\/li>\n<li>f\u00f6r att man kan r\u00e4kna m\u00e4tningar mer exakt \u00e4n vad brubeck g\u00f6r,<\/li>\n<li>f\u00f6r att vi kan samla in mer detaljerad statistik, vilket brubeck knappt gav oss,<\/li>\n<li>f\u00f6r att vi fick chansen att programmera v\u00e5r egen hyperperformance distributed scalable application, som inte kommer att helt \u00e5terge arkitekturen av en annan s\u00e5dan hyper... ni f\u00f6rst\u00e5r. <\/li>\n<\/ul>\n<p><\/p>\n<p>Vad ska vi skriva p\u00e5? Sj\u00e4lvklart p\u00e5 Rust. Varf\u00f6r?<\/p>\n<p><\/p>\n<ul>\n<li>f\u00f6r att det redan fanns en prototyp av l\u00f6sningen,<\/li>\n<li>f\u00f6r att artikelf\u00f6rfattaren vid den tidpunkten redan k\u00e4nde till Rust och var sugen p\u00e5 att skriva n\u00e5got f\u00f6r produktion med m\u00f6jlighet att publicera det som open-source,<\/li>\n<li>f\u00f6r att spr\u00e5k med GC inte passar oss p\u00e5 grund av den typ av trafik vi f\u00e5r (n\u00e4stan realtime) och GC-pauser \u00e4r n\u00e4stan oacceptabla, <\/li>\n<li>f\u00f6r att vi beh\u00f6ver maximal prestanda, j\u00e4mf\u00f6rbar med C,<\/li>\n<li>f\u00f6r att Rust erbjuder oss fearless concurrency, och om vi b\u00f6rjade skriva detta i C\/C++, skulle vi f\u00e5 \u00e4nnu fler s\u00e5rbarheter, buffert\u00f6verfl\u00f6den, race conditions och andra skr\u00e4mmande ord \u00e4n vad brubeck redan har.<\/li>\n<\/ul>\n<p><\/p>\n<p>Det fanns ocks\u00e5 ett argument mot Rust. F\u00f6retaget hade ingen erfarenhet av att skapa projekt med Rust, och just nu planerar vi inte att anv\u00e4nda det i huvudprojektet. D\u00e4rf\u00f6r fanns det stora farh\u00e5gor om att inget skulle fungera, men vi besl\u00f6t oss f\u00f6r att ta risken och pr\u00f6va.<\/p>\n<p><\/p>\n<p>Tiden gick...<\/p>\n<p><\/p>\n<p>Till slut, efter flera misslyckade f\u00f6rs\u00f6k, var den f\u00f6rsta fungerande versionen klar. Vad fick vi? Vi fick n\u00e5got som detta.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bioyino - en distribuerad, skalbar aggregator av metrik\" src=\"\/wp-content\/uploads\/2019\/11\/322c4136ed033b80b31a89d7b5f63af8.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Varje nod f\u00e5r sin egen upps\u00e4ttning av metrik och samlar dem hos sig sj\u00e4lv, utan att aggregera metriker f\u00f6r de typer d\u00e4r full upps\u00e4ttning kr\u00e4vs f\u00f6r slutlig aggregering. Noderna \u00e4r kopplade till varandra genom ett protokoll f\u00f6r distribuerad l\u00e5sning (distributed lock), vilket g\u00f6r det m\u00f6jligt att v\u00e4lja den enda (h\u00e4r gr\u00e5ter vi), som \u00e4r v\u00e4rdig att skicka metrik till den Stora. Just nu l\u00f6ses detta problem med hj\u00e4lp av <noindex><a rel=\"nofollow\" href=\"https:\/\/www.consul.io\/docs\/guides\/leader-election.html\">Consul<\/a><\/noindex>, men i framtiden str\u00e4cker f\u00f6rfattarens ambitioner sig till <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/Albibek\/raft-consensus\">en egen<\/a><\/noindex> <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/Albibek\/raft-tokio\">om implementering)<\/a><\/noindex> Raft, d\u00e4r den v\u00e4rdiga \u00e4r sj\u00e4lvklart konsensusnodens ledare. F\u00f6rutom konsensus skickar noder ofta (standard en g\u00e5ng per sekund) delar av de f\u00f6raggregerade metrikerna till sina grannar, som de lyckats samla under denna sekund. Resultatet \u00e4r att skalbarhet och felresistens bevaras \u2014 varje nod h\u00e5ller fortfarande en full upps\u00e4ttning metriker, men metrikerna skickas nu som aggregerade, \u00f6ver TCP och med kodning i ett bin\u00e4rt protokoll, vilket minskar kostnaderna f\u00f6r duplicering j\u00e4mf\u00f6rt med UDP avsev\u00e4rt. Trots det ganska stora antalet inkommande metriker kr\u00e4ver insamlingen mycket lite minne och \u00e4nnu mindre CPU. F\u00f6r v\u00e5ra v\u00e4l komprimerade metriker handlar det om endast n\u00e5gra tiotal megabyte data. Ytterligare en bonus \u00e4r att vi slipper on\u00f6diga skrivningar av data i Graphite, som det var fallet med burbeck.<\/p>\n<p><\/p>\n<p>UDP-paket med m\u00e4tningar \u00e4r f\u00f6rdelade mellan noderna p\u00e5 n\u00e4tverksutrustningen genom en enkel Round Robin. Naturligtvis analyserar inte n\u00e4tverksutrustningen inneh\u00e5llet i paketen och kan d\u00e4rf\u00f6r hantera mycket mer \u00e4n 4M paket per sekund, f\u00f6r att inte tala om m\u00e4tningarna som den \u00f6verhuvudtaget inte k\u00e4nner till. Om man tar h\u00e4nsyn till att m\u00e4tningarna inte kommer en och en i varje paket, s\u00e5 f\u00f6rutser vi inga prestandaproblem p\u00e5 denna punkt. Vid serverkrasch uppt\u00e4cker n\u00e4tverksutrustningen snabbt (inom 1-2 sekunder) detta och tar bort den kraschade servern fr\u00e5n rotationen. Som ett resultat av detta kan passiva (dvs. som inte \u00e4r ledande) noder sl\u00e5s p\u00e5 och av praktiskt taget utan att man m\u00e4rker av nedg\u00e5ngar p\u00e5 graferna. Max, vad vi f\u00f6rlorar \u2014 \u00e4r en del av m\u00e4tningarna som kommit under den senaste sekunden. Pl\u00f6tslig f\u00f6rlust\/avst\u00e4ngning\/byte av ledare kommer fortfarande att visa en liten anomali (30-sekundersintervallet \u00e4r fortfarande desynkroniserat), men med kommunikation mellan noderna kan vi minimera dessa problem, till exempel genom att skicka synkroniserande paket.<\/p>\n<p><\/p>\n<p>Lite om den interna strukturen. Applikationen \u00e4r naturligtvis flerdimensionell, men tr\u00e5dararkitekturen skiljer sig fr\u00e5n den som anv\u00e4nds i brubeck. Tr\u00e5darna i brubeck \u00e4r likartade \u2014 var och en ansvarar samtidigt f\u00f6r insamling av information och aggregering. I bioyino \u00e4r arbetsstr\u00f6mmarna (workers) uppdelade i tv\u00e5 grupper: de som ansvarar f\u00f6r n\u00e4tverket och de som ansvarar f\u00f6r aggregering. Denna uppdelning g\u00f6r det m\u00f6jligt att hantera applikationen mer flexibelt beroende p\u00e5 typ av m\u00e4tningar: d\u00e4r intensiv aggregering kr\u00e4vs kan vi l\u00e4gga till fler aggregatorer, d\u00e4r det \u00e4r mycket n\u00e4tverkstrafik \u2014 \u00f6ka antalet n\u00e4tverksstr\u00f6mmar. F\u00f6r n\u00e4rvarande arbetar vi p\u00e5 v\u00e5ra servrar med 8 n\u00e4tverks- och 4 aggregerande str\u00f6mmar.<\/p>\n<p><\/p>\n<p>Den ber\u00e4kningsdel (ansvarig f\u00f6r aggregering) \u00e4r ganska tr\u00e5kig. De fyllda buffertarna fr\u00e5n n\u00e4tverksstr\u00f6mmarna f\u00f6rdelas mellan ber\u00e4kningsstr\u00f6mmarna, d\u00e4r de sedan parsar och aggregerar. Vid f\u00f6rfr\u00e5gan returneras m\u00e4tningarna f\u00f6r skickning till andra noder. Allt detta, inklusive \u00f6verf\u00f6ring av data mellan noderna och arbete med Consul, utf\u00f6rs asynkront, p\u00e5 ett ramverk <noindex><a rel=\"nofollow\" href=\"https:\/\/tokio.rs\">tokio<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>Betydligt fler problem under utvecklingen orsakades av den n\u00e4tverksdel som ansvarar f\u00f6r att ta emot m\u00e4tv\u00e4rden. Huvuduppgiften med att separera n\u00e4tverksfl\u00f6den i egna enheter var att minska den tid som fl\u00f6det anv\u00e4nder <em>inte<\/em> f\u00f6r att l\u00e4sa data fr\u00e5n socket. Alternativen med asynkront UDP och vanligt recvmsg f\u00f6ll snabbt bort: den f\u00f6rsta anv\u00e4nde f\u00f6r mycket CPU i user-space f\u00f6r h\u00e4ndelsehantering, den andra \u2014 f\u00f6r m\u00e5nga kontextbyten. D\u00e4rf\u00f6r anv\u00e4nds nu <noindex><a rel=\"nofollow\" href=\"https:\/\/linux.die.net\/man\/2\/recvmmsg\">recvmmsg<\/a><\/noindex> med stora buffertar (och buffrar, mina damer och herrar, \u00e4r inte n\u00e5got oviktigt!). St\u00f6d f\u00f6r vanligt UDP har l\u00e4mnats kvar f\u00f6r ot belastade fall d\u00e4r det inte \u00e4r n\u00f6dv\u00e4ndigt med recvmmsg. I multimeddelande-l\u00e4get lyckas vi uppn\u00e5 det viktigaste: majoriteten av tiden klarar n\u00e4tverksfl\u00f6det av att rensa operativsystemets k\u00f6 \u2014 l\u00e4ser data fr\u00e5n socket och flyttar dem till userspace-bufferten, bara s\u00e4llan v\u00e4xlar till att ge den fulla bufferten till aggregat\u00f6rer. K\u00f6n i socket ansamlas praktiskt taget inte, antalet bortkastade paket \u00f6kar knappt. <\/p>\n<p>\n<b class=\"spoiler_title\">Anm\u00e4rkning<\/b><\/p>\n<p>I standardinst\u00e4llningarna \u00e4r buffertstorleken tillr\u00e4ckligt stor. Om du av n\u00e5gon anledning beslutar dig f\u00f6r att testa servern sj\u00e4lv, kanske du st\u00f6ter p\u00e5 att efter att ha skickat en liten m\u00e4ngd m\u00e4tv\u00e4rden, kommer de inte att n\u00e5 Graphite, utan stanna kvar i n\u00e4tverksfl\u00f6dets buffert. F\u00f6r att hantera en liten m\u00e4ngd m\u00e4tv\u00e4rden beh\u00f6ver du st\u00e4lla in bufsize och task-queue-size till mindre v\u00e4rden i konfigurationsfilen.<\/p>\n<p><\/p>\n<p>Till sist \u2014 lite diagram f\u00f6r de som \u00e4lskar diagram.<\/p>\n<p><\/p>\n<p>Statistik \u00f6ver antalet inkommande m\u00e4tv\u00e4rden per server: \u00f6ver 2 miljoner MPS.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bioyino - en distribuerad, skalbar aggregator av metrik\" src=\"\/wp-content\/uploads\/2019\/11\/c6cb1a36c267657d55ec22df518f8d03.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>St\u00e4ngning av en av noderna och omf\u00f6rdelning av inkommande m\u00e4tv\u00e4rden.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bioyino - en distribuerad, skalbar aggregator av metrik\" src=\"\/wp-content\/uploads\/2019\/11\/106af265a6bc2a8b31fe34df69e9c200.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Statistik \u00f6ver utg\u00e5ende m\u00e4tv\u00e4rden: endast en nod skickar alltid \u2014 raidbossen.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bioyino - en distribuerad, skalbar aggregator av metrik\" src=\"\/wp-content\/uploads\/2019\/11\/582730b501a42bb3a371a84bf2e2394b.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Statistik \u00f6ver varje nods arbete med h\u00e4nsyn till fel i olika moduler i systemet.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bioyino - en distribuerad, skalbar aggregator av metrik\" src=\"\/wp-content\/uploads\/2019\/11\/101377281c3add8c598c6439ca25d271.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Detaljerad information om inkommande m\u00e4tv\u00e4rden (namnen p\u00e5 m\u00e4tv\u00e4rdena \u00e4r dolda).<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bioyino - en distribuerad, skalbar aggregator av metrik\" 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>Sj\u00e4lvklart \u00e4r alla som vill hj\u00e4lpa till att utveckla projektet v\u00e4lkomna: skapa PR, Issues, och vi kommer att svara och f\u00f6rb\u00e4ttra n\u00e4r vi kan, osv.<\/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=\"Spela 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 \/>K\u00e4lla: <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.4 - 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\/sv\/blog\/administrirovanie\/bioyino-raspredelyonnyj-masshtabiruemyj-agregator-metrik\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.4\" \/>\n\t\t<meta property=\"og:locale\" content=\"sv_SE\" \/>\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\/sv\/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 en distribuerad, skalbar aggregator av m\u00e4tv\u00e4rden | ProHoster","description":"S\u00e5, ni samlar m\u00e4tv\u00e4rden. Precis som vi. Vi samlar ocks\u00e5 m\u00e4tv\u00e4rden. Sj\u00e4lvklart de som \u00e4r viktiga f\u00f6r verksamheten.","canonical_url":"https:\/\/prohoster.info\/sv\/blog\/administrirovanie\/bioyino-raspredelyonnyj-masshtabiruemyj-agregator-metrik","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"sv_SE","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\/sv\/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\/sv\/wp-json\/wp\/v2\/posts\/52113","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/comments?post=52113"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/posts\/52113\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/media?parent=52113"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/categories?post=52113"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/tags?post=52113"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}