{"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\/fr\/blog\/administrirovanie\/bioyino-raspredelyonnyj-masshtabiruemyj-agregator-metrik","title":{"rendered":"Bioyino \u2014 agr\u00e9gateur de m\u00e9triques distribu\u00e9 et \u00e9volutif","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Alors, vous collectez des m\u00e9triques. Tout comme nous. Nous collectons \u00e9galement des m\u00e9triques. Bien s\u00fbr, celles n\u00e9cessaires pour les affaires. Aujourd'hui, nous allons parler du tout premier maillon de notre syst\u00e8me de surveillance \u2014 un serveur d'agr\u00e9gation compatible avec statsd. <noindex><a rel=\"nofollow\" href=\"http:\/\/bit.ly\/2Noxg1M\">bioyino<\/a><\/noindex>, pourquoi nous l'avons \u00e9crit et pourquoi nous avons abandonn\u00e9 brubeck. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bioyino \u2014 agr\u00e9gateur de m\u00e9triques distribu\u00e9 et \u00e9volutif\" 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>Dans nos articles pr\u00e9c\u00e9dents (<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>) vous pouvez apprendre que jusqu'\u00e0 un certain moment, nous avons collect\u00e9 des tags \u00e0 l'aide de <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/github\/brubeck\">brubeck<\/a><\/noindex>. Il est \u00e9crit en C. En termes de code, il est aussi simple qu'un bouchon (ce qui est important lorsque vous souhaitez contribuer) et, surtout, il g\u00e8re sans probl\u00e8me nos volumes de 2 millions de m\u00e9triques par seconde (MPS) en pointe. La documentation annonce un support de 4 millions de MPS avec ast\u00e9risque. Cela signifie que vous obtiendrez le chiffre annonc\u00e9 si vous configurez correctement le r\u00e9seau sous Linux. (Nous ne savons pas combien de MPS il est possible d'obtenir si le r\u00e9seau reste tel quel). Malgr\u00e9 ces avantages, nous avions quelques griefs s\u00e9rieux contre brubeck.<\/p>\n<p><\/p>\n<p><em>Grief 1.<\/em> Github \u2014 le d\u00e9veloppeur du projet \u2014 a cess\u00e9 de le soutenir : publier des patchs et des corrections, accepter nos PR (et d'autres \u00e9galement). Au cours des derniers mois (depuis environ f\u00e9vrier-mars 2018), l'activit\u00e9 a repris, mais avant cela, il y avait presque 2 ans de silence complet. De plus, le projet est d\u00e9velopp\u00e9 <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/github\/brubeck\/pull\/31#issuecomment-325907734\">pour les besoins internes de Github<\/a><\/noindex>, ce qui peut constituer un obstacle s\u00e9rieux \u00e0 l'impl\u00e9mentation de nouvelles fonctionnalit\u00e9s.<\/p>\n<p><\/p>\n<p><em>Grief 2.<\/em> Pr\u00e9cision des calculs. Brubeck ne collecte que 65536 valeurs pour l'agr\u00e9gation. Dans notre cas, pour certaines m\u00e9triques pendant la p\u00e9riode d'agr\u00e9gation (30 secondes), il peut y avoir beaucoup plus de valeurs (1 527 392 en pointe). En cons\u00e9quence de cet \u00e9chantillonnage, les valeurs des maximums et minimums semblent inutiles. Par exemple, ainsi : <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bioyino \u2014 agr\u00e9gateur de m\u00e9triques distribu\u00e9 et \u00e9volutif\" src=\"\/wp-content\/uploads\/2019\/11\/4222a1a7d1e127137220595241f5276c.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<em>Comment c'\u00e9tait<\/em><\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bioyino \u2014 agr\u00e9gateur de m\u00e9triques distribu\u00e9 et \u00e9volutif\" src=\"\/wp-content\/uploads\/2019\/11\/c8f0025c61f708584328ea30aacf7bc0.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<em>Comment cela aurait d\u00fb \u00eatre<\/em><\/p>\n<p><\/p>\n<p>Pour la m\u00eame raison, les sommes sont compl\u00e8tement incorrectes. Ajoutez \u00e0 cela un bug de d\u00e9bordement des flottants 32 bits, qui envoie le serveur dans un segfault lorsqu'il re\u00e7oit une m\u00e9trique apparemment innocente, et c'est encore mieux. Au fait, ce bug n'a toujours pas \u00e9t\u00e9 corrig\u00e9.<\/p>\n<p><\/p>\n<p>Et enfin, <em>Grief X<\/em>. Au moment de la r\u00e9daction de cet article, nous sommes pr\u00eats \u00e0 le soumettre \u00e0 toutes les 14 impl\u00e9mentations de statsd plus ou moins fonctionnelles que nous avons pu trouver. Imaginons qu'une infrastructure donn\u00e9e ait grandi au point o\u00f9 accepter 4 millions de MPS ne suffit plus. Ou peut-\u00eatre n'a-t-elle pas encore grandi, mais les m\u00e9triques sont d\u00e9j\u00e0 si importantes pour vous que m\u00eame de courtes interruptions de 2 \u00e0 3 minutes sur les graphiques peuvent devenir critiques et plonger les managers dans une d\u00e9pression insurmontable. Comme traiter la d\u00e9pression est une t\u00e2che ingrate, des solutions techniques sont n\u00e9cessaires.<\/p>\n<p><\/p>\n<p>Tout d'abord, la tol\u00e9rance aux pannes, afin qu'un probl\u00e8me soudain sur le serveur ne d\u00e9clenche pas l'apocalypse zombie psychiatrique au bureau. Deuxi\u00e8mement, l'\u00e9volutivit\u00e9, pour pouvoir accepter plus de 4 millions de MPS sans avoir \u00e0 plonger dans la pile r\u00e9seau Linux et cro\u00eetre ais\u00e9ment \"en largeur\" jusqu'aux dimensions n\u00e9cessaires.<\/p>\n<p><\/p>\n<p>Comme nous avions suffisamment de r\u00e9serve en mati\u00e8re d'\u00e9volutivit\u00e9, nous avons d\u00e9cid\u00e9 de commencer par la tol\u00e9rance aux pannes. \u00ab Oh ! Tol\u00e9rance aux pannes ! C'est simple, nous savons faire \u00e7a \u00bb, avons-nous pens\u00e9 et avons lanc\u00e9 2 serveurs, levant sur chacun une copie de brubeck. Pour cela, nous avons d\u00fb copier le trafic des m\u00e9triques sur les deux serveurs et m\u00eame \u00e9crire une <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/Albibek\/udpdup\">petite utilitaire<\/a><\/noindex>. Nous avons r\u00e9solu le probl\u00e8me de tol\u00e9rance aux pannes, mais... pas tr\u00e8s bien. Au d\u00e9but, tout semblait aller bien : chaque brubeck collecte sa propre variante d'agr\u00e9gation, \u00e9crit des donn\u00e9es dans Graphite toutes les 30 secondes, en \u00e9crasant l'intervalle pr\u00e9c\u00e9dent (cela se fait c\u00f4t\u00e9 Graphite). Si un serveur tombe en panne, nous avons toujours le deuxi\u00e8me avec sa propre copie des donn\u00e9es agr\u00e9g\u00e9es. Mais voil\u00e0 le probl\u00e8me : si un serveur tombe en panne, il y a une \"scie\" sur les graphiques. Cela est d\u00fb au fait que les intervalles de 30 secondes sur brubeck ne sont pas synchronis\u00e9s, et au moment de la panne, l'un d'eux n'est pas r\u00e9\u00e9crit. Lors du d\u00e9marrage du deuxi\u00e8me serveur, c'est la m\u00eame chose. C'est assez tol\u00e9rable, mais nous voulons mieux ! Le probl\u00e8me d'\u00e9volutivit\u00e9 n'a \u00e9galement pas disparu. Toutes les m\u00e9triques continuent de \"fuser\" vers un serveur unique, et nous sommes donc limit\u00e9s par ces m\u00eames 2 \u00e0 4 millions de MPS en fonction de l'optimisation du r\u00e9seau.<\/p>\n<p><\/p>\n<p>Si l'on r\u00e9fl\u00e9chit un peu au probl\u00e8me tout en pelletant la neige, une id\u00e9e \u00e9vidente peut venir \u00e0 l'esprit : un statsd capable de fonctionner en mode distribu\u00e9. C'est-\u00e0-dire, celui qui dispose d'une synchronisation entre les n\u0153uds en termes de temps et de m\u00e9triques. \u00ab Bien s\u00fbr, une telle solution existe s\u00fbrement d\u00e9j\u00e0 \u00bb, avons-nous dit en allant faire des recherches\u2026 Et nous n'avons rien trouv\u00e9. En parcourant la documentation de diff\u00e9rents statsd,<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/etsy\/statsd\/wiki#server-implementations\">https:\/\/github.com\/etsy\/statsd\/wiki#server-implementations<\/a><\/noindex> \u00e0 la date du 11.12.2017), nous n'avons trouv\u00e9 absolument rien. Il semble que ni les d\u00e9veloppeurs ni les utilisateurs de ces solutions ne se soient encore heurt\u00e9s \u00e0 UN TEL nombre de m\u00e9triques, sinon ils auraient s\u00fbrement trouv\u00e9 quelque chose.<\/p>\n<p><\/p>\n<p>Et l\u00e0, nous nous sommes rappel\u00e9s du statsd \u00ab jouet \u00bb - bioyino, que nous avions \u00e9crit lors du hackathon juste pour le plaisir (le nom du projet a \u00e9t\u00e9 g\u00e9n\u00e9r\u00e9 par un script avant le d\u00e9but du hackathon) et nous avons r\u00e9alis\u00e9 qu'il nous fallait d'urgence notre propre statsd. Pourquoi ?<\/p>\n<p><\/p>\n<ul>\n<li>Parce qu'il y a trop peu de clones de statsd dans le monde,<\/li>\n<li>Parce qu'il est possible d'assurer une r\u00e9silience et une \u00e9volutivit\u00e9 souhait\u00e9es ou proches du souhait\u00e9 (y compris synchroniser les m\u00e9triques agr\u00e9g\u00e9es entre les serveurs et r\u00e9soudre les probl\u00e8mes de conflits lors de l'envoi),<\/li>\n<li>Parce qu'il est possible de calculer les m\u00e9triques plus pr\u00e9cis\u00e9ment que ne le fait brubeck,<\/li>\n<li>Parce qu'il est possible de collecter nous-m\u00eames des statistiques plus d\u00e9taill\u00e9es, que brubeck ne nous fournissait pratiquement pas,<\/li>\n<li>Parce qu'une chance s'est pr\u00e9sent\u00e9e de programmer notre propre application de distribution haute performance, qui ne reproduira pas enti\u00e8rement l'architecture d'une autre application similaire. <\/li>\n<\/ul>\n<p><\/p>\n<p>Sur quoi programmer ? Bien s\u00fbr, en Rust. Pourquoi ?<\/p>\n<p><\/p>\n<ul>\n<li>Parce qu'il y avait d\u00e9j\u00e0 un prototype de solution,<\/li>\n<li>Parce que l'auteur de l'article savait d\u00e9j\u00e0 Rust \u00e0 ce moment-l\u00e0 et voulait \u00e9crire quelque chose en production avec la possibilit\u00e9 de le publier en open-source,<\/li>\n<li>Parce que les langages avec GC ne conviennent pas \u00e0 cause de la nature du trafic re\u00e7u (pratiquement en temps r\u00e9el) et les pauses de GC sont quasiment inacceptables, <\/li>\n<li>Parce qu'il faut maximum de performance, comparable \u00e0 C<\/li>\n<li>Parce que Rust nous offre une concurrence sans crainte, et en commen\u00e7ant \u00e0 \u00e9crire cela en C\/C++, nous aurions accumul\u00e9 encore plus de vuln\u00e9rabilit\u00e9s, de d\u00e9bordements de tampon, de conditions de course et d'autres mots effrayants.<\/li>\n<\/ul>\n<p><\/p>\n<p>Il y avait \u00e9galement des arguments contre Rust. L'entreprise n'avait pas d'exp\u00e9rience dans le d\u00e9veloppement de projets avec Rust, et nous ne pr\u00e9voyons pas de l'utiliser dans le projet principal. Par cons\u00e9quent, il y avait de s\u00e9rieuses inqui\u00e9tudes quant \u00e0 la r\u00e9ussite, mais nous avons d\u00e9cid\u00e9 de prendre le risque et d'essayer.<\/p>\n<p><\/p>\n<p>Le temps passait...<\/p>\n<p><\/p>\n<p>Enfin, apr\u00e8s plusieurs tentatives infructueuses, la premi\u00e8re version op\u00e9rationnelle \u00e9tait pr\u00eate. Quel en a \u00e9t\u00e9 le r\u00e9sultat ? Voici ce que nous avons obtenu.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bioyino \u2014 agr\u00e9gateur de m\u00e9triques distribu\u00e9 et \u00e9volutif\" src=\"\/wp-content\/uploads\/2019\/11\/322c4136ed033b80b31a89d7b5f63af8.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Chaque n\u0153ud re\u00e7oit son propre ensemble de m\u00e9triques et les accumule, sans agr\u00e9ger les m\u00e9triques pour les types qui n\u00e9cessiteraient un ensemble complet pour l'agr\u00e9gation finale. Les n\u0153uds sont interconnect\u00e9s par un protocole de verrouillage distribu\u00e9 (distributed lock) qui permet de choisir celui qui est le seul (c'est ici que nous avons pleur\u00e9) digne d'envoyer les m\u00e9triques au Grand. Actuellement, ce probl\u00e8me est r\u00e9solu par les moyens <noindex><a rel=\"nofollow\" href=\"https:\/\/www.consul.io\/docs\/guides\/leader-election.html\">Consul<\/a><\/noindex>, mais \u00e0 l'avenir, les ambitions de l'auteur s'\u00e9tendent \u00e0 <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/Albibek\/raft-consensus\">un<\/a><\/noindex> <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/Albibek\/raft-tokio\">implementation<\/a><\/noindex> Raft, o\u00f9 celui qui m\u00e9rite d'envoyer les m\u00e9triques sera, bien s\u00fbr, le n\u0153ud leader du consensus. En plus du consensus, les n\u0153uds envoient souvent (par d\u00e9faut une fois par seconde) \u00e0 leurs voisins les parties pr\u00e9-agr\u00e9g\u00e9es des m\u00e9triques qu'ils ont pu accumuler durant cette seconde. Ainsi, l'\u00e9volutivit\u00e9 et la tol\u00e9rance aux pannes sont conserv\u00e9es - chaque n\u0153ud garde toujours un ensemble complet de m\u00e9triques, mais les m\u00e9triques sont maintenant envoy\u00e9es sous forme agr\u00e9g\u00e9e, par TCP et avec un encodage dans un protocole binaire, ce qui r\u00e9duit consid\u00e9rablement les co\u00fbts de duplication par rapport \u00e0 UDP. Malgr\u00e9 le nombre relativement \u00e9lev\u00e9 de m\u00e9triques entrantes, l'accumulation n\u00e9cessite tr\u00e8s peu de m\u00e9moire et encore moins de CPU. Pour nos m\u00e9triques facilement compressibles, cela ne repr\u00e9sente que quelques dizaines de m\u00e9gaoctets de donn\u00e9es. Un bonus suppl\u00e9mentaire est l'absence de r\u00e9\u00e9critures inutiles de donn\u00e9es dans Graphite, comme cela a \u00e9t\u00e9 le cas avec burbeck.<\/p>\n<p><\/p>\n<p>Les paquets UDP avec des m\u00e9triques sont r\u00e9partis entre les n\u0153uds sur le mat\u00e9riel r\u00e9seau via un simple Round Robin. \u00c9videmment, le mat\u00e9riel r\u00e9seau ne d\u00e9chiffre pas le contenu des paquets et peut donc g\u00e9rer bien plus que 4 millions de paquets par seconde, sans parler des m\u00e9triques qu'il ne conna\u00eet pas du tout. \u00c9tant donn\u00e9 que les m\u00e9triques ne viennent pas une par une dans chaque paquet, nous ne pr\u00e9voyons pas de probl\u00e8mes de performance \u00e0 ce niveau. En cas de panne du serveur, l'appareil r\u00e9seau d\u00e9tecte rapidement (dans un d\u00e9lai de 1 \u00e0 2 secondes) ce fait et retire le serveur d\u00e9faillant de la rotation. En cons\u00e9quence, les n\u0153uds passifs (c'est-\u00e0-dire non leaders) peuvent \u00eatre activ\u00e9s et d\u00e9sactiv\u00e9s sans que des baisses soient visibles sur les graphiques. Au maximum, ce que nous perdons, c'est une partie des m\u00e9triques re\u00e7ues au cours de la derni\u00e8re seconde. Une perte\/suspension\/changement soudain du leader dessinera toujours une l\u00e9g\u00e8re anomalie (l'intervalle de 30 secondes reste d\u00e9synchronis\u00e9), mais avec une communication entre les n\u0153uds, ces probl\u00e8mes peuvent \u00eatre minimis\u00e9s, par exemple en envoyant des paquets de synchronisation.<\/p>\n<p><\/p>\n<p>Un peu sur la structure interne. L'application est bien s\u00fbr multithread, mais l'architecture des threads diff\u00e8re de celle utilis\u00e9e dans brubeck. Les threads dans brubeck sont identiques - chacun d'eux est responsable \u00e0 la fois de la collecte d'informations et de l'agr\u00e9gation. Dans bioyino, les threads de travail (workers) sont r\u00e9partis en deux groupes : ceux responsables du r\u00e9seau et ceux responsables de l'agr\u00e9gation. Cette s\u00e9paration permet de g\u00e9rer l'application de mani\u00e8re plus flexible selon le type de m\u00e9triques : l\u00e0 o\u00f9 une agr\u00e9gation intensive est n\u00e9cessaire, on peut ajouter des agr\u00e9gateurs, l\u00e0 o\u00f9 le trafic r\u00e9seau est \u00e9lev\u00e9 - augmenter le nombre de threads r\u00e9seau. Actuellement, sur nos serveurs, nous travaillons avec 8 threads r\u00e9seau et 4 threads d'agr\u00e9gation.<\/p>\n<p><\/p>\n<p>La partie calculatrice (responsable de l'agr\u00e9gation) est assez ennuyeuse. Les tampons remplis par les threads r\u00e9seau sont r\u00e9partis entre les threads de calcul, o\u00f9 ils sont ensuite analys\u00e9s et agr\u00e9g\u00e9s. Sur demande, les m\u00e9triques sont renvoy\u00e9es pour \u00eatre envoy\u00e9es \u00e0 d'autres n\u0153uds. Tout cela, y compris le transfert de donn\u00e9es entre les n\u0153uds et le travail avec Consul, est effectu\u00e9 de mani\u00e8re asynchrone, fonctionnant sur le framework <noindex><a rel=\"nofollow\" href=\"https:\/\/tokio.rs\">tokio<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>Le d\u00e9veloppement de la partie r\u00e9seau, responsable de la r\u00e9ception des m\u00e9triques, a pos\u00e9 beaucoup plus de probl\u00e8mes. L'objectif principal de s\u00e9parer les flux r\u00e9seau en entit\u00e9s distinctes \u00e9tait de r\u00e9duire le temps que prend le flux <em>ne<\/em> pour lire les donn\u00e9es \u00e0 partir d'un socket. Les options utilisant UDP asynchrone et la fonction recvmsg ont rapidement \u00e9t\u00e9 \u00e9cart\u00e9es : la premi\u00e8re consomme trop de CPU en espace utilisateur pour le traitement des \u00e9v\u00e9nements, la seconde entra\u00eene trop de changements de contexte. Par cons\u00e9quent, nous utilisons maintenant <noindex><a rel=\"nofollow\" href=\"https:\/\/linux.die.net\/man\/2\/recvmmsg\">recvmmsg<\/a><\/noindex> avec de grands tampons (et les tampons, mesdames et messieurs, ce n'est pas rien !). Le support de l'UDP standard est maintenu pour les cas peu charg\u00e9s, o\u00f9 recvmmsg n'est pas n\u00e9cessaire. En mode multimessage, nous parvenons \u00e0 atteindre l'essentiel : la majorit\u00e9 du temps, le flux r\u00e9seau g\u00e8re la file d'attente du syst\u00e8me d'exploitation \u2014 il lit les donn\u00e9es du socket et les transf\u00e8re dans le tampon utilisateur, ne passant que rarement sur le traitement des tampons remplis par les agr\u00e9gateurs. La file d'attente dans le socket ne s'accumule pratiquement pas, et le nombre de paquets abandonn\u00e9s n'augmente pratiquement pas. <\/p>\n<p>\n<b class=\"spoiler_title\">Remarque<\/b><\/p>\n<p>Dans les param\u00e8tres par d\u00e9faut, la taille du tampon est d\u00e9finie suffisamment grande. Si vous d\u00e9cidez d'essayer le serveur par vous-m\u00eame, vous pourriez rencontrer le probl\u00e8me selon lequel, apr\u00e8s l'envoi d'un petit nombre de m\u00e9triques, elles n'arrivent pas dans Graphite, restant dans le tampon du flux r\u00e9seau. Pour travailler avec un petit nombre de m\u00e9triques, il faut d\u00e9finir dans la configuration des valeurs plus petites pour bufsize et task-queue-size.<\/p>\n<p><\/p>\n<p>Enfin, un peu de graphiques pour les amateurs de graphiques.<\/p>\n<p><\/p>\n<p>Statistique du nombre de m\u00e9triques entrantes par serveur : plus de 2 millions MPS.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bioyino \u2014 agr\u00e9gateur de m\u00e9triques distribu\u00e9 et \u00e9volutif\" src=\"\/wp-content\/uploads\/2019\/11\/c6cb1a36c267657d55ec22df518f8d03.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>D\u00e9sactivation de l'un des n\u0153uds et redistribution des m\u00e9triques entrantes.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bioyino \u2014 agr\u00e9gateur de m\u00e9triques distribu\u00e9 et \u00e9volutif\" src=\"\/wp-content\/uploads\/2019\/11\/106af265a6bc2a8b31fe34df69e9c200.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Statistiques sur les m\u00e9triques sortantes : une seule n\u0153ud envoie toujours \u2014 le raidboss.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bioyino \u2014 agr\u00e9gateur de m\u00e9triques distribu\u00e9 et \u00e9volutif\" src=\"\/wp-content\/uploads\/2019\/11\/582730b501a42bb3a371a84bf2e2394b.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Statistiques de travail de chaque n\u0153ud en tenant compte des erreurs dans divers modules du syst\u00e8me.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bioyino \u2014 agr\u00e9gateur de m\u00e9triques distribu\u00e9 et \u00e9volutif\" src=\"\/wp-content\/uploads\/2019\/11\/101377281c3add8c598c6439ca25d271.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>D\u00e9tails des m\u00e9triques entrantes (les noms des m\u00e9triques sont masqu\u00e9s).<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bioyino \u2014 agr\u00e9gateur de m\u00e9triques distribu\u00e9 et \u00e9volutif\" src=\"\/wp-content\/uploads\/2019\/11\/6cf0b61b454b0414799460c482e03242.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Que pr\u00e9voyons-nous de faire avec tout cela ? Bien s\u00fbr, \u00e9crire du code, bl\u00e2&#8230; ! Le projet \u00e9tait \u00e0 l'origine pr\u00e9vu comme open-source et le restera tout au long de sa vie. Dans nos projets \u00e0 court terme, nous pr\u00e9voyons de passer \u00e0 notre propre version de Raft, de changer le protocole peer pour un plus portable, d'ajouter des statistiques internes suppl\u00e9mentaires, de nouveaux types de m\u00e9triques, de corriger des erreurs et d'autres am\u00e9liorations. <\/p>\n<p><\/p>\n<p>Bien s\u00fbr, toutes les personnes d\u00e9sireuses d'aider au d\u00e9veloppement du projet sont les bienvenues : cr\u00e9ez des PR, des Issues, et nous r\u00e9pondrons et travaillerons dessus si possible, etc.<\/p>\n<p><\/p>\n<p>Sur ce, comme on dit, that's all folks, achetez nos \u00e9l\u00e9phants !<\/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=\"Lire la vid\u00e9o\" 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 \/>Source : <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.2 - 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\/fr\/blog\/administrirovanie\/bioyino-raspredelyonnyj-masshtabiruemyj-agregator-metrik\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2\" \/>\n\t\t<meta property=\"og:locale\" content=\"fr_FR\" \/>\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\/fr\/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 agr\u00e9gateur de m\u00e9triques distribu\u00e9 et \u00e9volutif | ProHoster","description":"Donc, vous collectez des m\u00e9triques. Comme nous. Nous collectons aussi des m\u00e9triques. \u00c9videmment, celles qui sont n\u00e9cessaires pour l'entreprise.","canonical_url":"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/bioyino-raspredelyonnyj-masshtabiruemyj-agregator-metrik","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"fr_FR","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\/fr\/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\/fr\/wp-json\/wp\/v2\/posts\/52113","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/comments?post=52113"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts\/52113\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/media?parent=52113"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/categories?post=52113"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/tags?post=52113"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}