{"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\/da\/blog\/administrirovanie\/bioyino-raspredelyonnyj-masshtabiruemyj-agregator-metrik","title":{"rendered":"Bioyino \u2014 en distribueret, skalerbar metrics aggregator","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>S\u00e5, du indsamler metrics. Ligesom os. Vi indsamler ogs\u00e5 metrics. Selvf\u00f8lgelig dem, der er n\u00f8dvendige for forretningen. I dag vil vi fort\u00e6lle om det f\u00f8rste led i vores overv\u00e5gningssystem - en statsd-kompatibel aggregationsserver. <noindex><a rel=\"nofollow\" href=\"http:\/\/bit.ly\/2Noxg1M\">bioyino<\/a><\/noindex>, hvorfor vi skrev den, og hvorfor vi opgav brubeck. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bioyino \u2014 en distribueret, skalerbar metrics aggregator\" 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>Fra vores tidligere artikler (<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 du finde ud af, at vi indtil for nylig indsamlede labels ved hj\u00e6lp af <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/github\/brubeck\">brubeck<\/a><\/noindex>. Den er skrevet i C. Set fra et kodeperspektiv er den simpel som en prop (det er vigtigt, n\u00e5r du \u00f8nsker at bidrage), og vigtigst af alt, den h\u00e5ndterer vores volumener p\u00e5 2 millioner metrics per sekund (MPS) i spidsbelastninger uden st\u00f8rre problemer. Dokumentationen angiver st\u00f8tte til 4 millioner MPS med en anm\u00e6rkning. Det betyder, at du f\u00e5r det angivne tal, hvis du konfigurerer netv\u00e6rket korrekt p\u00e5 Linux. (Hvor mange MPS man kan f\u00e5, hvis man lader netv\u00e6rket v\u00e6re som det er, ved vi ikke). P\u00e5 trods af disse fordele havde vi flere alvorlige klager over brubeck.<\/p>\n<p><\/p>\n<p><em>Klager 1.<\/em> Github - udvikleren af projektet - har stoppet underst\u00f8ttelsen: offentligg\u00f8re patches og fixes, acceptere vores og (ikke kun vores) PR. I de sidste par m\u00e5neder (cirka siden februar-marts 2018) er aktiviteten genoptaget, men f\u00f8r det var der n\u00e6sten to \u00e5rs total stilhed. Desuden udvikles projektet <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/github\/brubeck\/pull\/31#issuecomment-325907734\">til interne behov hos Github<\/a><\/noindex>, hvilket kan v\u00e6re en alvorlig hindring for implementeringen af nye funktioner.<\/p>\n<p><\/p>\n<p><em>Klager 2.<\/em> N\u00f8jagtigheden af beregninger. Brubeck indsamler kun 65,536 v\u00e6rdier til aggregation. I vores tilf\u00e6lde kan der komme meget flere v\u00e6rdier inden for aggregationsperioden (30 sekunder) for nogle metrics (1,527,392 i spidsbelastning). Som f\u00f8lge af denne sampling ser maksimums- og minimumsv\u00e6rdierne ubrugelige ud. For eksempel s\u00e5dan her: <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bioyino \u2014 en distribueret, skalerbar metrics aggregator\" src=\"\/wp-content\/uploads\/2019\/11\/4222a1a7d1e127137220595241f5276c.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<em>Hvordan det var<\/em><\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bioyino \u2014 en distribueret, skalerbar metrics aggregator\" src=\"\/wp-content\/uploads\/2019\/11\/c8f0025c61f708584328ea30aacf7bc0.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<em>Hvordan det skulle have v\u00e6ret<\/em><\/p>\n<p><\/p>\n<p>Af samme grund beregnes summen overhovedet forkert. Tilf\u00f8j her en bug med overfyldning af 32-bit float, der sender serveren i segfault, n\u00e5r den modtager en tilsyneladende uskyldig metric, og det bliver endnu bedre. Bugen, for \u00f8vrigt, er stadig ikke rettet.<\/p>\n<p><\/p>\n<p>Og til sidst, <em>Klager X<\/em>. P\u00e5 tidspunktet for skrivelsen er vi klar til at pr\u00e6sentere den for alle 14 mere eller mindre fungerende implementeringer af statsd, som vi har v\u00e6ret i stand til at finde. Lad os forestille os, at en bestemt infrastruktur er vokset s\u00e5 meget, at 4 millioner MPS ikke l\u00e6ngere er tilstr\u00e6kkeligt. Eller m\u00e5ske er den endnu ikke vokset, men metrics er allerede s\u00e5 vigtige for dig, at selv kortvarige, 2-3 minutters nedbrud p\u00e5 graferne kan blive kritiske og for\u00e5rsage ubarmhjertig depression blandt ledere. Da behandling af depression er en utaknemmelig opgave, er tekniske l\u00f8sninger n\u00f8dvendige.<\/p>\n<p><\/p>\n<p>For det f\u00f8rste fejltolerance, s\u00e5 en pludselig problem med serveren ikke for\u00e5rsager et psykiatrisk zombie-apokalypse p\u00e5 kontoret. For det andet skal der v\u00e6re skalerbarhed, s\u00e5 vi kan h\u00e5ndtere mere end 4 millioner MPS uden at grave dybt i Linux-netv\u00e6rksstakken og vokse \"udad\" til de n\u00f8dvendige st\u00f8rrelser.<\/p>\n<p><\/p>\n<p>Da vi havde noget overskud til skalerbarhed, besluttede vi at starte med fejltolerance. \"\u00c5h! Fejltolerance! Det er let, det kan vi!\" t\u00e6nkte vi og startede 2 servere, og k\u00f8rte en kopi af brubeck p\u00e5 hver. For at g\u00f8re dette m\u00e5tte vi kopiere trafik med metrics til begge servere og endda skrive en lille <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/Albibek\/udpdup\">v\u00e6rkt\u00f8j<\/a><\/noindex>. Vi l\u00f8ste problemet med fejltolerance med dette, men\u2026 ikke s\u00e6rlig godt. F\u00f8rst var alt tilsyneladende fint: hver brubeck indsamler sin egen variant af aggregation, skriver data til Graphite hvert 30. sekund, og overskriver det gamle interval (dette g\u00f8res p\u00e5 Graphite-siden). Hvis en af serverne skulle svigte, har vi altid den anden med sin egen kopi af de aggregerede data. Men her er problemet: hvis serveren svigter, opst\u00e5r der en \"sav\" p\u00e5 graferne. Dette er relateret til, at de 30-sekunders intervaller hos brubeck ikke er synkroniserede, og p\u00e5 tidspunktet for nedbruddet overskrives en af dem ikke. Det samme sker ved opstarten af den anden server. Det er t\u00e5leligt, men vi \u00f8nsker mere! Problemet med skalerbarhed er heller ikke forsvundet. Alle metrics er stadig \"p\u00e5 vej\" til en enkelt server, og derfor er vi begr\u00e6nset af de samme 2-4 millioner MPS, alt efter hvordan netv\u00e6rket er opgraderet.<\/p>\n<p><\/p>\n<p>N\u00e5r man t\u00e6nker lidt over problemet og samtidig graver sne med en spade, kan en \u00e5benlys id\u00e9 komme frem: der er brug for en statsd, der kan fungere i distribueret tilstand. Det vil sige en, hvor synkronisering mellem noder er implementeret baseret p\u00e5 tid og m\u00e5linger. \"Selvf\u00f8lgelig er der sikkert allerede en s\u00e5dan l\u00f8sning,\" sagde vi og gik i gang med at google... og fandt ingenting. Efter at have gennemg\u00e5et dokumentationen for forskellige statsd (<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/etsy\/statsd\/wiki#server-implementations\">https:\/\/github.com\/etsy\/statsd\/wiki#server-implementations<\/a><\/noindex> pr. 11.12.2017), fandt vi pr\u00e6cis ingenting. Tilsyneladende har hverken udviklerne eller brugerne af disse l\u00f8sninger haft s\u00e5 MANGE m\u00e5linger at g\u00f8re med endnu, ellers ville de helt sikkert have fundet p\u00e5 et eller andet.<\/p>\n<p><\/p>\n<p>Og s\u00e5 kom vi i tanke om den \"leget\u00f8js\" statsd - bioyino, som vi lavede p\u00e5 et hackathon bare for sjov (projektets navn blev genereret af et script f\u00f8r hackathonen) og inds\u00e5, at vi hurtigt havde brug for vores egen statsd. Hvorfor?<\/p>\n<p><\/p>\n<ul>\n<li>Fordi der er alt for f\u00e5 kloner af statsd i verden,<\/li>\n<li>Fordi vi kan sikre den \u00f8nskede eller n\u00e6rv\u00e6rende fejltolerance og skalerbarhed (herunder synkronisere opsamlede m\u00e5linger mellem servere og l\u00f8se konflikter ved udsendelsen),<\/li>\n<li>Fordi vi kan m\u00e5le m\u00e5lingerne mere pr\u00e6cist end brubeck g\u00f8r,<\/li>\n<li>Fordi vi selv kan indsamle mere detaljerede statistikker, som brubeck stort set ikke gav os,<\/li>\n<li>Fordi vi fik muligheden for at programmere vores egen h\u00f8jtydende distribuerede skalaapplikation, som ikke vil gentage arkitekturen af en anden s\u00e5dan h\u00f8jtydende... nu har vi ikke. <\/li>\n<\/ul>\n<p><\/p>\n<p>Hvad skriver vi p\u00e5? Selvf\u00f8lgelig p\u00e5 Rust. Hvorfor?<\/p>\n<p><\/p>\n<ul>\n<li>Fordi der allerede var en prototype af l\u00f8sningen,<\/li>\n<li>Fordi forfatteren af artiklen p\u00e5 det tidspunkt allerede kendte Rust og \u00f8nskede at skrive noget produktionsklart, som kunne offentligg\u00f8res som open-source,<\/li>\n<li>Fordi sprog med GC ikke passer til den natur af den trafik, vi f\u00e5r (n\u00e6sten realtime) og GC-pausen er stort set uacceptabel, <\/li>\n<li>Fordi maksimal ydeevne, der kan sammenlignes med C, er n\u00f8dvendigt<\/li>\n<li>Fordi Rust giver os fearless concurrency, og hvis vi havde startet med at skrive dette i C\/C++, ville vi f\u00e5 endnu flere s\u00e5rbarheder, buffer-overl\u00f8b, race conditions og andre skr\u00e6mmende ord end hos brubeck.<\/li>\n<\/ul>\n<p><\/p>\n<p>Der var ogs\u00e5 et argument imod Rust. Virksomheden havde ingen erfaring med at skabe projekter i Rust, og vi planl\u00e6gger heller ikke at bruge det i vores hovedprojekt. Derfor var der alvorlige bekymringer om, at det ikke ville lykkes, men vi besluttede at tage chancen og pr\u00f8ve.<\/p>\n<p><\/p>\n<p>Tiden gik\u2026<\/p>\n<p><\/p>\n<p>Endelig, efter flere mislykkede fors\u00f8g, var den f\u00f8rste fungerende version klar. Hvad fik vi? Vi fik noget s\u00e5dant.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bioyino \u2014 en distribueret, skalerbar metrics aggregator\" src=\"\/wp-content\/uploads\/2019\/11\/322c4136ed033b80b31a89d7b5f63af8.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Hver node f\u00e5r sit eget s\u00e6t metrics og opbevarer dem, men aggregerer ikke metrics for de typer, hvor den endelige aggregation kr\u00e6ver det fulde s\u00e6t. Noderne er forbundet med en form for distribueret l\u00e5seprotokol (distributed lock), som g\u00f8r det muligt at v\u00e6lge den ene (her gr\u00e6d vi), der er v\u00e6rdig til at sende metrics til den Store. I \u00f8jeblikket l\u00f8ses dette problem ved hj\u00e6lp af <noindex><a rel=\"nofollow\" href=\"https:\/\/www.consul.io\/docs\/guides\/leader-election.html\">Consul<\/a><\/noindex>, men i fremtiden str\u00e6kker forfatterens ambitioner sig til <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/Albibek\/raft-consensus\">eget<\/a><\/noindex> <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/Albibek\/raft-tokio\">implementering<\/a><\/noindex> Raft, hvor den v\u00e6rdige selvf\u00f8lgelig vil v\u00e6re node-lederen for konsensus. Udover konsensus sender noderne ofte (som standard \u00e9n gang i sekundet) de dele af de pre-aggregerede metrics, som de har form\u00e5et at indsamle i l\u00f8bet af det sekund, til deres naboer. Det betyder, at skalerbarhed og fejltolerance bevares \u2014 hver af noderne har stadig det fulde s\u00e6t metrics, men metrics sendes allerede aggregeret, via TCP og med kodning i et bin\u00e6rt protokol, hvilket reducerer omkostningerne til duplication sammenlignet med UDP betydeligt. P\u00e5 trods af det ret store antal indkommende metrics kr\u00e6ver opsamlingen meget lidt hukommelse og endnu mindre CPU. For vores godt komprimerbare metrics er det kun et par dusin megabyte data. En ekstra bonus er frav\u00e6ret af un\u00f8dvendige overskrivninger af data i Graphite, som det var tilf\u00e6ldet med burbeck.<\/p>\n<p><\/p>\n<p>UDP-pakker med m\u00e5linger er balanceret mellem noder p\u00e5 netv\u00e6rksudstyret via en simpel Round Robin. Selvf\u00f8lgelig, netv\u00e6rksudstyret analyserer ikke indholdet af pakkerne og kan derfor h\u00e5ndtere langt mere end 4M pakker per sekund, for ikke at n\u00e6vne m\u00e5lingerne, som det overhovedet ikke ved noget om. Hvis man tager i betragtning, at m\u00e5lingerne kommer ikke \u00e9n ad gangen i hver pakke, s\u00e5 forventer vi ikke nogen ydeevneproblemer her. I tilf\u00e6lde af servernedbrud opdager netv\u00e6rksenheden hurtigt (inden for 1-2 sekunder), at dette er sket, og den fjerner den nedbrudte server fra rotationen. Som et resultat heraf kan passive (dvs. ikke-leder) noder t\u00e6ndes og slukkes praktisk talt uden at man bem\u00e6rker fald p\u00e5 grafikkerne. Det maksimale, vi mister, er en del m\u00e5linger, der er kommet i det sidste sekund. Pludselig tab af\/slukning\/omskiftning af lederen vil stadig vise en ubetydelig anomali (30-sekunders intervallet er stadig desynkroniseret), men med forbindelse mellem noderne kan man minimere selv disse problemer, f.eks. ved at sende synkroniserende pakker.<\/p>\n<p><\/p>\n<p>Lidt om den interne struktur. Applikationen er selvf\u00f8lgelig multitr\u00e5det, men tr\u00e5darkitekturen adskiller sig fra den, der bruges i brubeck. Tr\u00e5dene i brubeck er ens \u2014 hver af dem er ansvarlig for b\u00e5de indsamling af information og aggregation. I bioyino er arbejdsstr\u00f8mmene (workers) opdelt i to grupper: dem, der er ansvarlige for netv\u00e6rket, og dem, der er ansvarlige for aggregation. Denne opdeling tillader en mere fleksibel styring af applikationen afh\u00e6ngig af typen af m\u00e5linger: hvor der kr\u00e6ves intens aggregation, kan man tilf\u00f8je flere aggregatorer, og hvor der er meget netv\u00e6rkstrafik \u2014 kan man \u00f8ge antallet af netv\u00e6rkstr\u00e5de. I \u00f8jeblikket arbejder vi p\u00e5 vores servere med 8 netv\u00e6rkstr\u00e5de og 4 aggregerende tr\u00e5de.<\/p>\n<p><\/p>\n<p>Den t\u00e6llende (ansvarlig for aggregation) del er temmelig kedelig. De fyldte buffers fra netv\u00e6rkstr\u00e5dene distribueres mellem de t\u00e6llende tr\u00e5de, hvor de derefter parses og aggregeres. P\u00e5 foresp\u00f8rgsel gives m\u00e5lingerne tilsendt til andre noder. Alt dette, inklusive overf\u00f8rsel af data mellem noderne og arbejdet med Consul, udf\u00f8res asynkront, hvilket k\u00f8rer p\u00e5 rammev\u00e6rket <noindex><a rel=\"nofollow\" href=\"https:\/\/tokio.rs\">tokio<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>Mange flere problemer under udviklingen opstod i den netv\u00e6rkselement, der var ansvarligt for modtagelse af metrikker. Hovedopgaven med at adskille netv\u00e6rksstr\u00f8mme i separate enheder var at reducere den tid, som str\u00f8mmen bruger <em>ikke<\/em> p\u00e5 at l\u00e6se data fra socketen. Mulighederne med brug af asynkron UDP og almindelig recvmsg faldt hurtigt bort: den f\u00f8rste bruger for meget user-space CPU til at behandle begivenheder, den anden \u2014 for mange konteksskift. Derfor bruges der nu <noindex><a rel=\"nofollow\" href=\"https:\/\/linux.die.net\/man\/2\/recvmmsg\">recvmmsg<\/a><\/noindex> med store buffere (og.buffere, mine herrer, det er ikke noget at tage let p\u00e5!). St\u00f8tte til almindelig UDP er bevaret til lette tilf\u00e6lde, hvor der ikke er behov for recvmmsg. I multimessage-tilstand lykkes det at opn\u00e5 det vigtigste: at stort set det meste af tiden rydder netv\u00e6rksstr\u00f8mmen OS-k\u00f8en \u2014 l\u00e6ser data fra socketen og overf\u00f8rer dem til userspace-bufferen, kun sj\u00e6ldent skifter fokus for at aflevere den fyldte buffer til aggregatorerne. K\u00f8en i socketen ophobes praktisk talt ikke, og antallet af kasserede pakker vokser n\u00e6sten ikke. <\/p>\n<p>\n<b class=\"spoiler_title\">Bem\u00e6rk<\/b><\/p>\n<p>I de standardindstillinger, der er angivet, er bufferst\u00f8rrelsen sat til at v\u00e6re stor nok. Hvis du beslutter dig for at teste serveren selv, vil du m\u00e5ske opleve, at efter at have sendt et lille antal metrikker, s\u00e5 ankommer de ikke til Graphite, men forbliver i netv\u00e6rksstr\u00f8msbufferen. For at arbejde med den lille m\u00e6ngde metrikker, skal du s\u00e6tte bufsize og task-queue-size v\u00e6rdierne til en lavere.<\/p>\n<p><\/p>\n<p>Som afslutning \u2014 lidt grafer til graffans.<\/p>\n<p><\/p>\n<p>Statistik over antallet af indg\u00e5ende metrikker fra hver server: over 2 millioner MPS.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bioyino \u2014 en distribueret, skalerbar metrics aggregator\" src=\"\/wp-content\/uploads\/2019\/11\/c6cb1a36c267657d55ec22df518f8d03.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Deaktivering af en af noderne og omfordeling af de indg\u00e5ende metrikker.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bioyino \u2014 en distribueret, skalerbar metrics aggregator\" src=\"\/wp-content\/uploads\/2019\/11\/106af265a6bc2a8b31fe34df69e9c200.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Statistik over udg\u00e5ende metrikker: sendes der altid kun en node \u2014 raidbossen.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bioyino \u2014 en distribueret, skalerbar metrics aggregator\" src=\"\/wp-content\/uploads\/2019\/11\/582730b501a42bb3a371a84bf2e2394b.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Statistik over hver nodes arbejde med hensyn til fejl i forskellige systemmoduler.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bioyino \u2014 en distribueret, skalerbar metrics aggregator\" src=\"\/wp-content\/uploads\/2019\/11\/101377281c3add8c598c6439ca25d271.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Detaljering af de indg\u00e5ende metrikker (metriknavne er skjult).<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bioyino \u2014 en distribueret, skalerbar metrics aggregator\" src=\"\/wp-content\/uploads\/2019\/11\/6cf0b61b454b0414799460c482e03242.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Hvad planl\u00e6gger vi at g\u00f8re med alt dette fremadrettet? Selvf\u00f8lgelig at skrive kode, bl&#8230;! Projektet blev oprindeligt planlagt som open-source og vil forblive s\u00e5dan hele sin levetid. I de n\u00e6rmeste planer er der overgang til vores egen version af Raft, \u00e6ndring af peer-protokollen til en mere b\u00e6rbar, tilf\u00f8jelse af intern statistik, nye typer metrics, fejlrettelser og andre forbedringer. <\/p>\n<p><\/p>\n<p>Selvf\u00f8lgelig er alle, der \u00f8nsker at hj\u00e6lpe med udviklingen af projektet, velkomne: skab PR, Issues, og vi vil svare og forbedre, n\u00e5r det er muligt, osv.<\/p>\n<p><\/p>\n<p>P\u00e5 dette, som man siger, that&#8217;s all folks, k\u00f8b vores elefanter!<\/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=\"Afspil 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 \/>Kilde: <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.3 - 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\/da\/blog\/administrirovanie\/bioyino-raspredelyonnyj-masshtabiruemyj-agregator-metrik\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"da_DK\" \/>\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\/da\/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 distribueret, skalerbar metrics aggregator | ProHoster","description":"S\u00e5, du indsamler metrics. Ligesom os. Vi indsamler ogs\u00e5 metrics. Selvf\u00f8lgelig de, der er n\u00f8dvendige for forretningen.","canonical_url":"https:\/\/prohoster.info\/da\/blog\/administrirovanie\/bioyino-raspredelyonnyj-masshtabiruemyj-agregator-metrik","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"da_DK","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\/da\/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\/da\/wp-json\/wp\/v2\/posts\/52113","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/comments?post=52113"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/posts\/52113\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/media?parent=52113"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/categories?post=52113"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/tags?post=52113"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}