{"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\/es\/blog\/administrirovanie\/bioyino-raspredelyonnyj-masshtabiruemyj-agregator-metrik","title":{"rendered":"Bioyino \u2014 un agregador de m\u00e9tricas distribuido y escalable","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Entonces, est\u00e1s recopilando m\u00e9tricas. Al igual que nosotros. Tambi\u00e9n recopilamos m\u00e9tricas. Por supuesto, las necesarias para el negocio. Hoy hablaremos sobre el primer eslab\u00f3n del sistema de monitoreo: un servidor de agregaci\u00f3n compatible con statsd. <noindex><a rel=\"nofollow\" href=\"http:\/\/bit.ly\/2Noxg1M\">bioyino<\/a><\/noindex>, por qu\u00e9 lo escribimos y por qu\u00e9 abandonamos brubeck. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bioyino \u2014 un agregador de m\u00e9tricas distribuido y escalable\" 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>De nuestros art\u00edculos anteriores (<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>) se puede saber que hasta hace alg\u00fan tiempo, recopil\u00e1bamos etiquetas utilizando <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/github\/brubeck\">brubeck<\/a><\/noindex>. Est\u00e1 escrito en C. Desde el punto de vista del c\u00f3digo, es tan simple como un tap\u00f3n (lo cual es importante cuando quieres contribuir) y, lo m\u00e1s importante, maneja nuestros vol\u00famenes de 2 millones de m\u00e9tricas por segundo (MPS) en pico sin problemas. La documentaci\u00f3n afirma soportar 4 millones de MPS con asterisco. Esto significa que la cifra anunciada se obtendr\u00e1 si configuras correctamente la red en Linux. (No sabemos cu\u00e1ntos MPS se pueden obtener si dejas la red como est\u00e1). A pesar de estas ventajas, tuvimos varias quejas serias sobre brubeck.<\/p>\n<p><\/p>\n<p><em>Queja 1.<\/em> Github, el desarrollador del proyecto, ha dejado de mantenerlo: de publicar parches y arreglos, aceptar nuestros y (no solo nuestros) PR. En los \u00faltimos meses (desde febrero-marzo de 2018) la actividad ha vuelto, pero antes de eso hubo casi 2 a\u00f1os de completo silencio. Adem\u00e1s, el proyecto est\u00e1 desarrollado <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/github\/brubeck\/pull\/31#issuecomment-325907734\">para las necesidades internas de Github<\/a><\/noindex>, lo que puede convertirse en un serio obst\u00e1culo para implementar nuevas funcionalidades.<\/p>\n<p><\/p>\n<p><em>Queja 2.<\/em> Precisi\u00f3n de los c\u00e1lculos. Brubeck solo recopila 65536 valores para la agregaci\u00f3n. En nuestro caso, para algunas m\u00e9tricas en el per\u00edodo de agregaci\u00f3n (30 segundos) pueden llegar muchos m\u00e1s valores (1,527,392 en pico). Como resultado de esta muestreo, los valores de m\u00e1ximos y m\u00ednimos parecen in\u00fatiles. Por ejemplo, as\u00ed: <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bioyino \u2014 un agregador de m\u00e9tricas distribuido y escalable\" src=\"\/wp-content\/uploads\/2019\/11\/4222a1a7d1e127137220595241f5276c.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<em>Como fue<\/em><\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bioyino \u2014 un agregador de m\u00e9tricas distribuido y escalable\" src=\"\/wp-content\/uploads\/2019\/11\/c8f0025c61f708584328ea30aacf7bc0.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<em>Como deber\u00eda haber sido<\/em><\/p>\n<p><\/p>\n<p>Por la misma raz\u00f3n, las sumas se calculan incorrectamente. A\u00f1ade a esto un error de desbordamiento de float de 32 bits, que realmente provoca un segfault en el servidor al recibir una m\u00e9trica que parece inocente, y se vuelve a\u00fan mejor. El error, por cierto, a\u00fan no se ha corregido.<\/p>\n<p><\/p>\n<p>Y, por \u00faltimo, <em>Queja X<\/em>. En el momento de redactar este art\u00edculo, estamos listos para presentarlo a las 14 implementaciones de statsd m\u00e1s o menos funcionales que hemos logrado encontrar. Imaginemos que cierta infraestructura ha crecido tanto que recibir 4 millones de MPS ya no es suficiente. O puede que a\u00fan no haya crecido, pero las m\u00e9tricas son tan importantes para usted que incluso breves ca\u00eddas de 2-3 minutos en los gr\u00e1ficos pueden volverse cr\u00edticas y causar ataques de depresi\u00f3n incontrolable a los gerentes. Dado que tratar la depresi\u00f3n es un asunto ingrato, son necesarias soluciones t\u00e9cnicas.<\/p>\n<p><\/p>\n<p>En primer lugar, tolerancia a fallos, para que un problema repentino en el servidor no desencadene un apocalipsis zombi psiqui\u00e1trico en la oficina. En segundo lugar, escalabilidad, para poder recibir m\u00e1s de 4 millones de MPS sin tener que hurgar en la pila de red de Linux y crecer c\u00f3modamente 'horizontalmente' hasta los tama\u00f1os necesarios.<\/p>\n<p><\/p>\n<p>Dado que ten\u00edamos margen para la escalabilidad, decidimos comenzar con la tolerancia a fallos. '\u00a1Oh! \u00a1Tolerancia a fallos! Esto es f\u00e1cil, lo sabemos hacer', pensamos y lanzamos 2 servidores, levantando una copia de brubeck en cada uno. Para ello, tuvimos que duplicar el tr\u00e1fico con las m\u00e9tricas en ambos servidores e incluso escribir para ello <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/Albibek\/udpdup\">una peque\u00f1a utilidad<\/a><\/noindex>. Resolvimos el problema de la tolerancia a fallos, pero\u2026 no muy bien. Al principio, todo parec\u00eda ir bastante bien: cada brubeck recopila su propia variante de agregaci\u00f3n, escribe datos en Graphite cada 30 segundos, sobrescribiendo el intervalo anterior (esto lo hace Graphite). Si un servidor falla, siempre tenemos el segundo con su propia copia de los datos agregados. Pero hay un problema: si un servidor falla, en los gr\u00e1ficos aparece una 'sierra'. Esto se debe a que los intervalos de 30 segundos en brubeck no est\u00e1n sincronizados, y en el momento de la ca\u00edda uno de ellos no se sobrescribe. Al iniciar el segundo servidor ocurre lo mismo. Es bastante tolerable, pero se desea algo mejor. El problema de la escalabilidad tambi\u00e9n sigue sin resolverse. Todas las m\u00e9tricas siguen 'volando' hacia un \u00fanico servidor, por lo que estamos limitados a esos mismos 2-4 millones de MPS, dependiendo de la capacidad de la red.<\/p>\n<p><\/p>\n<p>Si se piensa un poco en el problema y al mismo tiempo se excava en la nieve, puede venir a la mente una idea tan obvia: se necesita un statsd que funcione en modo distribuido. Es decir, uno que implemente sincronizaci\u00f3n entre nodos en funci\u00f3n del tiempo y las m\u00e9tricas. \"Por supuesto, ya debe existir una soluci\u00f3n as\u00ed\", dijimos y empezamos a buscar en Google... y no encontramos nada. Despu\u00e9s de revisar la documentaci\u00f3n de varios 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 partir del 11.12.2017), no encontramos nada en absoluto. Al parecer, ni los desarrolladores ni los usuarios de estas soluciones se hab\u00edan enfrentado a esta CANTIDAD de m\u00e9tricas, de lo contrario, seguro ya habr\u00edan ideado algo.<\/p>\n<p><\/p>\n<p>Y aqu\u00ed recordamos el statsd \"juguete\" \u2014 bioyino, que desarrollamos en un hackathon solo por diversi\u00f3n (el nombre del proyecto fue generado por un script al inicio del hackathon) y entendimos que urgentemente necesit\u00e1bamos nuestro propio statsd. \u00bfPor qu\u00e9?<\/p>\n<p><\/p>\n<ul>\n<li>Porque en el mundo hay muy pocos clones de statsd,<\/li>\n<li>porque se puede proporcionar la resiliencia y escalabilidad deseadas (incluyendo sincronizar m\u00e9tricas agregadas entre servidores y resolver el problema de conflictos al enviar),<\/li>\n<li>porque se puede contar las m\u00e9tricas con m\u00e1s precisi\u00f3n que lo hace brubeck,<\/li>\n<li>porque podemos recopilar estad\u00edsticas m\u00e1s detalladas, que brubeck pr\u00e1cticamente no nos ofrec\u00eda,<\/li>\n<li>porque se present\u00f3 la oportunidad de programar nuestra propia aplicaci\u00f3n de alto rendimiento distribuida, que no replicar\u00e1 completamente la arquitectura de otra aplicaci\u00f3n de alto rendimiento similar. <\/li>\n<\/ul>\n<p><\/p>\n<p>\u00bfEn qu\u00e9 escribir? Por supuesto, en Rust. \u00bfPor qu\u00e9?<\/p>\n<p><\/p>\n<ul>\n<li>porque ya ten\u00edamos un prototipo de la soluci\u00f3n,<\/li>\n<li>porque el autor del art\u00edculo en ese momento ya conoc\u00eda Rust y estaba ansioso por escribir algo en \u00e9l que pudiera ser publicado en open-source,<\/li>\n<li>porque los lenguajes con GC no nos son adecuados debido a la naturaleza del tr\u00e1fico recibido (pr\u00e1cticamente en tiempo real) y las pausas del GC son pr\u00e1cticamente inaceptables, <\/li>\n<li>porque necesitamos el m\u00e1ximo rendimiento, comparable al de C<\/li>\n<li>porque Rust nos proporciona concurrencia sin miedo, y al comenzar a escribir esto en C\/C++, habr\u00edamos enfrentado a\u00fan m\u00e1s vulnerabilidades, desbordamientos de buffer, condiciones de carrera y otras palabras aterradoras que ya tiene brubeck.<\/li>\n<\/ul>\n<p><\/p>\n<p>Tambi\u00e9n hubo un argumento en contra de Rust. La empresa no ten\u00eda experiencia en la creaci\u00f3n de proyectos en Rust, y actualmente tampoco planeamos usarlo en el proyecto principal. Por lo tanto, hab\u00eda serias preocupaciones de que no funcionar\u00eda, pero decidimos arriesgarnos y probar.<\/p>\n<p><\/p>\n<p>Pas\u00f3 el tiempo...<\/p>\n<p><\/p>\n<p>Finalmente, despu\u00e9s de varios intentos fallidos, la primera versi\u00f3n funcional estaba lista. \u00bfQu\u00e9 sali\u00f3 de ello? Esto es lo que obtuvimos.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bioyino \u2014 un agregador de m\u00e9tricas distribuido y escalable\" src=\"\/wp-content\/uploads\/2019\/11\/322c4136ed033b80b31a89d7b5f63af8.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Cada nodo recibe su propio conjunto de m\u00e9tricas y las acumula internamente, sin agregar m\u00e9tricas para los tipos que requieren su conjunto completo para la agregaci\u00f3n final. Los nodos est\u00e1n conectados entre s\u00ed mediante alg\u00fan protocolo de bloqueo distribuido, que permite elegir entre ellos el \u00fanico (aqu\u00ed lloramos) que es digno de enviar m\u00e9tricas al Gran. Actualmente, este problema se resuelve mediante <noindex><a rel=\"nofollow\" href=\"https:\/\/www.consul.io\/docs\/guides\/leader-election.html\">Consul<\/a><\/noindex>, pero en el futuro las ambiciones del autor se extienden a <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/Albibek\/raft-consensus\">su propio<\/a><\/noindex> <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/Albibek\/raft-tokio\">implementaci\u00f3n<\/a><\/noindex> Raft, donde ese digno ser\u00e1, por supuesto, el nodo l\u00edder del consenso. Adem\u00e1s del consenso, los nodos suelen (por defecto, una vez por segundo) enviar a sus vecinos las partes de las m\u00e9tricas preagregadas que lograron acumular durante ese segundo. As\u00ed que, la escalabilidad y la resistencia a fallos se mantienen: cada uno de los nodos todav\u00eda mantiene su conjunto completo de m\u00e9tricas, pero las m\u00e9tricas se env\u00edan ya agregadas, a trav\u00e9s de TCP y con codificaci\u00f3n en un protocolo binario, por lo que los costos de duplicaci\u00f3n se reducen significativamente en comparaci\u00f3n con UDP. A pesar de la gran cantidad de m\u00e9tricas entrantes, la acumulaci\u00f3n requiere muy poca memoria y a\u00fan menos CPU. Para nuestras m\u00e9tricas bien compresibles, son solo unas pocas decenas de megabytes de datos. Un bono adicional es que se elimina la sobreescritura innecesaria de datos en Graphite, como suced\u00eda con burbeck.<\/p>\n<p><\/p>\n<p>Los paquetes UDP con m\u00e9tricas se distribuyen entre los nodos en el equipo de red mediante un simple Round Robin. Por supuesto, el hardware de red no analiza el contenido de los paquetes y, por lo tanto, puede manejar mucho m\u00e1s de 4M de paquetes por segundo, sin mencionar las m\u00e9tricas, que en realidad no conoce en absoluto. Teniendo en cuenta que las m\u00e9tricas no llegan de una en una en cada paquete, no prevemos problemas de rendimiento en este aspecto. En caso de ca\u00edda del servidor, el dispositivo de red detecta r\u00e1pidamente (dentro de 1-2 segundos) este hecho y retira el servidor ca\u00eddo de la rotaci\u00f3n. Como resultado, los nodos pasivos (es decir, no l\u00edderes) se pueden encender y apagar pr\u00e1cticamente sin notar ca\u00eddas en los gr\u00e1ficos. Lo m\u00e1ximo que perdemos es una parte de las m\u00e9tricas que llegaron en el \u00faltimo segundo. La p\u00e9rdida\/desconexi\u00f3n\/cambio repentino de un l\u00edder seguir\u00e1 mostrando una anomal\u00eda leve (el intervalo de 30 segundos sigue desincronizado), pero con una conexi\u00f3n entre los nodos se pueden minimizar estos problemas, por ejemplo, mediante el env\u00edo de paquetes de sincronizaci\u00f3n.<\/p>\n<p><\/p>\n<p>Un poco sobre la arquitectura interna. La aplicaci\u00f3n, por supuesto, es multihilo, pero la arquitectura de hilos es diferente a la utilizada en brubeck. Los hilos en brubeck son homog\u00e9neos: cada uno de ellos se encarga tanto de la recolecci\u00f3n de informaci\u00f3n como de la agregaci\u00f3n. En bioyino, los hilos de trabajo (workers) se dividen en dos grupos: los responsables de la red y los responsables de la agregaci\u00f3n. Esta divisi\u00f3n permite gestionar la aplicaci\u00f3n de manera m\u00e1s flexible seg\u00fan el tipo de m\u00e9tricas: donde se requiere una agregaci\u00f3n intensiva, se pueden a\u00f1adir m\u00e1s agregadores, y donde hay mucho tr\u00e1fico de red, se puede aumentar el n\u00famero de hilos de red. En este momento, en nuestros servidores estamos trabajando con 8 hilos de red y 4 hilos de agregaci\u00f3n.<\/p>\n<p><\/p>\n<p>La parte de conteo (responsable de la agregaci\u00f3n) es bastante aburrida. Los b\u00faferes llenos de hilos de red se distribuyen entre los hilos de conteo, donde posteriormente se analizan y agregan. Las m\u00e9tricas se env\u00edan a otras nodos bajo demanda. Todo esto, incluyendo la transmisi\u00f3n de datos entre nodos y el trabajo con Consul, se realiza de manera as\u00edncrona, funcionando sobre el framework <noindex><a rel=\"nofollow\" href=\"https:\/\/tokio.rs\">tokio<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>El desarrollo de la parte de red, encargada de recibir m\u00e9tricas, ha presentado muchos m\u00e1s problemas. La principal tarea de separar los flujos de red en entidades distintas fue reducir el tiempo que el flujo tarda <em>no<\/em> en leer datos del socket. Las opciones que utilizan UDP as\u00edncrono y el recvmsg normal se descartaron r\u00e1pidamente: la primera consume demasiada CPU en el espacio de usuario para procesar eventos, la segunda \u2014 demasiados cambios de contexto. Por lo tanto, actualmente se utiliza <noindex><a rel=\"nofollow\" href=\"https:\/\/linux.die.net\/man\/2\/recvmmsg\">recvmmsg<\/a><\/noindex> con buffers grandes (\u00a1y los buffers, se\u00f1ores oficiales, no son cualquier cosa!). Se ha mantenido el soporte para UDP normal en casos no cargados, donde no es necesario recvmmsg. En modo multimensaje se logra lo principal: la gran mayor\u00eda del tiempo, el flujo de red despeja la cola del sistema operativo, leyendo datos del socket y traslad\u00e1ndolos al buffer del espacio de usuario, solo cambiando de vez en cuando para entregar el buffer lleno a los agregadores. La cola en el socket pr\u00e1cticamente no se acumula, y el n\u00famero de paquetes desechados pr\u00e1cticamente no aumenta. <\/p>\n<p>\n<b class=\"spoiler_title\">Nota<\/b><\/p>\n<p>En la configuraci\u00f3n predeterminada, el tama\u00f1o del buffer est\u00e1 ajustado para ser bastante grande. Si decides probar el servidor por tu cuenta, es posible que encuentres que despu\u00e9s de enviar una peque\u00f1a cantidad de m\u00e9tricas, estas no lleguen a Graphite, qued\u00e1ndose en el buffer del flujo de red. Para trabajar con un peque\u00f1o n\u00famero de m\u00e9tricas, debes ajustar los valores de bufsize y task-queue-size en la configuraci\u00f3n a menores.<\/p>\n<p><\/p>\n<p>Por \u00faltimo, un poco de gr\u00e1ficos para los amantes de las estad\u00edsticas.<\/p>\n<p><\/p>\n<p>Estad\u00edsticas del n\u00famero de m\u00e9tricas recibidas por cada servidor: m\u00e1s de 2 millones de MPS.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bioyino \u2014 un agregador de m\u00e9tricas distribuido y escalable\" src=\"\/wp-content\/uploads\/2019\/11\/c6cb1a36c267657d55ec22df518f8d03.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Desconexi\u00f3n de uno de los nodos y redistribuci\u00f3n de las m\u00e9tricas entrantes.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bioyino \u2014 un agregador de m\u00e9tricas distribuido y escalable\" src=\"\/wp-content\/uploads\/2019\/11\/106af265a6bc2a8b31fe34df69e9c200.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Estad\u00edsticas de m\u00e9tricas salientes: siempre solo un nodo env\u00eda \u2014 el jefe de la banda.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bioyino \u2014 un agregador de m\u00e9tricas distribuido y escalable\" src=\"\/wp-content\/uploads\/2019\/11\/582730b501a42bb3a371a84bf2e2394b.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Estad\u00edsticas del rendimiento de cada nodo teniendo en cuenta errores en varios m\u00f3dulos del sistema.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bioyino \u2014 un agregador de m\u00e9tricas distribuido y escalable\" src=\"\/wp-content\/uploads\/2019\/11\/101377281c3add8c598c6439ca25d271.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Detallado de m\u00e9tricas entrantes (los nombres de m\u00e9tricas est\u00e1n ocultos).<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bioyino \u2014 un agregador de m\u00e9tricas distribuido y escalable\" src=\"\/wp-content\/uploads\/2019\/11\/6cf0b61b454b0414799460c482e03242.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u00bfQu\u00e9 planeamos hacer con todo esto a continuaci\u00f3n? Por supuesto, \u00a1escribir c\u00f3digo, bl...! El proyecto estaba inicialmente planeado como open-source y continuar\u00e1 siendo as\u00ed durante toda su vida. En los planes m\u00e1s cercanos est\u00e1 la transici\u00f3n a nuestra propia versi\u00f3n de Raft, el cambio del protocolo peer a uno m\u00e1s port\u00e1til, la adici\u00f3n de estad\u00edsticas internas adicionales, nuevos tipos de m\u00e9tricas, correcci\u00f3n de errores y otras mejoras. <\/p>\n<p><\/p>\n<p>Por supuesto, todos los que deseen ayudar en el desarrollo del proyecto son bienvenidos: \u00a1crea PR, Issues y responderemos y mejoraremos cuando sea posible, etc.!<\/p>\n<p><\/p>\n<p>Con esto, como se dice, \u00a1eso es todo, amigos, compren nuestros elefantes!<\/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=\"Reproducir 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 \/>Fuente: <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\/es\/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=\"es_ES\" \/>\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\/es\/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 agregador de m\u00e9tricas distribuido y escalable | ProHoster","description":"As\u00ed que, ustedes est\u00e1n recopilando m\u00e9tricas. Al igual que nosotros. Tambi\u00e9n estamos recopilando m\u00e9tricas. Por supuesto, las necesarias para el negocio.","canonical_url":"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/bioyino-raspredelyonnyj-masshtabiruemyj-agregator-metrik","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"es_ES","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\/es\/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\/es\/wp-json\/wp\/v2\/posts\/52113","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/comments?post=52113"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts\/52113\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/media?parent=52113"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/categories?post=52113"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/tags?post=52113"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}