{"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 aggregatore di metriche distribuito e scalabile","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Quindi, stai raccogliendo metriche. Proprio come noi. Anche noi raccogliamo metriche. Certamente quelle necessarie 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>, perch\u00e9 lo abbiamo scritto e perch\u00e9 abbiamo rinunciato a brubeck. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bioyino \u2014 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 tag tramite <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/github\/brubeck\">brubeck<\/a><\/noindex>. \u00c8 scritto in C. Dal punto di vista del codice, \u00e8 semplice come un tappo (questo \u00e8 importante quando vuoi contribuire) e, soprattutto, gestisce senza particolari problemi i nostri volumi di 2 milioni di metriche al secondo (MPS) al picco. La documentazione afferma il supporto per 4 milioni di MPS con asterisco. Ci\u00f2 significa che il numero dichiarato lo otterrai se configuri correttamente la rete su Linux. (Quante MPS \u00e8 possibile ottenere lasciando la rete cos\u00ec com'\u00e8, non lo sappiamo). Nonostante questi vantaggi, avevamo diverse serie lamentele su brubeck.<\/p>\n<p><\/p>\n<p><em>Lamentela 1.<\/em> Github - il sviluppatore del progetto - ha smesso di supportarlo: pubblicare patch e fix, accettare i nostri e (non solo i nostri) PR. Negli ultimi mesi (da febbraio-marzo 2018 circa) l'attivit\u00e0 \u00e8 ripresa, ma prima 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 potrebbe rappresentare un serio ostacolo per l'implementazione di nuove funzionalit\u00e0.<\/p>\n<p><\/p>\n<p><em>Lamentela 2.<\/em> Precisione dei calcoli. Brubeck raccoglie per l'aggregazione solo 65536 valori. Nel nostro caso, per alcune metriche durante il periodo di aggregazione (30 secondi) possono arrivare molti pi\u00f9 valori (1.527.392 al picco). Di conseguenza, i valori dei massimi e minimi sembrano inutili. Ad esempio, ecco come dovrebbe essere: <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bioyino \u2014 aggregatore di metriche distribuito e scalabile\" src=\"\/wp-content\/uploads\/2019\/11\/4222a1a7d1e127137220595241f5276c.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<em>Come riportato<\/em><\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bioyino \u2014 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, i totali vengono calcolati in modo errato. Aggiungi qui il bug del sovraccarico del float a 32 bit, che manda il server in segfault quando riceve una metrica apparentemente innocua, e diventa davvero ottimo. Il bug, tra l'altro, non \u00e8 stato ancora risolto.<\/p>\n<p><\/p>\n<p>E, infine, <em>Lamentela X<\/em>. Al momento della stesura dell'articolo siamo pronti a presentare a tutti le 14 implementazioni di statsd funzionanti che siamo riusciti a trovare. Immaginiamo che una certa infrastruttura sia cresciuta cos\u00ec tanto che accettare 4 milioni di MPS non \u00e8 pi\u00f9 sufficiente. Oppure che non sia ancora cresciuta, ma che le metriche siano gi\u00e0 cos\u00ec importanti che anche brevi interruzioni di 2-3 minuti nei grafici possano diventare critiche e causare attacchi di profonda depressione nei 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, per evitare che un problema improvviso sul server scateni un'apocalisse zombie psichiatrica in ufficio. In secondo luogo, la scalabilit\u00e0, per avere la possibilit\u00e0 di accettare pi\u00f9 di 4 milioni di MPS, senza dover scavare a fondo nel stack di rete di Linux e poter crescere 'in larghezza' fino alle dimensioni necessarie.<\/p>\n<p><\/p>\n<p>Poich\u00e9 avevamo margine in termini di scalabilit\u00e0, abbiamo deciso di partire dalla tolleranza ai guasti. 'Oh! Tolleranza ai guasti! \u00c8 semplice, lo sappiamo fare', abbiamo pensato e abbiamo avviato 2 server, installando su ciascuno una copia di brubeck. Per fare questo, ci \u00e8 stato necessario 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\">un piccolo utilitario<\/a><\/noindex>. Abbiamo risolto il problema della tolleranza ai guasti, ma... non molto bene. All'inizio sembrava che andasse tutto bene: ogni brubeck raccoglie la propria versione dell'aggregazione, scrive i dati in Graphite ogni 30 secondi, sovrascrivendo l'intervallo precedente (questo avviene lato Graphite). Se un server fallisce, abbiamo sempre il secondo con la propria copia dei dati aggregati. Ma c'\u00e8 un problema: se il server fallisce, nei grafici appare una 'sega'. Questo \u00e8 dovuto al fatto che gli intervalli di 30 secondi di brubeck non sono sincronizzati, e nel momento in cui uno di essi va gi\u00f9, non viene sovrascritto. Quando si avvia il secondo server, succede la stessa cosa. \u00c8 abbastanza tollerabile, ma si desidera qualcosa di meglio! Anche il problema della scalabilit\u00e0 non \u00e8 scomparso. Tutte le metriche continuano a 'volare' su un singolo server, e quindi siamo limitati agli stessi 2-4 milioni di MPS a seconda della potenza della rete.<\/p>\n<p><\/p>\n<p>Se si riflette un po' sul problema e si inizia a scavare nella neve, pu\u00f2 venire in mente un'idea piuttosto ovvia: \u00e8 necessario uno statsd in grado di funzionare in modalit\u00e0 distribuita. Ovvero, 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 pensato, e abbiamo iniziato a cercare su Google... ma non abbiamo trovato nulla. Analizzando 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> al 11.12.2017), non abbiamo trovato assolutamente nulla. Evidentemente, n\u00e9 gli sviluppatori n\u00e9 gli utenti di queste soluzioni si sono ancora trovati con un numero COS\u00cc elevato di metriche, altrimenti avrebbero sicuramente inventato qualche cosa.<\/p>\n<p><\/p>\n<p>E qui ci siamo ricordati dello statsd \"giocattolo\" - bioyino, che avevamo scritto durante un hackathon solo per divertimento (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 l'affidabilit\u00e0 e la scalabilit\u00e0 desiderate (inclusa la sincronizzazione delle metriche aggregate tra i server e la risoluzione dei conflitti durante l'invio),<\/li>\n<li>perch\u00e9 possiamo calcolare le metriche con maggiore precisione rispetto a quanto fa brubeck,<\/li>\n<li>perch\u00e9 possiamo raccogliere statistiche pi\u00f9 dettagliate, che brubeck praticamente non ci forniva,<\/li>\n<li>perch\u00e9 abbiamo avuto l'opportunit\u00e0 di programmare la nostra application distribuita ad alte prestazioni, che non ripeter\u00e0 completamente l'architettura di un'altra similare. <\/li>\n<\/ul>\n<p><\/p>\n<p>Su cosa scrivere? Naturalmente, su 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 all'epoca sapeva gi\u00e0 Rust ed era desideroso di scrivere qualcosa di utile in produzione con l'intenzione di rilasciarlo come open-source,<\/li>\n<li>perch\u00e9 i linguaggi con GC non ci sono adatti a causa della natura del traffico ricevuto (praticamente in tempo reale) e le pause dovute al GC sono praticamente inaccettabili, <\/li>\n<li>perch\u00e9 \u00e8 necessaria la massima performance, paragonabile a C,<\/li>\n<li>perch\u00e9 Rust ci offre la concurrency senza paura, e iniziando a scrivere in C\/C++, avremmo accumulato ancora pi\u00f9 vulnerabilit\u00e0, overflow di buffer, condizioni di race e altre parole spaventose rispetto a brubeck.<\/li>\n<\/ul>\n<p><\/p>\n<p>C'era anche un'argomentazione contro Rust. L'azienda non aveva esperienza nella creazione di progetti in Rust e al momento non prevediamo nemmeno di utilizzarlo nel nostro progetto principale. Pertanto, c'erano serie preoccupazioni che nulla sarebbe andato a buon fine, ma abbiamo deciso di rischiare e provare.<\/p>\n<p><\/p>\n<p>Il tempo passava\u2026<\/p>\n<p><\/p>\n<p>Finalmente, dopo diversi tentativi falliti, la prima versione funzionante era pronta. Cosa ne \u00e8 venuto fuori? \u00c8 venuto fuori questo.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bioyino \u2014 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 set di metriche e le accumula, senza aggregare le metriche per quei tipi in cui per l'aggregazione finale \u00e8 necessario avere il set completo. I nodi sono collegati tra loro tramite un protocollo di lock distribuito, che consente di scegliere tra di essi quello unico (qui abbiamo pianto) che \u00e8 degno di inviare 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\">un proprio<\/a><\/noindex> <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/Albibek\/raft-tokio\">realizzazione<\/a><\/noindex> Raft, dove quello degno sar\u00e0, ovviamente, il nodo-leader del consenso. Oltre al consenso, i nodi inviano abbastanza frequentemente (di default una volta al secondo) ai propri vicini le parti delle metriche preaggregati che sono riusciti a raccogliere in quel secondo. Quindi, la scalabilit\u00e0 e la tolleranza ai guasti sono mantenute: ciascuno dei nodi conserva ancora un set completo di metriche, ma le metriche vengono inviate gi\u00e0 aggregate, tramite TCP e con codifica in un protocollo binario, riducendo cos\u00ec notevolmente i costi di duplicazione rispetto a UDP. Nonostante l'ampia quantit\u00e0 di metriche in ingresso, l'accumulo richiede davvero poca memoria e ancor meno CPU. Per le nostre metriche ben comprimibili, si tratta di appena alcune decine di megabyte di dati. Come ulteriore vantaggio, abbiamo l'assenza di registrazioni ridondanti nei dati in Graphite, come avveniva nel caso di burbeck.<\/p>\n<p><\/p>\n<p>I pacchetti UDP con metriche sono bilanciati tra i nodi sull'hardware di rete attraverso un semplice Round Robin. Naturalmente, l'hardware di rete non analizza il contenuto dei pacchetti e quindi pu\u00f2 gestire molti pi\u00f9 di 4M pacchetti al secondo, senza contare le metriche di cui non sa nulla. Considerando che le metriche arrivano in numero maggiore a una per pacchetto, non prevediamo problemi di prestazioni in questo ambito. In caso di caduta del server, il dispositivo di rete rileva rapidamente (entro 1-2 secondi) questo fatto e rimuove il server non funzionante dal ciclo. Di conseguenza, i nodi passivi (cio\u00e8 non leader) possono essere accesi e spenti praticamente senza notare cali sui grafici. Il massimo che perdiamo \u00e8 una parte delle metriche arrivate nell'ultimo secondo. Una perdita\/interruzione\/cambio improvviso del leader porter\u00e0 comunque a un'anomalia lieve (l'intervallo di 30 secondi \u00e8 ancora desincronizzato), ma con la 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' sull'architettura interna. L'applicazione \u00e8 ovviamente multithread, ma l'architettura dei thread \u00e8 diversa da quella utilizzata in brubeck. I thread in brubeck sono uniformi: ciascuno 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 una gestione pi\u00f9 flessibile dell'applicazione a seconda del tipo di metriche: dove \u00e8 necessaria un'aggregazione intensiva, si possono aggiungere aggregatori, mentre dove c'\u00e8 molto traffico di rete, si pu\u00f2 aumentare il numero di thread di rete. Attualmente, sui nostri server stiamo operando con 8 thread di rete e 4 thread di aggregazione.<\/p>\n<p><\/p>\n<p>La parte calcolante (responsabile dell'aggregazione) \u00e8 piuttosto noiosa. I buffer riempiti dai thread di rete vengono distribuiti tra i thread di calcolo, dove vengono successivamente analizzati e aggregati. Su richiesta, le metriche vengono restituite per l'invio ad altri nodi. Tutto questo, compresa la trasmissione dei dati tra i nodi e il lavoro con Consul, avviene in modo asincrono, funziona sul framework <noindex><a rel=\"nofollow\" href=\"https:\/\/tokio.rs\">tokio<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>La parte di rete responsabile della ricezione delle metriche ha causato molte pi\u00f9 problematiche durante lo sviluppo. L'obiettivo principale della separazione dei flussi di rete in entit\u00e0 distinte era cercare di ridurre il tempo impiegato dal flusso <em>non<\/em> per leggere i dati dal socket. Le opzioni con UDP asincrono e il normale recvmsg sono state rapidamente scartate: il primo utilizza troppa CPU in user-space per la gestione degli eventi, il secondo - troppe interruzioni di contesto. Pertanto, attualmente viene utilizzato <noindex><a rel=\"nofollow\" href=\"https:\/\/linux.die.net\/man\/2\/recvmmsg\">recvmmsg<\/a><\/noindex> con buffer di grandi dimensioni (e i buffer, signori ufficiali, non sono una cosa da poco!). Il supporto per il normale UDP \u00e8 stato mantenuto per i casi non gravosi, dove non \u00e8 necessaria l'uso di recvmmsg. In modalit\u00e0 multimessage, si riesce a raggiungere l'obiettivo principale: la maggior parte del tempo il flusso di rete gestisce la coda del sistema operativo - legge i dati dal socket e li copia nel buffer user-space, solo raramente interrompendosi per restituire il buffer pieno agli aggregatori. La coda nel socket praticamente non si accumula e il numero di pacchetti scartati non cresce. <\/p>\n<p>\n<b class=\"spoiler_title\">Nota<\/b><\/p>\n<p>Nelle impostazioni predefinite, la dimensione del buffer \u00e8 impostata su un valore piuttosto grande. Se decidete di provare il server da soli, potreste scoprire che dopo l'invio di un piccolo numero di metriche, queste non arrivano in Graphite, rimanendo nel buffer del flusso di rete. Per gestire un piccolo numero di metriche, \u00e8 necessario impostare nel conf bufsize e task-queue-size valori pi\u00f9 piccoli.<\/p>\n<p><\/p>\n<p>Infine, qualche grafico per gli amanti dei grafici.<\/p>\n<p><\/p>\n<p>Statistiche sul numero di metriche in entrata per ogni server: oltre 2 milioni di MPS.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bioyino \u2014 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 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 - il raidboss.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bioyino \u2014 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 ogni nodo tenendo conto degli errori nei vari moduli del sistema.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bioyino \u2014 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>Dettaglio delle metriche in ingresso (i nomi delle metriche sono nascosti).<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bioyino \u2014 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 prevediamo di fare con tutto questo in futuro? Certamente scriveremo codice, bla\u2026! Il progetto \u00e8 stato inizialmente concepito come open-source e rimarr\u00e0 tale per tutta la sua durata. Nei prossimi piani c'\u00e8 il passaggio a una versione autonoma di Raft, la sostituzione del protocollo peer con uno pi\u00f9 portatile, l'aggiunta di statistiche interne, nuovi tipi di metriche, correzione di errori e altri miglioramenti. <\/p>\n<p><\/p>\n<p>Naturalmente, sono benvenuti tutti coloro che desiderano contribuire allo sviluppo del progetto: create PR, Issue, e risponderemo e apporteremo modifiche quando possibile, ecc.<\/p>\n<p><\/p>\n<p>A questo punto, come si suol dire, that's all folks, comprate 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=\"Guarda il 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.1.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u0418\u0442\u0430\u043a, \u0432\u044b \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442\u0435 \u043c\u0435\u0442\u0440\u0438\u043a\u0438. \u041a\u0430\u043a \u0438 \u043c\u044b. \u041c\u044b \u0442\u043e\u0436\u0435 \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u043c \u043c\u0435\u0442\u0440\u0438\u043a\u0438. \u041a\u043e\u043d\u0435\u0447\u043d\u043e \u0436\u0435, \u043d\u0443\u0436\u043d\u044b\u0435 \u0434\u043b\u044f \u0431\u0438\u0437\u043d\u0435\u0441\u0430.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/bioyino-raspredelyonnyj-masshtabiruemyj-agregator-metrik\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"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, state raccogliendo metriche. 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}]}}