{"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\/pt\/blog\/administrirovanie\/bioyino-raspredelyonnyj-masshtabiruemyj-agregator-metrik","title":{"rendered":"Bioyino \u2014 um agregador de m\u00e9tricas distribu\u00eddo e escal\u00e1vel","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Ent\u00e3o, voc\u00ea est\u00e1 coletando m\u00e9tricas. Assim como n\u00f3s. Tamb\u00e9m coletamos m\u00e9tricas. Claro, as necess\u00e1rias para o neg\u00f3cio. Hoje, falaremos sobre o primeiro elo do nosso sistema de monitoramento \u2014 um servidor de agrega\u00e7\u00e3o compat\u00edvel com statsd. <noindex><a rel=\"nofollow\" href=\"http:\/\/bit.ly\/2Noxg1M\">bioyino<\/a><\/noindex>, por que o escrevemos e por que abandonamos o brubeck. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bioyino \u2014 um agregador de m\u00e9tricas distribu\u00eddo e escal\u00e1vel\" 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>A partir de nossos artigos 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>) voc\u00ea pode descobrir que, at\u00e9 certo tempo, colet\u00e1vamos as etiquetas por meio de <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/github\/brubeck\">brubeck<\/a><\/noindex>. Ele foi escrito em C. Do ponto de vista do c\u00f3digo \u2014 simples como um palito (isso \u00e9 importante quando voc\u00ea deseja contribuir) e, o mais importante, lida com nossos volumes de 2 milh\u00f5es de m\u00e9tricas por segundo (MPS) no pico, sem grandes problemas. A documenta\u00e7\u00e3o afirma o suporte a 4 milh\u00f5es de MPS com um asterisco. Isso significa que voc\u00ea atingir\u00e1 o n\u00famero declarado se configurar corretamente a rede no Linux. (N\u00e3o sabemos quantos MPS podem ser obtidos se a rede for deixada como est\u00e1). Apesar dessas vantagens, tivemos algumas s\u00e9rias reclama\u00e7\u00f5es sobre o brubeck.<\/p>\n<p><\/p>\n<p><em>Reclama\u00e7\u00e3o 1.<\/em> Github \u2014 o desenvolvedor do projeto \u2014 parou de suport\u00e1-lo: publicar patches e corre\u00e7\u00f5es, aceitar nossos e (n\u00e3o apenas nossos) PRs. Nos \u00faltimos meses (desde fevereiro-mar\u00e7o de 2018) a atividade foi retomada, mas antes disso houve quase 2 anos de completo sil\u00eancio. Al\u00e9m disso, o projeto \u00e9 desenvolvido <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/github\/brubeck\/pull\/31#issuecomment-325907734\">para necessidades internas do GitHub<\/a><\/noindex>, o que pode se tornar um s\u00e9rio obst\u00e1culo para a implementa\u00e7\u00e3o de novas funcionalidades.<\/p>\n<p><\/p>\n<p><em>Reclama\u00e7\u00e3o 2.<\/em> Precis\u00e3o dos c\u00e1lculos. O Brubeck coleta apenas 65536 valores para a agrega\u00e7\u00e3o. No nosso caso, para algumas m\u00e9tricas, durante o per\u00edodo de agrega\u00e7\u00e3o (30 seg), pode chegar muito mais valores (1.527.392 no pico). Como resultado dessa amostragem, os valores m\u00e1ximos e m\u00ednimos parecem in\u00fateis. Por exemplo, assim: <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bioyino \u2014 um agregador de m\u00e9tricas distribu\u00eddo e escal\u00e1vel\" src=\"\/wp-content\/uploads\/2019\/11\/4222a1a7d1e127137220595241f5276c.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<em>Como foi<\/em><\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bioyino \u2014 um agregador de m\u00e9tricas distribu\u00eddo e escal\u00e1vel\" src=\"\/wp-content\/uploads\/2019\/11\/c8f0025c61f708584328ea30aacf7bc0.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<em>Como deveria ser<\/em><\/p>\n<p><\/p>\n<p>Pelo mesmo motivo, as somas s\u00e3o consideradas incorretas. Adicione a isso o bug de estouro do float de 32 bits, que envia o servidor para um segfault ao receber uma m\u00e9trica que, \u00e0 primeira vista, parece inofensiva, e a situa\u00e7\u00e3o se torna ainda pior. O bug, a prop\u00f3sito, n\u00e3o foi corrigido.<\/p>\n<p><\/p>\n<p>E, finalmente, <em>Reclama\u00e7\u00e3o X<\/em>. No momento da reda\u00e7\u00e3o deste artigo, estamos prontos para apresent\u00e1-lo a todas as 14 implementa\u00e7\u00f5es funcionais do statsd que conseguimos encontrar. Vamos imaginar que uma infraestrutura espec\u00edfica cresceu tanto que aceitar 4 milh\u00f5es de MPS j\u00e1 n\u00e3o \u00e9 suficiente. Ou pode ser que ainda n\u00e3o tenha crescido, mas as m\u00e9tricas para voc\u00ea j\u00e1 s\u00e3o t\u00e3o importantes que at\u00e9 mesmo breves falhas de 2 a 3 minutos nos gr\u00e1ficos podem se tornar cr\u00edticas e provocar crises de depress\u00e3o insuper\u00e1veis nos gerentes. Como tratar a depress\u00e3o \u00e9 uma tarefa ingrata, s\u00e3o necess\u00e1rias solu\u00e7\u00f5es t\u00e9cnicas.<\/p>\n<p><\/p>\n<p>Em primeiro lugar, toler\u00e2ncia a falhas, para que um problema repentino no servidor n\u00e3o cause um apocalipse zumbi psiqui\u00e1trico no escrit\u00f3rio. Em segundo lugar, escalabilidade, para que possamos aceitar mais de 4 milh\u00f5es de MPS sem ter que aprofundar no stack de rede do Linux e possamos crescer \"horizontalmente\" para os tamanhos necess\u00e1rios.<\/p>\n<p><\/p>\n<p>Como t\u00ednhamos uma margem para escalabilidade, decidimos come\u00e7ar pela toler\u00e2ncia a falhas. \"Oh! Toler\u00e2ncia a falhas! Isso \u00e9 f\u00e1cil, n\u00f3s sabemos fazer isso\", pensamos, e lan\u00e7amos 2 servidores, levantando em cada um uma c\u00f3pia do brubeck. Para isso, tivemos que copiar o tr\u00e1fego com m\u00e9tricas para ambos os servidores e at\u00e9 mesmo escrever para isso <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/Albibek\/udpdup\">uma pequena utilidade<\/a><\/noindex>. Este problema de toler\u00e2ncia a falhas foi resolvido, mas... n\u00e3o muito bem. No in\u00edcio, tudo parecia \u00f3timo: cada brubeck coleta sua pr\u00f3pria vers\u00e3o da agrega\u00e7\u00e3o, escreve dados no Graphite a cada 30 segundos, sobrescrevendo o intervalo anterior (isso acontece do lado do Graphite). Se um servidor falhar, sempre temos o segundo com sua pr\u00f3pria c\u00f3pia dos dados agregados. Mas eis o problema: se um servidor falha, aparece uma \"serra\" nos gr\u00e1ficos. Isso ocorre porque os intervalos de 30 segundos do brubeck n\u00e3o est\u00e3o sincronizados, e no momento da falha, um deles n\u00e3o \u00e9 sobrescrito. No momento em que o segundo servidor \u00e9 iniciado, o mesmo acontece. \u00c9 bastante aceit\u00e1vel, mas gostar\u00edamos de algo melhor! O problema da escalabilidade tamb\u00e9m n\u00e3o desapareceu. Todas as m\u00e9tricas ainda est\u00e3o \"voando\" para um servidor \u00fanico, e, portanto, estamos limitados aos mesmos 2 a 4 milh\u00f5es de MPS, dependendo da capacidade da rede.<\/p>\n<p><\/p>\n<p>Se pensarmos um pouco sobre o problema e ao mesmo tempo cavarmos a neve com uma p\u00e1, pode nos ocorrer uma ideia \u00f3bvia: precisamos de um statsd que funcione em modo distribu\u00eddo. Ou seja, um que implemente a sincroniza\u00e7\u00e3o entre n\u00f3s em termos de tempo e m\u00e9tricas. \"Claro, uma solu\u00e7\u00e3o assim deve existir\", dissemos n\u00f3s e fomos pesquisar.... E nada encontramos. Ap\u00f3s revisar a documenta\u00e7\u00e3o de diferentes statsd (<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/etsy\/statsd\/wiki#server-implementations\">https:\/\/github.com\/etsy\/statsd\/wiki#server-implementations<\/a><\/noindex> at\u00e9 11.12.2017), n\u00e3o encontramos nada. Aparentemente, nem os desenvolvedores nem os usu\u00e1rios dessas solu\u00e7\u00f5es ainda se depararam com UM N\u00daMERO T\u00c3O GRANDE de m\u00e9tricas, caso contr\u00e1rio, eles teriam inventado algo.<\/p>\n<p><\/p>\n<p>E ent\u00e3o nos lembramos do statsd \"brinquedo\" \u2014 bioyino, que escrevemos no hackathon apenas por divers\u00e3o (o nome do projeto foi gerado por um script antes do in\u00edcio do hackathon) e percebemos que precisar\u00edamos urgentemente do nosso pr\u00f3prio statsd. Por qu\u00ea?<\/p>\n<p><\/p>\n<ul>\n<li>porque no mundo h\u00e1 muito poucos clones de statsd,<\/li>\n<li>porque \u00e9 poss\u00edvel garantir a confiabilidade e escalabilidade desejadas ou pr\u00f3ximas ao desejado (incluindo a sincroniza\u00e7\u00e3o de m\u00e9tricas agregadas entre os servidores e resolver o problema de conflitos durante o envio),<\/li>\n<li>porque podemos contar as m\u00e9tricas com mais precis\u00e3o do que o brubeck,<\/li>\n<li>porque podemos coletar estat\u00edsticas mais detalhadas, que o brubeck praticamente n\u00e3o nos fornecia,<\/li>\n<li>porque surgiu a chance de programar nosso pr\u00f3prio hyperperformancedistributedsystemapplication, que n\u00e3o ir\u00e1 repetir completamente a arquitetura de outro hyperperform... novamento bem-sucedido. <\/li>\n<\/ul>\n<p><\/p>\n<p>Em que escrever? Claro, em Rust. Por qu\u00ea?<\/p>\n<p><\/p>\n<ul>\n<li>porque j\u00e1 havia um prot\u00f3tipo da solu\u00e7\u00e3o,<\/li>\n<li>porque o autor do artigo j\u00e1 sabia Rust e estava ansioso para escrever algo para produ\u00e7\u00e3o com a possibilidade de disponibiliz\u00e1-lo em open-source,<\/li>\n<li>porque linguagens com GC n\u00e3o s\u00e3o adequadas para a natureza do tr\u00e1fego recebido (praticamente em tempo real) e as pausas do GC s\u00e3o praticamente inadmiss\u00edveis, <\/li>\n<li>porque precisamos de m\u00e1xima performance, compar\u00e1vel ao C<\/li>\n<li>porque Rust nos fornece concorr\u00eancia sem medo, e ao come\u00e7ar a escrever isso em C\/C++, ter\u00edamos acumulado ainda mais vulnerabilidades, estouros de buffer, condi\u00e7\u00f5es de corrida e outras palavras assustadoras.<\/li>\n<\/ul>\n<p><\/p>\n<p>Houve tamb\u00e9m um argumento contra o Rust. A empresa n\u00e3o tinha experi\u00eancia na cria\u00e7\u00e3o de projetos em Rust, e atualmente n\u00e3o planejamos us\u00e1-lo em nosso projeto principal. Portanto, havia s\u00e9rias preocupa\u00e7\u00f5es de que nada funcionaria, mas decidimos arriscar e tentar.<\/p>\n<p><\/p>\n<p>O tempo passou...<\/p>\n<p><\/p>\n<p>Finalmente, ap\u00f3s v\u00e1rias tentativas sem sucesso, a primeira vers\u00e3o funcional estava pronta. O que conseguimos? Conseguimos algo assim.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bioyino \u2014 um agregador de m\u00e9tricas distribu\u00eddo e escal\u00e1vel\" src=\"\/wp-content\/uploads\/2019\/11\/322c4136ed033b80b31a89d7b5f63af8.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Cada n\u00f3 recebe seu pr\u00f3prio conjunto de m\u00e9tricas e acumula-as, sem agregar m\u00e9tricas para aqueles tipos que exigiriam seu conjunto completo para a agrega\u00e7\u00e3o final. Os n\u00f3s est\u00e3o conectados entre si por meio de um protocolo de bloqueio distribu\u00eddo, que permite escolher entre eles aquele \u00fanico (aqui choramos) que \u00e9 digno de enviar m\u00e9tricas ao Grande. Neste momento, esse problema \u00e9 resolvido por meio de <noindex><a rel=\"nofollow\" href=\"https:\/\/www.consul.io\/docs\/guides\/leader-election.html\">Consul<\/a><\/noindex>, mas no futuro as ambi\u00e7\u00f5es do autor se estendem at\u00e9 <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/Albibek\/raft-consensus\">sua pr\u00f3pria<\/a><\/noindex> <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/Albibek\/raft-tokio\">implementa\u00e7\u00e3o<\/a><\/noindex> Raft, onde aquele digno ser\u00e1, claro, o n\u00f3-l\u00edder do consenso. Al\u00e9m do consenso, os n\u00f3s costumam (por padr\u00e3o, uma vez por segundo) enviar aos seus vizinhos as partes das m\u00e9tricas pr\u00e9-agregadas que conseguiram coletar durante esse segundo. Assim, a escalabilidade e a resist\u00eancia a falhas s\u00e3o mantidas - cada um dos n\u00f3s ainda mant\u00e9m seu conjunto completo de m\u00e9tricas, mas as m\u00e9tricas s\u00e3o enviadas j\u00e1 agregadas, via TCP e com codifica\u00e7\u00e3o em um protocolo bin\u00e1rio, portanto, os custos com duplica\u00e7\u00e3o em compara\u00e7\u00e3o ao UDP s\u00e3o significativamente reduzidos. Apesar da grande quantidade de m\u00e9tricas recebidas, a acumula\u00e7\u00e3o requer muito pouca mem\u00f3ria e ainda menos CPU. Para nossas m\u00e9tricas bem comprim\u00edveis, isso representa apenas algumas dezenas de megabytes de dados. Como b\u00f4nus adicional, obtemos a aus\u00eancia de regrava\u00e7\u00f5es desnecess\u00e1rias de dados no Graphite, como aconteceu com o burbeck.<\/p>\n<p><\/p>\n<p>Os pacotes UDP com m\u00e9tricas s\u00e3o distribu\u00eddos entre os n\u00f3s no equipamento de rede atrav\u00e9s de um simples Round Robin. Naturalmente, o hardware de rede n\u00e3o analisa o conte\u00fado dos pacotes e, portanto, pode suportar muito mais do que 4M de pacotes por segundo, sem mencionar as m\u00e9tricas, sobre as quais n\u00e3o sabe nada. Considerando que as m\u00e9tricas n\u00e3o chegam uma por uma em cada pacote, n\u00e3o prevemos problemas de desempenho aqui. Em caso de queda do servidor, o dispositivo de rede detecta rapidamente (dentro de 1-2 segundos) esse fato e remove o servidor com problemas da rota\u00e7\u00e3o. Como resultado, \u00e9 poss\u00edvel ativar e desativar n\u00f3s passivos (ou seja, que n\u00e3o s\u00e3o l\u00edderes) quase sem notar quedas nos gr\u00e1ficos. O m\u00e1ximo que perdemos \u00e9 uma parte das m\u00e9tricas recebidas no \u00faltimo segundo. A perda\/desligamento\/mudan\u00e7a repentina do l\u00edder ainda vai desenhar uma anomalia insignificante (o intervalo de 30 segundos ainda est\u00e1 desincronizado), mas, com a comunica\u00e7\u00e3o entre os n\u00f3s, \u00e9 poss\u00edvel minimizar esses problemas, por exemplo, enviando pacotes de sincroniza\u00e7\u00e3o.<\/p>\n<p><\/p>\n<p>Um pouco sobre a estrutura interna. O aplicativo, claro, \u00e9 multithread, mas a arquitetura de threads \u00e9 diferente da utilizada no brubeck. As threads em brubeck s\u00e3o id\u00eanticas - cada uma delas \u00e9 respons\u00e1vel simultaneamente pela coleta de informa\u00e7\u00f5es e pela agrega\u00e7\u00e3o. No bioyino, as threads de trabalho (workers) s\u00e3o divididas em dois grupos: respons\u00e1veis pela rede e respons\u00e1veis pela agrega\u00e7\u00e3o. Essa divis\u00e3o permite gerenciar o aplicativo de maneira mais flex\u00edvel, dependendo do tipo de m\u00e9trica: onde \u00e9 necess\u00e1ria uma agrega\u00e7\u00e3o intensiva, podem ser adicionados mais agregadores, onde h\u00e1 muito tr\u00e1fego de rede - aumentar o n\u00famero de threads de rede. No momento, em nossos servidores, temos 8 threads de rede e 4 de agrega\u00e7\u00e3o.<\/p>\n<p><\/p>\n<p>A parte respons\u00e1vel pela agrega\u00e7\u00e3o \u00e9 bastante mon\u00f3tona. Os buffers preenchidos com threads de rede s\u00e3o distribu\u00eddos entre as threads de contagem, onde s\u00e3o analisados e agregados. Medi\u00e7\u00f5es s\u00e3o fornecidas sob demanda para envio para outros n\u00f3s. Tudo isso, incluindo a transfer\u00eancia de dados entre os n\u00f3s e a intera\u00e7\u00e3o com o Consul, \u00e9 executado de forma ass\u00edncrona e opera no framework <noindex><a rel=\"nofollow\" href=\"https:\/\/tokio.rs\">tokio<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>O desenvolvimento da parte de rede respons\u00e1vel pela recep\u00e7\u00e3o das m\u00e9tricas gerou muito mais problemas. A principal tarefa de separar os fluxos de rede em entidades distintas era reduzir o tempo que o fluxo gastava <em>n\u00e3o<\/em> na leitura de dados do socket. As op\u00e7\u00f5es utilizando UDP ass\u00edncrono e o recvmsg normal foram rapidamente descartadas: a primeira consome muitos ciclos de CPU em espa\u00e7o do usu\u00e1rio para processar eventos, a segunda exige muitas trocas de contexto. Portanto, atualmente \u00e9 utilizado <noindex><a rel=\"nofollow\" href=\"https:\/\/linux.die.net\/man\/2\/recvmmsg\">recvmmsg<\/a><\/noindex> com buffers grandes (e, senhores oficiais, esses buffers n\u00e3o s\u00e3o algo trivial!). O suporte ao UDP normal \u00e9 mantido para casos n\u00e3o cr\u00edticos, onde o recvmmsg n\u00e3o \u00e9 necess\u00e1rio. No modo multimensagem, conseguimos alcan\u00e7ar o principal objetivo: a grande maioria do tempo, o fluxo de rede est\u00e1 limpando a fila do sistema operacional \u2014 lendo dados do socket e transferindo-os para o buffer de espa\u00e7o do usu\u00e1rio, apenas ocasionalmente mudando para entregar o buffer preenchido aos agregadores. A fila no socket praticamente n\u00e3o se acumula, e o n\u00famero de pacotes descartados quase n\u00e3o cresce. <\/p>\n<p>\n<b class=\"spoiler_title\">Nota<\/b><\/p>\n<p>Nas configura\u00e7\u00f5es padr\u00e3o, o tamanho do buffer \u00e9 definido como suficientemente grande. Se voc\u00ea decidir testar o servidor por conta pr\u00f3pria, pode perceber que ap\u00f3s enviar uma pequena quantidade de m\u00e9tricas, elas n\u00e3o chegam ao Graphite, permanecendo no buffer do fluxo de rede. Para trabalhar com um n\u00famero reduzido de m\u00e9tricas, \u00e9 preciso definir valores menores para bufsize e task-queue-size no arquivo de configura\u00e7\u00e3o.<\/p>\n<p><\/p>\n<p>Por fim \u2014 alguns gr\u00e1ficos para os amantes de gr\u00e1ficos.<\/p>\n<p><\/p>\n<p>Estat\u00edsticas do n\u00famero de m\u00e9tricas recebidas por servidor: mais de 2 milh\u00f5es de MPS.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bioyino \u2014 um agregador de m\u00e9tricas distribu\u00eddo e escal\u00e1vel\" src=\"\/wp-content\/uploads\/2019\/11\/c6cb1a36c267657d55ec22df518f8d03.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Desconex\u00e3o de um dos n\u00f3s e realoca\u00e7\u00e3o das m\u00e9tricas recebidas.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bioyino \u2014 um agregador de m\u00e9tricas distribu\u00eddo e escal\u00e1vel\" src=\"\/wp-content\/uploads\/2019\/11\/106af265a6bc2a8b31fe34df69e9c200.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Estat\u00edsticas das m\u00e9tricas enviadas: sempre apenas um n\u00f3 envia \u2014 o raidboss.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bioyino \u2014 um agregador de m\u00e9tricas distribu\u00eddo e escal\u00e1vel\" src=\"\/wp-content\/uploads\/2019\/11\/582730b501a42bb3a371a84bf2e2394b.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Estat\u00edsticas de opera\u00e7\u00e3o de cada n\u00f3 levando em conta os erros em v\u00e1rios m\u00f3dulos do sistema.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bioyino \u2014 um agregador de m\u00e9tricas distribu\u00eddo e escal\u00e1vel\" src=\"\/wp-content\/uploads\/2019\/11\/101377281c3add8c598c6439ca25d271.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Detalhamento das m\u00e9tricas recebidas (nomes das m\u00e9tricas ocultados).<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bioyino \u2014 um agregador de m\u00e9tricas distribu\u00eddo e escal\u00e1vel\" src=\"\/wp-content\/uploads\/2019\/11\/6cf0b61b454b0414799460c482e03242.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>O que planejamos fazer com tudo isso a seguir? Claro, escrever c\u00f3digo, bl...! O projeto foi inicialmente planejado como open-source e permanecer\u00e1 assim durante toda a sua vida. Nos pr\u00f3ximos planos est\u00e3o a transi\u00e7\u00e3o para nossa vers\u00e3o pr\u00f3pria do Raft, a mudan\u00e7a do protocolo peer para um mais port\u00e1til, a inclus\u00e3o de estat\u00edsticas internas adicionais, novos tipos de m\u00e9tricas, corre\u00e7\u00e3o de erros e outras melhorias. <\/p>\n<p><\/p>\n<p>Claro, todos os que desejam ajudar no desenvolvimento do projeto s\u00e3o bem-vindos: criem PR, Issues, responderemos e ajustaremos sempre que poss\u00edvel, etc.<\/p>\n<p><\/p>\n<p>E \u00e9 isso, como dizem, isso \u00e9 tudo, pessoal, comprem nossos 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=\"Por que no hosting comum a administra\u00e7\u00e3o do PrestaShop \u00e9 lenta, e no seu n\u00e3o \u00e9?\" 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.3 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u0418\u0442\u0430\u043a, \u0432\u044b \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442\u0435 \u043c\u0435\u0442\u0440\u0438\u043a\u0438. \u041a\u0430\u043a \u0438 \u043c\u044b. \u041c\u044b \u0442\u043e\u0436\u0435 \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u043c \u043c\u0435\u0442\u0440\u0438\u043a\u0438. \u041a\u043e\u043d\u0435\u0447\u043d\u043e \u0436\u0435, \u043d\u0443\u0436\u043d\u044b\u0435 \u0434\u043b\u044f \u0431\u0438\u0437\u043d\u0435\u0441\u0430.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/bioyino-raspredelyonnyj-masshtabiruemyj-agregator-metrik\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"pt_PT\" \/>\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\/pt\/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 distribu\u00eddo e escal\u00e1vel | ProHoster","description":"Ent\u00e3o, voc\u00ea est\u00e1 coletando m\u00e9tricas. Assim como n\u00f3s. N\u00f3s tamb\u00e9m coletamos m\u00e9tricas. Claro, as necess\u00e1rias para os neg\u00f3cios.","canonical_url":"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/bioyino-raspredelyonnyj-masshtabiruemyj-agregator-metrik","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"pt_PT","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\/pt\/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\/pt\/wp-json\/wp\/v2\/posts\/52113","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/comments?post=52113"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts\/52113\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/media?parent=52113"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/categories?post=52113"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/tags?post=52113"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}