{"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\/it\/blog\/administrirovanie\/bioyino-raspredelyonnyj-masshtabiruemyj-agregator-metrik","title":{"rendered":"Bioyino \u2014 un aggregatore di metriche distribuito e scalabile","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Quindi, state raccogliendo metriche. Proprio come noi. Anche noi raccogliamo metriche. Certamente quelle utili per il business. Oggi parleremo del primo anello del nostro sistema di monitoraggio: un server di aggregazione compatibile con statsd. <noindex><a rel=\"nofollow\" href=\"http:\/\/bit.ly\/2Noxg1M\">bioyino<\/a><\/noindex>, il motivo per cui l'abbiamo scritto e perch\u00e9 abbiamo abbandonato brubeck. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bioyino \u2014 un aggregatore di metriche distribuito e scalabile\" 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>Dai nostri articoli precedenti (<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>) puoi scoprire che fino a un certo punto abbiamo raccolto i nostri dati tramite <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/github\/brubeck\">brubeck<\/a><\/noindex>. \u00c8 scritto in C. Dal punto di vista del codice - semplice come un tappo (questo \u00e8 importante quando vuoi contribuire) e, cosa pi\u00f9 importante, gestisce senza particolari problemi i nostri volumi di 2 milioni di metriche al secondo (MPS) al picco. La documentazione afferma di supportare 4 milioni di MPS con asterisco. Ci\u00f2 significa che otterrai il numero dichiarato se configuri correttamente la rete su Linux. (Non sappiamo quante MPS si possono ottenere lasciando la rete com'\u00e8). Nonostante questi vantaggi, avevamo alcune serie lamentele su brubeck.<\/p>\n<p><\/p>\n<p><em>Lamentela 1.<\/em> Github \u2014 lo sviluppatore del progetto \u2014 ha smesso di supportarlo: pubblicare patch e fix, accettare le nostre e (non solo le nostre) PR. Negli ultimi mesi (circa da febbraio-marzo 2018) l'attivit\u00e0 \u00e8 ripresa, ma prima di ci\u00f2 c'\u00e8 stata quasi 2 anni di completo silenzio. Inoltre, il progetto \u00e8 sviluppato <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/github\/brubeck\/pull\/31#issuecomment-325907734\">per esigenze interne di Gihub<\/a><\/noindex>, il che pu\u00f2 rappresentare un serio ostacolo all'implementazione di nuove funzionalit\u00e0.<\/p>\n<p><\/p>\n<p><em>Reclamo 2.<\/em> Precisione dei calcoli. Brubeck raccoglie solo 65536 valori per l'aggregazione. Nel nostro caso, per alcune metriche durante il periodo di aggregazione (30 secondi) possono arrivare molte pi\u00f9 valore (1.527.392 al picco). Di conseguenza, i valori massimi e minimi sembrano inutili. Ad esempio, ecco come dovrebbe apparire: <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bioyino \u2014 un aggregatore di metriche distribuito e scalabile\" src=\"\/wp-content\/uploads\/2019\/11\/4222a1a7d1e127137220595241f5276c.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<em>Come era<\/em><\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bioyino \u2014 un aggregatore di metriche distribuito e scalabile\" src=\"\/wp-content\/uploads\/2019\/11\/c8f0025c61f708584328ea30aacf7bc0.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<em>Come dovrebbe essere<\/em><\/p>\n<p><\/p>\n<p>Per lo stesso motivo, le somme sono considerate del tutto scorrette. Aggiungi a ci\u00f2 il bug del overflow del float a 32 bit, che manda in segfault il server all'arrivo di una metrica apparentemente innocua, e diventa davvero eccellente. Il bug, per inciso, non \u00e8 stato ancora corretto.<\/p>\n<p><\/p>\n<p>E, infine, <em>Reclamo X<\/em>. Al momento della stesura di questo articolo, siamo pronti a presentarlo a tutte e 14 le implementazioni di statsd che siamo riusciti a trovare. Immaginiamo che un'infrastruttura specifica sia cresciuta a tal punto da rendere insufficienti 4 milioni di MPS. Oppure, magari non \u00e8 ancora cresciuta, ma le metriche sono gi\u00e0 cos\u00ec importanti per voi che anche brevi cali, di 2-3 minuti, nei grafici possono risultare critici e provocare episodi di depressione negli manager. Poich\u00e9 curare la depressione \u00e8 un compito ingrato, sono necessarie soluzioni tecniche.<\/p>\n<p><\/p>\n<p>In primo luogo, la tolleranza ai guasti, affinch\u00e9 un problema imprevisto su un server non scateni un'apocalisse zombie psichiatrica in ufficio. In secondo luogo, la scalabilit\u00e0, per poter gestire pi\u00f9 di 4 milioni di MPS, senza dover scavare a fondo nello stack di rete di Linux e crescere tranquillamente \"in larghezza\" fino alle dimensioni necessarie.<\/p>\n<p><\/p>\n<p>Poich\u00e9 avevamo margine per la scalabilit\u00e0, abbiamo deciso di iniziare con la resilienza. \"Oh! Resilienza! \u00c8 semplice, lo sappiamo fare\", abbiamo pensato e abbiamo avviato 2 server, sollevando su ciascuno una copia di brubeck. Per questo, abbiamo dovuto copiare il traffico con le metriche su entrambi i server e persino scrivere per questo <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/Albibek\/udpdup\">una piccola utilit\u00e0<\/a><\/noindex>. Abbiamo risolto il problema della tolleranza ai guasti, ma... non molto bene. All'inizio sembrava andare tutto alla grande: ogni brubeck raccoglie la propria variante di aggregazione, scrivendo dati in Graphite ogni 30 secondi, sovrascrivendo l'intervallo precedente (questo avviene sul lato di Graphite). Se un server dovesse guastarsi, abbiamo sempre un secondo con una copia dei dati aggregati. Ma ecco il problema: se un server si guasta, sui grafici compare una \u00absega\u00bb. Questo \u00e8 dovuto al fatto che gli intervalli di 30 secondi dei brubeck non sono sincronizzati e, nel momento in cui uno di essi si guasta, non viene sovrascritto. Quando il secondo server viene attivato, succede la stessa cosa. \u00c8 tollerabile, ma si pu\u00f2 fare di meglio! Anche il problema della scalabilit\u00e0 non \u00e8 scomparso. Tutte le metriche continuano a \u00abvolare\u00bb su un singolo server e perci\u00f2 siamo limitati agli stessi 2-4 milioni MPS a seconda delle prestazioni della rete.<\/p>\n<p><\/p>\n<p>Se ci si ferma un attimo a riflettere sul problema e si scava un po' nella neve, pu\u00f2 venirci in mente un'idea piuttosto ovvia: abbiamo bisogno di un statsd in grado di operare in modalit\u00e0 distribuita. In altre parole, uno che implementi la sincronizzazione tra le nodi in base al tempo e alle metriche. \"Certo, una soluzione del genere deve gi\u00e0 esistere\", abbiamo detto e ci siamo messi a cercare su Google... ma non abbiamo trovato nulla. Esaminando la documentazione di vari statsd (<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/etsy\/statsd\/wiki#server-implementations\">https:\/\/github.com\/etsy\/statsd\/wiki#server-implementations<\/a><\/noindex> a partire dal 11.12.2017), non abbiamo trovato davvero niente. Evidentemente, n\u00e9 gli sviluppatori n\u00e9 gli utenti di queste soluzioni si sono ancora imbattuti in UNA COS\u00cc GRANDE quantit\u00e0 di metriche, altrimenti avrebbero sicuramente trovato qualche soluzione.<\/p>\n<p><\/p>\n<p>Ed \u00e8 qui che ci siamo ricordati del statsd \"giocattolo\" - bioyino, che abbiamo creato durante un hackathon solo per divertirci (il nome del progetto \u00e8 stato generato da uno script prima dell'inizio dell'hackathon) e abbiamo capito che avevamo urgentemente bisogno di un nostro statsd. Perch\u00e9?<\/p>\n<p><\/p>\n<ul>\n<li>perch\u00e9 nel mondo ci sono troppo pochi cloni di statsd,<\/li>\n<li>perch\u00e9 possiamo garantire la resilienza e la scalabilit\u00e0 desiderate o almeno vicine (inclusa la sincronizzazione delle metriche aggregate tra i server e risolvere il problema dei conflitti durante l'invio),<\/li>\n<li>perch\u00e9 \u00e8 possibile monitorare le metriche con maggiore precisione rispetto a brubeck,<\/li>\n<li>perch\u00e9 possiamo raccogliere statistiche pi\u00f9 dettagliate che brubeck praticamente non ci ha fornito,<\/li>\n<li>perch\u00e9 abbiamo avuto l'opportunit\u00e0 di programmare la nostra applicazione hyper-performance distribuita, che non r\u00e9plica completamente l'architettura di un'altra simile. <\/li>\n<\/ul>\n<p><\/p>\n<p>Con cosa scrivere? Naturalmente, con Rust. Perch\u00e9?<\/p>\n<p><\/p>\n<ul>\n<li>perch\u00e9 esisteva gi\u00e0 un prototipo della soluzione,<\/li>\n<li>perch\u00e9 l'autore dell'articolo a quel tempo conosceva gi\u00e0 Rust e voleva scrivere qualcosa per la produzione da rendere open-source,<\/li>\n<li>perch\u00e9 i linguaggi con GC non sono adatti alla natura del traffico che gestiamo (praticamente in tempo reale) e le pause del GC sono praticamente inaccettabili, <\/li>\n<li>perch\u00e9 necessitiamo della massima prestazione, paragonabile a C<\/li>\n<li>perch\u00e9 Rust ci offre una concorrenza senza paura, e iniziando a scrivere in C\/C++, avremmo accumulato ancor pi\u00f9 vulnerabilit\u00e0, overflow di buffer, condizioni di race e altre brutte parole rispetto a brubeck.<\/li>\n<\/ul>\n<p><\/p>\n<p>C'era anche un argomento contro Rust. L'azienda non aveva esperienza nella creazione di progetti in Rust, e attualmente non prevediamo di utilizzarlo nel progetto principale. Pertanto, c'erano serie preoccupazioni che nulla potesse funzionare, ma abbiamo deciso di rischiare e abbiamo provato.<\/p>\n<p><\/p>\n<p>Passava il tempo\u2026<\/p>\n<p><\/p>\n<p>Finalmente, dopo diversi tentativi falliti, la prima versione funzionante era pronta. Che cosa abbiamo ottenuto? \u00c8 venuto fuori qualcosa di simile a questo.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bioyino \u2014 un aggregatore di metriche distribuito e scalabile\" src=\"\/wp-content\/uploads\/2019\/11\/322c4136ed033b80b31a89d7b5f63af8.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ogni nodo riceve il proprio insieme di metriche e le accumula, senza aggregare le metriche per quei tipi che richiederebbero il loro insieme completo per l'aggregazione finale. I nodi sono connessi tra loro attraverso un protocollo di blocco distribuito, che consente di selezionare l'unico nodo (qui piangevamo) che \u00e8 degno di inviare le metriche al Grande. Attualmente, questo problema viene affrontato con <noindex><a rel=\"nofollow\" href=\"https:\/\/www.consul.io\/docs\/guides\/leader-election.html\">Consul<\/a><\/noindex>, ma in futuro le ambizioni dell'autore si estendono a <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/Albibek\/raft-consensus\">propria<\/a><\/noindex> <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/Albibek\/raft-tokio\">implementazioni<\/a><\/noindex> Raft, dove il nodo principale \u00e8 certamente il nodo leader del consenso. Oltre al consenso, i nodi inviano abbastanza frequentemente (di default una volta al secondo) ai loro vicini le parti pre-aggregate delle metriche che sono riusciti a raccogliere in quel secondo. In questo modo, la scalabilit\u00e0 e la tolleranza ai guasti sono garantite: ogni nodo mantiene ancora un set completo di metriche, ma le metriche vengono inviate gi\u00e0 aggregate, tramite TCP e codificate in un protocollo binario, riducendo cos\u00ec i costi di duplicazione rispetto all'UDP. Nonostante l'elevato numero di metriche in entrata, l'accumulo richiede davvero poca memoria e ancora meno CPU. Per le nostre metriche ben comprimibili, si tratta solo di poche decine di megabyte di dati. Un ulteriore vantaggio \u00e8 l'assenza di inutili sovrascritture di dati in Graphite, come accadeva nel caso di burbeck.<\/p>\n<p><\/p>\n<p>I pacchetti UDP con metriche sono distribuiti tra i nodi sull'hardware di rete tramite un semplice Round Robin. Naturalmente, l'hardware di rete non analizza il contenuto dei pacchetti e quindi pu\u00f2 gestire molto pi\u00f9 di 4 milioni di pacchetti al secondo, per non parlare delle metriche di cui non sa nulla. Considerando che le metriche non arrivano una alla volta in ogni pacchetto, non prevediamo problemi di prestazioni in questo contesto. In caso di caduta del server, il dispositivo di rete rilever\u00e0 rapidamente (nell'arco di 1-2 secondi) questo fatto e rimuover\u00e0 il server non funzionante dalla rotazione. Di conseguenza, i nodi passivi (ovvero non leader) possono essere accesi e spenti praticamente senza provocare cali nei grafici. Il massimo che perdiamo \u00e8 una parte delle metriche arrivate nell'ultimo secondo. Una perdita\/improvviso spegnimento\/cambiamento del leader disegner\u00e0 comunque un'anomalia minima (l'intervallo di 30 secondi sar\u00e0 ancora disallineato), ma mantenendo una connessione tra i nodi, \u00e8 possibile ridurre al minimo anche questi problemi, ad esempio, inviando pacchetti di sincronizzazione.<\/p>\n<p><\/p>\n<p>Un po' sul funzionamento interno. L'applicazione \u00e8 ovviamente multithread, ma l'architettura dei thread \u00e8 diversa da quella utilizzata in brubeck. I thread in brubeck sono uniformi: ognuno di essi \u00e8 responsabile sia della raccolta delle informazioni che dell'aggregazione. In bioyino, i thread di lavoro (workers) sono divisi in due gruppi: quelli responsabili della rete e quelli responsabili dell'aggregazione. Questa divisione consente di gestire l'applicazione in modo pi\u00f9 flessibile in base al tipo di metriche: dove \u00e8 necessaria un'aggregazione intensa, \u00e8 possibile aumentare il numero di aggregatori, mentre dove c'\u00e8 molto traffico di rete, si pu\u00f2 aumentare il numero di thread di rete. Al momento, sui nostri server stiamo operando con 8 thread di rete e 4 thread di aggregazione.<\/p>\n<p><\/p>\n<p>La parte di conteggio (responsabile dell'aggregazione) \u00e8 piuttosto noiosa. I buffer riempiti con i thread di rete vengono distribuiti tra i thread di conteggio, dove vengono quindi analizzati e aggregati. Su richiesta, le metriche vengono restituite per l'invio ad altre nodi. Tutto questo, inclusa la trasmissione dei dati tra nodi e il lavoro con Consul, avviene in modo asincrono, funziona su un framework <noindex><a rel=\"nofollow\" href=\"https:\/\/tokio.rs\">tokio<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>La parte della rete responsabile della raccolta dei metodi ha presentato molte pi\u00f9 difficolt\u00e0 durante lo sviluppo. L'obiettivo principale di isolare i flussi di rete in entit\u00e0 distinte era quello di ridurre il tempo impiegato dai flussi <em>non<\/em> nella lettura dei dati dal socket. Le opzioni che prevedevano l'uso di UDP asincrono e il normale recvmsg sono state rapidamente scartate: il primo consuma troppa CPU in user-space per la gestione degli eventi, il secondo richiede troppe commutazioni di contesto. Pertanto, attualmente si utilizza <noindex><a rel=\"nofollow\" href=\"https:\/\/linux.die.net\/man\/2\/recvmmsg\">recvmmsg<\/a><\/noindex> con buffer grandi (e i buffer, signori ufficiali, non sono qualcosa da prendere alla leggera!). Il supporto per UDP standard \u00e8 stato mantenuto per casi non critici, dove non \u00e8 necessaria la recvmmsg. In modalit\u00e0 multimessage si riesce a raggiungere l\u2019obiettivo principale: la maggior parte del tempo il flusso di rete gestisce la coda del sistema operativo \u2014 legge i dati dal socket e li trasferisce nel buffer user-space, passando solo occasionalmente per restituire il buffer pieno agli aggregatori. La coda nel socket praticamente non si accumula e il numero di pacchetti scartati cresce di poco. <\/p>\n<p>\n<b class=\"spoiler_title\">Nota<\/b><\/p>\n<p>Nelle impostazioni predefinite, la dimensione del buffer \u00e8 impostata piuttosto grande. Se decidi di provare il server da solo, potresti riscontrare che, dopo l'invio di un piccolo numero di metriche, esse non arrivano a Graphite, rimanendo nel buffer del flusso di rete. Per lavorare con un numero ridotto di metriche, \u00e8 necessario impostare nel file di configurazione valori pi\u00f9 piccoli per bufsize e task-queue-size.<\/p>\n<p><\/p>\n<p>Infine, ecco alcuni grafici per gli amanti dei grafici.<\/p>\n<p><\/p>\n<p>Statistiche sul numero di metriche in ingresso per ogni server: oltre 2 milioni di MPS.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bioyino \u2014 un aggregatore di metriche distribuito e scalabile\" src=\"\/wp-content\/uploads\/2019\/11\/c6cb1a36c267657d55ec22df518f8d03.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Disattivazione di uno dei nodi e ridistribuzione delle metriche in ingresso.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bioyino \u2014 un aggregatore di metriche distribuito e scalabile\" src=\"\/wp-content\/uploads\/2019\/11\/106af265a6bc2a8b31fe34df69e9c200.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Statistiche sulle metriche in uscita: solo un nodo invia sempre \u2014 il raidboss.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bioyino \u2014 un aggregatore di metriche distribuito e scalabile\" src=\"\/wp-content\/uploads\/2019\/11\/582730b501a42bb3a371a84bf2e2394b.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Statistiche sul funzionamento di ciascun nodo tenendo conto degli errori in vari moduli del sistema.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bioyino \u2014 un aggregatore di metriche distribuito e scalabile\" src=\"\/wp-content\/uploads\/2019\/11\/101377281c3add8c598c6439ca25d271.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Dettagli delle metriche in ingresso (i nomi delle metriche sono nascosti).<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bioyino \u2014 un aggregatore di metriche distribuito e scalabile\" src=\"\/wp-content\/uploads\/2019\/11\/6cf0b61b454b0414799460c482e03242.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Cosa abbiamo in programma di fare con tutto questo? Certo, scrivere codice, e basta! Il progetto \u00e8 stato concepito come open-source e rimarr\u00e0 tale per tutta la sua vita. I piani imminenti includono il passaggio a una versione proprietaria di Raft, la sostituzione del protocollo peer con uno pi\u00f9 portabile, l'aggiunta di ulteriori statistiche interne, nuovi tipi di metriche, la correzione di errori e altri miglioramenti. <\/p>\n<p><\/p>\n<p>Naturalmente, sono tutti benvenuti a contribuire allo sviluppo del progetto: create PR, Issues e, se possibile, risponderemo, perfezioneremo, ecc.<\/p>\n<p><\/p>\n<p>Con questo, come si suol dire, that's all folks, acquistate i nostri elefanti!<\/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=\"Riproduci 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 \/>Fonte: <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\/it\/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=\"it_IT\" \/>\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\/it\/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 aggregatore di metriche distribuito e scalabile | ProHoster","description":"Quindi, stai raccogliendo metriche. Proprio come noi. Anche noi raccogliamo metriche. Naturalmente, quelle necessarie per il business.","canonical_url":"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/bioyino-raspredelyonnyj-masshtabiruemyj-agregator-metrik","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"it_IT","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\/it\/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\/it\/wp-json\/wp\/v2\/posts\/52113","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/comments?post=52113"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts\/52113\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/media?parent=52113"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/categories?post=52113"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/tags?post=52113"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}