{"id":32723,"date":"2019-10-31T21:48:35","date_gmt":"2019-10-31T18:48:35","guid":{"rendered":"https:\/\/prohoster.info\/blog\/yurij-bushmelev-karta-grablej-na-pole-sbora-i-dostavki-logov-rasshifrovka-doklada\/"},"modified":"2019-10-31T21:48:35","modified_gmt":"2019-10-31T18:48:35","slug":"yurij-bushmelev-karta-grablej-na-pole-sbora-i-dostavki-logov-rasshifrovka-doklada","status":"publish","type":"post","link":"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/yurij-bushmelev-karta-grablej-na-pole-sbora-i-dostavki-logov-rasshifrovka-doklada","title":{"rendered":"Yuri Bushmelev \"Mapa de raking no campo de coleta e entrega de toras\" \u2014 transcri\u00e7\u00e3o da apresenta\u00e7\u00e3o","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Os logs s\u00e3o uma parte importante do sistema, permitindo entender se ele est\u00e1 funcionando (ou n\u00e3o) como esperado. Em uma arquitetura de microsservi\u00e7os, trabalhar com logs se torna uma disciplina separada de uma olimp\u00edada especial. \u00c9 preciso resolver uma s\u00e9rie de quest\u00f5es:<\/p>\n<p><\/p>\n<ul>\n<li>como registrar logs a partir do aplicativo;<\/li>\n<li>onde registrar os logs;<\/li>\n<li>como enviar os logs para armazenamento e processamento;<\/li>\n<li>como processar e armazenar os logs.<\/li>\n<\/ul>\n<p><\/p>\n<p>A aplica\u00e7\u00e3o de tecnologias populares de cont\u00eaineres adiciona mais complexidade ao campo de op\u00e7\u00f5es para resolver o problema.<\/p>\n<p><\/p>\n<p>Isso se refere \u00e0 interpreta\u00e7\u00e3o do relat\u00f3rio de Yuri Bushmelev \"Mapa de armadilhas no campo de coleta e entrega de logs\" <\/p>\n<p>\n<center><div class=\"youtube-placeholder\" data-id=\"NAeedJv-S3I\" onclick=\"loadVideo(this)\">\r\n        <img decoding=\"async\" src=\"https:\/\/img.youtube.com\/vi\/NAeedJv-S3I\/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><\/p>\n<p>Para quem est\u00e1 interessado, convido a continuar lendo.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>Meu nome \u00e9 Yuri Bushmelev. Eu trabalho na Lazada. Hoje, vou falar sobre como criamos nossos logs, como os coletamos e o que registramos neles. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Yuri Bushmelev &quot;Mapa de raking no campo de coleta e entrega de toras&quot; \u2014 transcri\u00e7\u00e3o da apresenta\u00e7\u00e3o\" src=\"\/wp-content\/uploads\/2019\/04\/ece6053b1027ab3681022049ddcd79ea.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>De onde somos? Quem somos n\u00f3s? A Lazada \u00e9 a loja online n\u00ba 1 em seis pa\u00edses do Sudeste Asi\u00e1tico. Todos esses pa\u00edses est\u00e3o distribu\u00eddos por nossos centros de dados. Atualmente, temos 4 centros de dados. Por que isso \u00e9 importante? Porque algumas solu\u00e7\u00f5es foram influenciadas pelo fato de que h\u00e1 uma conex\u00e3o muito fraca entre os centros. Trabalhamos com uma arquitetura de microsservi\u00e7os. Fiquei surpreso ao descobrir que j\u00e1 temos 80 microsservi\u00e7os. Quando comecei a trabalhar na tarefa dos logs, \u00e9ramos apenas 20. Al\u00e9m disso, temos uma por\u00e7\u00e3o consider\u00e1vel de legados em PHP, com os quais tamb\u00e9m precisamos conviver e aceitar. Tudo isso gera, atualmente, mais de 6 milh\u00f5es de mensagens por minuto em todo o sistema. A seguir, mostrarei como tentamos lidar com isso e por que \u00e9 t\u00e3o dif\u00edcil.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Yuri Bushmelev &quot;Mapa de raking no campo de coleta e entrega de toras&quot; \u2014 transcri\u00e7\u00e3o da apresenta\u00e7\u00e3o\" src=\"\/wp-content\/uploads\/2019\/04\/0ba5fcee5064865e836cefd47c40d246.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Precisamos lidar com essas 6 milh\u00f5es de mensagens. O que devemos fazer com elas? 6 milh\u00f5es de mensagens que precisam ser:<\/p>\n<p><\/p>\n<ul>\n<li>enviadas do aplicativo<\/li>\n<li>recebidas para entrega<\/li>\n<li>entregues para an\u00e1lise e armazenamento.<\/li>\n<li>analisadas<\/li>\n<li>armazenadas de alguma forma.<\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Yuri Bushmelev &quot;Mapa de raking no campo de coleta e entrega de toras&quot; \u2014 transcri\u00e7\u00e3o da apresenta\u00e7\u00e3o\" src=\"\/wp-content\/uploads\/2019\/04\/a449062193c4b1757a61f5c92e270a74.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Quando tr\u00eas milh\u00f5es de mensagens apareceram, eu estava com uma express\u00e3o bem parecida. Porque come\u00e7amos com alguns centavos. \u00c9 claro que \u00e9 onde os logs de aplicativos s\u00e3o registrados. Por exemplo, n\u00e3o consegui conectar ao banco de dados, consegui conectar ao banco de dados, mas n\u00e3o consegui ler algo. Mas al\u00e9m disso, cada um dos nossos microservi\u00e7os tamb\u00e9m escreve um log de acesso. Cada solicita\u00e7\u00e3o que chega ao microservi\u00e7o \u00e9 registrada no log. Por que fazemos isso? Os desenvolvedores querem ter a capacidade de rastreamento. Em cada log de acesso, h\u00e1 um campo traceid, pelo qual uma interface especial desenvolve toda a cadeia e mostra o rastreamento de forma organizada. O rastreamento mostra como a solicita\u00e7\u00e3o se desenrolou, e isso ajuda nossos desenvolvedores a lidarem mais rapidamente com qualquer aspecto desconhecido.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Yuri Bushmelev &quot;Mapa de raking no campo de coleta e entrega de toras&quot; \u2014 transcri\u00e7\u00e3o da apresenta\u00e7\u00e3o\" src=\"\/wp-content\/uploads\/2019\/04\/e13a2d37ce57e894d023ad405a2b5200.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Como viver com isso? Agora, eu vou falar brevemente sobre as op\u00e7\u00f5es - como esse problema \u00e9 geralmente resolvido. Como resolver a tarefa de coleta, transmiss\u00e3o e armazenamento de logs. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Yuri Bushmelev &quot;Mapa de raking no campo de coleta e entrega de toras&quot; \u2014 transcri\u00e7\u00e3o da apresenta\u00e7\u00e3o\" src=\"\/wp-content\/uploads\/2019\/04\/60af5e5db804770295741995adb37d90.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Como escrever do aplicativo? \u00c9 claro que existem diferentes maneiras. Em particular, h\u00e1 boas pr\u00e1ticas, como nos contam os especialistas da moda. Existe o old school em duas vers\u00f5es, como os mais velhos costumavam dizer. Existem outras maneiras. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Yuri Bushmelev &quot;Mapa de raking no campo de coleta e entrega de toras&quot; \u2014 transcri\u00e7\u00e3o da apresenta\u00e7\u00e3o\" src=\"\/wp-content\/uploads\/2019\/04\/deab57e4ac0472a8591c0fad9e9f2910.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>A situa\u00e7\u00e3o com a coleta de logs \u00e9 semelhante. As op\u00e7\u00f5es para essa parte espec\u00edfica n\u00e3o s\u00e3o muitas. J\u00e1 existem mais, mas ainda n\u00e3o s\u00e3o tantas. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Yuri Bushmelev &quot;Mapa de raking no campo de coleta e entrega de toras&quot; \u2014 transcri\u00e7\u00e3o da apresenta\u00e7\u00e3o\" src=\"\/wp-content\/uploads\/2019\/04\/8a6004aaeb931332983a975d0fa5c1d6.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Mas com a entrega e a an\u00e1lise subsequente, o n\u00famero de varia\u00e7\u00f5es come\u00e7a a explodir. N\u00e3o vou descrever cada op\u00e7\u00e3o agora. Creio que as principais est\u00e3o na mente de todos que se interessaram pelo assunto.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Yuri Bushmelev &quot;Mapa de raking no campo de coleta e entrega de toras&quot; \u2014 transcri\u00e7\u00e3o da apresenta\u00e7\u00e3o\" src=\"\/wp-content\/uploads\/2019\/04\/6a0b64c7e58bc59f56aaddd27112ec51.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Vou mostrar como fizemos isso na Lazada e como tudo isso come\u00e7ou. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Yuri Bushmelev &quot;Mapa de raking no campo de coleta e entrega de toras&quot; \u2014 transcri\u00e7\u00e3o da apresenta\u00e7\u00e3o\" src=\"\/wp-content\/uploads\/2019\/04\/20f3aa5ceea8b28733ce5399bc30f5b5.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Um ano atr\u00e1s, cheguei \u00e0 Lazada, e fui enviado para um projeto sobre logs. Era mais ou menos assim. O log do aplicativo era escrito em stdout e stderr. Todos seguiram a moda. Mas depois os desenvolvedores o tiraram dos fluxos padr\u00e3o, e depois l\u00e1 os especialistas em infraestrutura resolveriam. Entre os especialistas em infraestrutura e os desenvolvedores, existem tamb\u00e9m os liberadores, que disseram: '\u00ea... tudo bem, vamos simplesmente encapsul\u00e1-los em um arquivo com shell, e tudo'. E como tudo isso estava em um cont\u00eainer, acabaram encapsulando diretamente no pr\u00f3prio cont\u00eainer, mapearam um diret\u00f3rio interno e colocaram isso l\u00e1. Acho que todos entendem mais ou menos o que resultou disso.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Yuri Bushmelev &quot;Mapa de raking no campo de coleta e entrega de toras&quot; \u2014 transcri\u00e7\u00e3o da apresenta\u00e7\u00e3o\" src=\"\/wp-content\/uploads\/2019\/04\/d92e02c18a4c683c9389321e4d5412df.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Vamos dar uma olhada um pouco mais adiante. Como entregamos esses logs. Algu\u00e9m escolheu o td-agent, que na verdade \u00e9 o fluentd, mas n\u00e3o exatamente o fluentd. Eu nunca entendi a rela\u00e7\u00e3o entre esses dois projetos, mas eles parecem tratar da mesma coisa. E este fluentd, escrito em Ruby, lia os arquivos de log, os analisava em JSON usando algumas express\u00f5es regulares. Depois, eles eram enviados para o Kafka. E no Kafka, para cada API, t\u00ednhamos 4 t\u00f3picos separados. Por que 4? Porque h\u00e1 live, h\u00e1 staging, e porque h\u00e1 stdout e stderr. Os desenvolvedores os criam, enquanto os engenheiros de infraestrutura precisam cri\u00e1-los no Kafka. Al\u00e9m disso, o Kafka era controlado por outro departamento. Ent\u00e3o, era necess\u00e1rio criar um ticket para que eles criassem 4 t\u00f3picos para cada API. Todos esqueciam disso. No geral, foi uma confus\u00e3o total. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Yuri Bushmelev &quot;Mapa de raking no campo de coleta e entrega de toras&quot; \u2014 transcri\u00e7\u00e3o da apresenta\u00e7\u00e3o\" src=\"\/wp-content\/uploads\/2019\/04\/3130f9ebfda22713cffacf10db45ca89.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>O que fizemos depois com isso? Enviamos para o Kafka. A partir da\u00ed, metade dos logs ia para o Logstash. A outra metade dos logs se dividia. Uma parte ia para um Graylog, a outra parte \u2013 para outro Graylog. No final, tudo isso ia para um \u00fanico cluster Elasticsearch. Ou seja, toda essa bagun\u00e7a acabava l\u00e1. N\u00e3o se deve fazer assim!<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Yuri Bushmelev &quot;Mapa de raking no campo de coleta e entrega de toras&quot; \u2014 transcri\u00e7\u00e3o da apresenta\u00e7\u00e3o\" src=\"\/wp-content\/uploads\/2019\/04\/98bf4811c102fc12fcd1114c25886b69.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Assim \u00e9 como isso se parece, se olharmos de cima. N\u00e3o se deve fazer assim! Aqui est\u00e3o os pontos problem\u00e1ticos marcados com n\u00fameros. Na verdade, existem mais, mas 6 s\u00e3o realmente problem\u00e1ticos, com os quais precisamos fazer algo. Sobre eles, vou falar separadamente agora. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Yuri Bushmelev &quot;Mapa de raking no campo de coleta e entrega de toras&quot; \u2014 transcri\u00e7\u00e3o da apresenta\u00e7\u00e3o\" src=\"\/wp-content\/uploads\/2019\/04\/69f7682e6677bdda3068d6dea4db7732.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Aqui (1,2,3) temos arquivos sendo escritos e, portanto, aqui est\u00e3o tr\u00eas armadilhas imediatamente. <\/p>\n<p><\/p>\n<p>Primeiro (1) \u2013 precisamos escrev\u00ea-los em algum lugar. Nem sempre queremos dar \u00e0 API a possibilidade de escrever diretamente em um arquivo. Preferencialmente, a API deve estar isolada em um cont\u00eainer, e ainda melhor \u2013 se for read-only. Eu sou um administrador de sistemas, ent\u00e3o tenho uma perspectiva um pouco alternativa sobre essas quest\u00f5es.<\/p>\n<p><\/p>\n<p>O segundo ponto (2,3) \u00e9 que recebemos muitas solicita\u00e7\u00f5es na API. A API grava muitos dados em arquivos. Os arquivos crescem. Precisamos rotacion\u00e1-los. Caso contr\u00e1rio, n\u00e3o haver\u00e1 disco suficiente. Rotacion\u00e1-los \u00e9 complicado, pois s\u00e3o redirecionados via shell para um diret\u00f3rio. N\u00e3o conseguimos rotacion\u00e1-los. N\u00e3o podemos simplesmente pedir ao aplicativo para reabrir os descritores. Caso contr\u00e1rio, os desenvolvedores v\u00e3o olhar para voc\u00ea como se fosse um idiota: \"Quais descritores? N\u00f3s escrevemos no stdout.\" O pessoal da infraestrutura implementou o copytruncate no logrotate, que faz apenas uma c\u00f3pia do arquivo e trunca o original. Portanto, entre esses processos de c\u00f3pia, o espa\u00e7o em disco geralmente acaba.<\/p>\n<p><\/p>\n<p>(4) T\u00ednhamos formatos diferentes em diferentes APIs. Eles eram um pouco distintos, mas era necess\u00e1rio escrever regexps diferentes. Como tudo isso era gerenciado pelo Puppet, havia um grande emaranhado de classes com suas peculiaridades. Al\u00e9m disso, o td-agent na maior parte do tempo poderia consumir muita mem\u00f3ria, travar, ou simplesmente fingir que estava funcionando e n\u00e3o fazer nada. N\u00e3o era poss\u00edvel perceber externamente que ele n\u00e3o estava fazendo nada. No melhor dos casos, ele ca\u00eda e algu\u00e9m o levantava depois. Mais precisamente, um alerta chegava e algu\u00e9m ia manualmente reinici\u00e1-lo. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Yuri Bushmelev &quot;Mapa de raking no campo de coleta e entrega de toras&quot; \u2014 transcri\u00e7\u00e3o da apresenta\u00e7\u00e3o\" src=\"\/wp-content\/uploads\/2019\/04\/424cda2b60e9e5669b7ef2b34ca74e48.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>(6) E a maior bagun\u00e7a foi o elasticsearch. Porque era uma vers\u00e3o antiga. Naquele momento, n\u00e3o tinhamos mestres dedicados. T\u00ednhamos logs heterog\u00eaneos, cujos campos poderiam se sobrepor. Diferentes logs de diferentes aplicativos podiam ser escritos com os mesmos nomes de campo, mas poderiam conter dados diferentes. Ou seja, um log chegava com Integer no campo, por exemplo, level. Outro log chegava com String no campo level. Na aus\u00eancia de um mapeamento est\u00e1tico, isso resultava em um problema not\u00e1vel. Se ap\u00f3s a rota\u00e7\u00e3o do \u00edndice no elasticsearch a primeira mensagem recebida fosse uma string, tudo funcionava normalmente. Mas se a primeira mensagem fosse um Integer, todas as mensagens subsequentes recebidas como String seriam simplesmente descartadas. Porque o tipo de campo n\u00e3o coincide.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Yuri Bushmelev &quot;Mapa de raking no campo de coleta e entrega de toras&quot; \u2014 transcri\u00e7\u00e3o da apresenta\u00e7\u00e3o\" src=\"\/wp-content\/uploads\/2019\/04\/bc869f827bed326792857113191bb028.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Come\u00e7amos a nos fazer essas perguntas. Decidimos n\u00e3o procurar culpados.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Yuri Bushmelev &quot;Mapa de raking no campo de coleta e entrega de toras&quot; \u2014 transcri\u00e7\u00e3o da apresenta\u00e7\u00e3o\" src=\"\/wp-content\/uploads\/2019\/04\/a071a4b38462f249339c988c35463639.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u00c9 necess\u00e1rio fazer algo! Uma coisa \u00f3bvia \u2014 devemos estabelecer padr\u00f5es. Alguns padr\u00f5es j\u00e1 existiam. Alguns foram criados um pouco mais tarde. Felizmente, um formato \u00fanico de logs para todas as APIs j\u00e1 havia sido aprovado at\u00e9 aquele momento. Ele est\u00e1 descrito diretamente nos padr\u00f5es de intera\u00e7\u00e3o dos servi\u00e7os. Assim, aqueles que desejam receber logs devem escrev\u00ea-los nesse formato. Se algu\u00e9m n\u00e3o escreve logs nesse formato, ent\u00e3o, n\u00e3o garantimos nada. <\/p>\n<p><\/p>\n<p>Al\u00e9m disso, gostar\u00edamos de estabelecer um padr\u00e3o \u00fanico para os m\u00e9todos de grava\u00e7\u00e3o, entrega e coleta de logs. Ou seja, onde escrev\u00ea-los e como entreg\u00e1-los. A situa\u00e7\u00e3o ideal \u00e9 quando nos projetos \u00e9 utilizada a mesma biblioteca. Existe uma biblioteca de logging separada para Go, e outra separada para PHP. Todos os que est\u00e3o conosco \u2014 todos devem us\u00e1-las. No momento, eu diria que temos cerca de 80% disso implementado. Mas alguns ainda est\u00e3o comendo cactos.<\/p>\n<p><\/p>\n<p>E \u00e9 l\u00e1 (no slide) que come\u00e7a a emergir lentamente o \"SLA para entrega de logs\". Ele ainda n\u00e3o existe, mas estamos trabalhando nisso. Porque \u00e9 muito conveniente quando a infraestrutura diz que, se voc\u00ea escrever em tal formato em tal lugar e n\u00e3o mais de N mensagens por segundo, ent\u00e3o, temos uma certa probabilidade de entreg\u00e1-las l\u00e1. Isso elimina uma grande dor de cabe\u00e7a. Se o SLA existir, ser\u00e1 simplesmente maravilhoso!<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Yuri Bushmelev &quot;Mapa de raking no campo de coleta e entrega de toras&quot; \u2014 transcri\u00e7\u00e3o da apresenta\u00e7\u00e3o\" src=\"\/wp-content\/uploads\/2019\/04\/a887aceac13135afe90bb5f5a5ec1d26.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Como come\u00e7amos a resolver o problema? A principal dificuldade estava com o td-agent. N\u00e3o estava claro onde nossos logs estavam indo. Eles est\u00e3o sendo entregues? Est\u00e3o sendo coletados? Onde est\u00e3o, afinal? Portanto, o primeiro ponto foi decidir substituir o td-agent. As op\u00e7\u00f5es para substitu\u00ed-lo, de forma resumida, eu esbocei aqui.<\/p>\n<p><\/p>\n<p>Fluentd. Em primeiro lugar, trabalhei com ele no emprego anterior, e ele tamb\u00e9m apresentava quedas peri\u00f3dicas l\u00e1. Em segundo lugar, \u00e9 quase a mesma coisa, s\u00f3 que mais focada. <\/p>\n<p><\/p>\n<p>Filebeat. O que o tornava conveniente para n\u00f3s? O fato de ser escrito em Go, e n\u00f3s temos uma grande expertise em Go. Assim, se necess\u00e1rio, poder\u00edamos adapt\u00e1-lo para nossas necessidades. Portanto, decidimos n\u00e3o adot\u00e1-lo. Para n\u00e3o haver sequer a tenta\u00e7\u00e3o de come\u00e7ar a reescrev\u00ea-lo para n\u00f3s. <\/p>\n<p><\/p>\n<p>A solu\u00e7\u00e3o \u00f3bvia para um administrador de sistemas permanece ser usar v\u00e1rios syslogs em tal quantidade (syslog-ng\/rsyslog\/nxlog).<\/p>\n<p><\/p>\n<p>Ou ent\u00e3o escrever algo pr\u00f3prio, mas descartamos isso, assim como o Filebeat. Se vamos escrever algo, \u00e9 melhor que seja algo \u00fatil para o neg\u00f3cio. Para entrega de logs, \u00e9 melhor optar por algo j\u00e1 pronto.<\/p>\n<p><\/p>\n<p>Portanto, a escolha basicamente se reduziu a escolher entre syslog-ng e rsyslog. Optei pelo rsyslog simplesmente porque j\u00e1 t\u00ednhamos classes para rsyslog no Puppet, e n\u00e3o encontrei uma diferen\u00e7a \u00f3bvia entre eles. Onde diz syslog aqui, diz syslog ali. Sim, a documenta\u00e7\u00e3o de alguns \u00e9 pior, a de outros \u00e9 melhor. Um faz de um jeito, e o outro faz de outro.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Yuri Bushmelev &quot;Mapa de raking no campo de coleta e entrega de toras&quot; \u2014 transcri\u00e7\u00e3o da apresenta\u00e7\u00e3o\" src=\"\/wp-content\/uploads\/2019\/04\/a88116711b547fa5b2b34daf72cc4220.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E um pouco sobre o rsyslog. Primeiro, ele \u00e9 excelente, porque possui muitos m\u00f3dulos. Tem uma linguagem de configura\u00e7\u00e3o intuitiva chamada RainerScript. Um grande b\u00f4nus \u00e9 que conseguimos simular o comportamento do td-agent com ferramentas padr\u00e3o, e para os aplicativos, nada mudou. Ou seja, estamos trocando o td-agent pelo rsyslog, e tudo o mais permanecemos intacto. E instantaneamente obtemos a entrega funcionando. Al\u00e9m disso, o mmnormalize \u00e9 uma ferramenta incr\u00edvel no rsyslog. Ela permite fazer o parsing de logs, mas n\u00e3o usando Grok e regexp. Ela cria uma \u00e1rvore de sintaxe abstrata. Ela faz o parsing dos logs de forma semelhante a como um compilador analisa o c\u00f3digo fonte. Isso permite que funcione muito rapidamente, consuma pouco CPU e, de fato, \u00e9 algo muito legal. H\u00e1 muitos outros b\u00f4nus. N\u00e3o vou entrar em detalhes sobre eles.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Yuri Bushmelev &quot;Mapa de raking no campo de coleta e entrega de toras&quot; \u2014 transcri\u00e7\u00e3o da apresenta\u00e7\u00e3o\" src=\"\/wp-content\/uploads\/2019\/04\/ca811be9f9ff318fb8c8bbf3dc45a038.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>O rsyslog tamb\u00e9m possui v\u00e1rios pontos negativos. Eles s\u00e3o mais ou menos como os b\u00f4nus. Os principais problemas s\u00e3o: \u00e9 necess\u00e1rio saber como configur\u00e1-lo e escolher a vers\u00e3o correta.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Yuri Bushmelev &quot;Mapa de raking no campo de coleta e entrega de toras&quot; \u2014 transcri\u00e7\u00e3o da apresenta\u00e7\u00e3o\" src=\"\/wp-content\/uploads\/2019\/04\/034f588e0834b1d4e4873d9c3dbd0873.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Decidimos que escrever\u00edamos logs em socket unix. E n\u00e3o em \/dev\/log, porque ali temos uma confus\u00e3o de logs do sistema, com o journald nesse pipeline. Portanto, vamos escrever em um socket personalizado. Vamos conect\u00e1-lo a um conjunto de regras separado. N\u00e3o vamos misturar nada. Tudo ser\u00e1 transparente e claro. E foi exatamente isso que fizemos. O diret\u00f3rio com esses sockets \u00e9 padronizado e \u00e9 repassado para todos os containers. Os containers podem ver o socket necess\u00e1rio, abri-lo e escrever nele. <\/p>\n<p><\/p>\n<p>Por que n\u00e3o um arquivo? Porque todos leram <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/badoo\/blog\/280606\/\">o artigo sobre Badushka<\/a><\/noindex>, que tentava redirecionar um arquivo no docker, e descobria-se que, ap\u00f3s o rein\u00edcio do rsyslog, o descritor de arquivo mudava, e o docker perdia esse arquivo. Ele mantinha algo diferente aberto, mas j\u00e1 n\u00e3o era aquele socket para o qual se escreve. Decidimos que ir\u00edamos contornar esse problema e, ao mesmo tempo, evitar o problema do bloqueio.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Yuri Bushmelev &quot;Mapa de raking no campo de coleta e entrega de toras&quot; \u2014 transcri\u00e7\u00e3o da apresenta\u00e7\u00e3o\" src=\"\/wp-content\/uploads\/2019\/04\/78db15581a68ce16d11f5ebe7e6fe04e.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>O rsyslog realiza as a\u00e7\u00f5es indicadas no slide e envia os logs ou para o relay ou para o Kafka. O Kafka corresponde ao m\u00e9todo antigo. O relay \u2014 eu procurei usar exclusivamente o rsyslog para a entrega de logs. Sem Message Queue, utilizando ferramentas padr\u00e3o do rsyslog. Em princ\u00edpio, isso funciona.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Yuri Bushmelev &quot;Mapa de raking no campo de coleta e entrega de toras&quot; \u2014 transcri\u00e7\u00e3o da apresenta\u00e7\u00e3o\" src=\"\/wp-content\/uploads\/2019\/04\/e61a25005ecbdc86d9de3215ee6fb97e.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Mas h\u00e1 detalhes sobre como inseri-los nessa parte (Logstash\/Graylog\/ES). Esta parte (rsyslog-rsyslog) \u00e9 utilizada entre os data centers. Aqui, h\u00e1 um link TCP comprimido, que permite economizar largura de banda e, assim, aumentar a probabilidade de recebemos registros de outro data center em condi\u00e7\u00f5es em que o canal est\u00e1 congestionado. Porque temos a Indon\u00e9sia, onde a situa\u00e7\u00e3o \u00e9 complicada. L\u00e1 \u00e9 um problema constante.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Yuri Bushmelev &quot;Mapa de raking no campo de coleta e entrega de toras&quot; \u2014 transcri\u00e7\u00e3o da apresenta\u00e7\u00e3o\" src=\"\/wp-content\/uploads\/2019\/04\/7509ba360be2db4dec0c8679225d285f.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Come\u00e7amos a pensar em como monitorar a probabilidade de os logs que registramos a partir do aplicativo chegarem ao seu destino. Decidimos estabelecer m\u00e9tricas. O rsyslog tem seu pr\u00f3prio m\u00f3dulo de coleta de estat\u00edsticas, que possui alguns contadores. Por exemplo, pode mostrar o tamanho da fila ou quantas mensagens chegaram em uma determinada a\u00e7\u00e3o. A partir disso, j\u00e1 \u00e9 poss\u00edvel tirar algumas conclus\u00f5es. Al\u00e9m disso, ele possui contadores personalizados que podem ser configurados, e mostrar\u00e1, por exemplo, o n\u00famero de mensagens registradas por alguma API. Em seguida, escrevi o rsyslog_exporter em Python, e enviamos tudo isso para o Prometheus e constru\u00edmos gr\u00e1ficos. As m\u00e9tricas do Graylog eram muito desejadas, mas ainda n\u00e3o conseguimos configur\u00e1-las.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Yuri Bushmelev &quot;Mapa de raking no campo de coleta e entrega de toras&quot; \u2014 transcri\u00e7\u00e3o da apresenta\u00e7\u00e3o\" src=\"\/wp-content\/uploads\/2019\/04\/ef9bd61fc43e056b4a56240c85e7fd20.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Quais problemas surgiram? Surgiram problemas com o fato de que descobrimos (SURPREENDENTEMENTE!) que nossas APIs Live enviam 50 mil mensagens por segundo. Isso apenas das APIs Live, sem contar o staging. E o Graylog nos mostra apenas 12 mil mensagens por segundo. E surgiu a pergunta v\u00e1lida, onde est\u00e3o os restantes? Da\u00ed conclu\u00edmos que o Graylog simplesmente n\u00e3o estava dando conta. Observamos, e realmente, o Graylog com Elasticsearch n\u00e3o dava conta desse fluxo.<\/p>\n<p><\/p>\n<p>Al\u00e9m disso, outras descobertas que fizemos durante o processo.<\/p>\n<p><\/p>\n<p>A grava\u00e7\u00e3o no socket fica bloqueada. Como isso aconteceu? Quando usei o rsyslog para entrega, em algum momento, nosso canal entre os data centers falhou. A entrega parou em um lugar, e parou em outro. Tudo isso chegou \u00e0 m\u00e1quina com a API, que escreve no socket do rsyslog. A fila encheu. Depois, a fila para escrita no unix socket, que por padr\u00e3o \u00e9 de 128 pacotes, tamb\u00e9m encheu. E a pr\u00f3xima write() na aplica\u00e7\u00e3o fica bloqueada. Quando olhamos na biblioteca que usamos nas aplica\u00e7\u00f5es em Go, estava escrito que a grava\u00e7\u00e3o no socket ocorre em modo n\u00e3o bloqueante. Est\u00e1vamos certos de que nada estava bloqueando. Porque n\u00f3s lemos. <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/badoo\/blog\/280606\/\">o artigo sobre Badushka<\/a><\/noindex>, que escreveu sobre isso. Mas h\u00e1 um detalhe. Ao redor dessa chamada havia um ciclo infinito, onde havia constantes tentativas de empurrar a mensagem para o socket. Isso n\u00e3o notamos. Foi necess\u00e1rio reescrever a biblioteca. Desde ent\u00e3o, ela mudou v\u00e1rias vezes, mas agora nos livramos de bloqueios em todos os subsistemas. Portanto, podemos parar o rsyslog, e nada vai cair.<\/p>\n<p><\/p>\n<p>\u00c9 preciso monitorar o tamanho das filas, o que ajuda a evitar esses erros. Primeiro, podemos monitorar quando come\u00e7amos a perder mensagens. Em segundo lugar, podemos monitorar se estamos tendo problemas na entrega.<\/p>\n<p><\/p>\n<p>E mais um ponto desagrad\u00e1vel \u2014 a amplifica\u00e7\u00e3o em 10 vezes na arquitetura de microsservi\u00e7os \u2014 isso \u00e9 muito f\u00e1cil. N\u00e3o temos tantas requisi\u00e7\u00f5es de entrada, mas devido ao grafo pelo qual as mensagens se movem, por causa dos logs de acesso, realmente aumentamos a carga dos logs em cerca de dez vezes. Infelizmente, n\u00e3o consegui contar os n\u00fameros exatos, mas os microsservi\u00e7os s\u00e3o assim. \u00c9 algo a se ter em mente. Atualmente, o subsistema de coleta de logs \u00e9 o mais sobrecarregado na Lazada. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Yuri Bushmelev &quot;Mapa de raking no campo de coleta e entrega de toras&quot; \u2014 transcri\u00e7\u00e3o da apresenta\u00e7\u00e3o\" src=\"\/wp-content\/uploads\/2019\/04\/d76c6d91613ff77c41b8985cee83218f.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Como resolver o problema do elasticsearch? Se voc\u00ea precisa rapidamente obter logs em um s\u00f3 lugar, para n\u00e3o ter que correr por todas as m\u00e1quinas e colet\u00e1-los, use um armazenamento de arquivos. Isso funciona garantidamente. Pode ser feito a partir de qualquer servidor. Basta instalar discos l\u00e1 e configurar o syslog. Depois disso, todos os logs estar\u00e3o garantidamente em um s\u00f3 lugar. A partir da\u00ed, voc\u00ea pode configurar o elasticsearch, graylog ou outra coisa no seu pr\u00f3prio ritmo. Mas voc\u00ea j\u00e1 ter\u00e1 todos os logs e, al\u00e9m disso, poder\u00e1 armazen\u00e1-los conforme a capacidade dos arrays de discos.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Yuri Bushmelev &quot;Mapa de raking no campo de coleta e entrega de toras&quot; \u2014 transcri\u00e7\u00e3o da apresenta\u00e7\u00e3o\" src=\"\/wp-content\/uploads\/2019\/04\/571297f25de76958769f3a4b9bfbf5b9.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>No momento da minha apresenta\u00e7\u00e3o, o esquema ficou assim. Praticamente paramos de escrever em arquivos. Agora, provavelmente, desligaremos os restos. Em m\u00e1quinas locais, onde as APIs est\u00e3o em execu\u00e7\u00e3o, n\u00e3o escreveremos mais em arquivos. Primeiro, h\u00e1 um armazenamento de arquivos que funciona muito bem. Em segundo lugar, nessas m\u00e1quinas, o espa\u00e7o acaba constantemente, \u00e9 preciso monitor\u00e1-lo incessantemente.<\/p>\n<p><\/p>\n<p>Essa parte com Logstash e Graylog realmente est\u00e1 dando dor de cabe\u00e7a. Portanto, precisamos nos livrar dela. \u00c9 necess\u00e1rio escolher uma das duas.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Yuri Bushmelev &quot;Mapa de raking no campo de coleta e entrega de toras&quot; \u2014 transcri\u00e7\u00e3o da apresenta\u00e7\u00e3o\" src=\"\/wp-content\/uploads\/2019\/04\/4a285577708aa1c55c16a72364fa8072.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Decidimos descartar o Logstash e o Kibana. Porque temos um departamento de seguran\u00e7a. Qual \u00e9 a rela\u00e7\u00e3o? A rela\u00e7\u00e3o \u00e9 que o Kibana sem X-Pack e sem Shield n\u00e3o permite delimitar os direitos de acesso aos logs. Portanto, optamos pelo Graylog. Ele n\u00e3o me agrada, mas funciona. Compramos novo hardware, instalamos o Graylog l\u00e1 e transferimos todos os logs com formatos r\u00edgidos para um Graylog separado. Resolvemos o problema com diferentes tipos de campos iguais de maneira organizacional.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Yuri Bushmelev &quot;Mapa de raking no campo de coleta e entrega de toras&quot; \u2014 transcri\u00e7\u00e3o da apresenta\u00e7\u00e3o\" src=\"\/wp-content\/uploads\/2019\/04\/91b9fdada2648ae1caec05169b11926a.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>O que na verdade est\u00e1 inclu\u00eddo no novo Graylog. Simplesmente gravamos tudo no Docker. Pegamos um monte de servidores, implantamos tr\u00eas inst\u00e2ncias do Kafka, 7 servidores Graylog vers\u00e3o 2.3 (porque quer\u00edamos a vers\u00e3o 5 do Elasticsearch). Tudo isso foi levantado em RAID com HDDs. Vimos uma taxa de indexa\u00e7\u00e3o de at\u00e9 100 mil mensagens por segundo. Vimos o n\u00famero que 140 terabytes de dados por semana. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Yuri Bushmelev &quot;Mapa de raking no campo de coleta e entrega de toras&quot; \u2014 transcri\u00e7\u00e3o da apresenta\u00e7\u00e3o\" src=\"\/wp-content\/uploads\/2019\/04\/05f9b3c06739548f092bbe271bf8fc54.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E mais uma vez, desafios! Temos duas vendas se aproximando. N\u00f3s transferimos 6 milh\u00f5es de mensagens. Nosso Graylog n\u00e3o d\u00e1 conta. De alguma forma, precisamos sobreviver novamente. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Yuri Bushmelev &quot;Mapa de raking no campo de coleta e entrega de toras&quot; \u2014 transcri\u00e7\u00e3o da apresenta\u00e7\u00e3o\" src=\"\/wp-content\/uploads\/2019\/04\/424aa2febc2fd903aabee4aeabb64010.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Sobrevivemos assim. Adicionamos mais alguns servidores e SSDs. No momento, estamos operando dessa maneira. Agora estamos processando 160 mil mensagens por segundo. Ainda n\u00e3o atingimos o limite, ent\u00e3o ainda n\u00e3o est\u00e1 claro quanto realmente conseguiremos puxar disso. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Yuri Bushmelev &quot;Mapa de raking no campo de coleta e entrega de toras&quot; \u2014 transcri\u00e7\u00e3o da apresenta\u00e7\u00e3o\" src=\"\/wp-content\/uploads\/2019\/04\/17d84fa7de5403551e55f42345e62a1a.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Aqui est\u00e3o nossos planos para o futuro. Desses, o mais importante, provavelmente, \u00e9 a alta disponibilidade. Neste momento, n\u00e3o a temos. V\u00e1rias m\u00e1quinas configuradas da mesma forma, mas tudo ainda passa por uma s\u00f3 m\u00e1quina. Precisamos gastar tempo para configurar o failover entre elas.<\/p>\n<p><\/p>\n<p>Coletar m\u00e9tricas do Graylog.<\/p>\n<p><\/p>\n<p>Fazer um rate limit para que uma API, enlouquecida, n\u00e3o consuma nossa largura de banda e outras coisas.<\/p>\n<p><\/p>\n<p>E finalmente, assinar algum tipo de SLA com os desenvolvedores, informando que podemos suportar essa quantidade. Se voc\u00eas enviam mais, desculpem.<\/p>\n<p><\/p>\n<p>E escrever documenta\u00e7\u00e3o.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Yuri Bushmelev &quot;Mapa de raking no campo de coleta e entrega de toras&quot; \u2014 transcri\u00e7\u00e3o da apresenta\u00e7\u00e3o\" src=\"\/wp-content\/uploads\/2019\/04\/4a78e2834d5877f8bf17d77a44000c22.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Resumindo, os resultados de tudo o que passamos. Primeiro, padr\u00f5es. Em segundo lugar, syslog \u2013 \u00e9 um prazer. Em terceiro lugar, o rsyslog funciona exatamente como est\u00e1 escrito no slide. E vamos para as perguntas.<\/p>\n<p><\/p>\n<p><strong>Perguntas<\/strong>.<\/p>\n<p><\/p>\n<p><strong>Pergunta<\/strong>: Por que decidiram n\u00e3o usar\u2026 (filebeat?)<\/p>\n<p><\/p>\n<p><strong>Resposta<\/strong>: Precisamos gravar em um arquivo. N\u00e3o queria fazer isso. Quando sua API grava milhares de mensagens por segundo, mesmo que voc\u00ea rotacione uma vez por hora, ainda assim n\u00e3o \u00e9 uma op\u00e7\u00e3o. Pode-se gravar em pipe. Ao que os desenvolvedores me perguntaram: \"E se o processo em que estamos gravando falhar\"? Eu simplesmente n\u00e3o consegui encontrar o que responder e disse: \"Bem, ok, vamos n\u00e3o fazer assim\".<\/p>\n<p><\/p>\n<p><strong>Pergunta<\/strong>: Por que voc\u00ea n\u00e3o escreve logs apenas no HDFS?<\/p>\n<p><\/p>\n<p><strong>Resposta<\/strong>: Este \u00e9 o pr\u00f3ximo passo. Pensamos sobre isso no in\u00edcio, mas, como no momento n\u00e3o temos recursos para trabalhar nisso, permanece como uma solu\u00e7\u00e3o a longo prazo.<\/p>\n<p><\/p>\n<p><strong>Pergunta<\/strong>: O formato em coluna seria mais adequado.<\/p>\n<p><\/p>\n<p><strong>Resposta<\/strong>: Eu entendo tudo. Estamos \"a favor\" com ambas as m\u00e3os. <\/p>\n<p><\/p>\n<p><strong>Pergunta<\/strong>: Voc\u00ea escreve no rsyslog. \u00c9 poss\u00edvel usar tanto TCP quanto UDP. Mas se for UDP, como voc\u00ea garante a entrega?<\/p>\n<p><\/p>\n<p><strong>Resposta<\/strong>: Existem dois pontos. Primeiro, eu sempre digo a todos que n\u00e3o garantimos a entrega dos logs. Porque quando os desenvolvedores v\u00eam e dizem: 'Vamos come\u00e7ar a escrever dados financeiros l\u00e1, e voc\u00ea os armazenar\u00e1 caso algo aconte\u00e7a', n\u00f3s respondemos: '\u00d3timo! Vamos fazer com que voc\u00ea comece a bloquear a grava\u00e7\u00e3o no socket e a fazer isso em transa\u00e7\u00f5es, para garantir que voc\u00ea nos coloque no socket e verifique se recebemos do outro lado.' E nesse momento, a maioria das pessoas logo perde o interesse. E se n\u00e3o h\u00e1 interesse, que perguntas temos? Se voc\u00ea n\u00e3o quer garantir a grava\u00e7\u00e3o no socket, por que n\u00f3s dever\u00edamos garantir a entrega? N\u00f3s fazemos o melhor que podemos. Realmente tentamos entregar o m\u00e1ximo poss\u00edvel e da melhor forma, mas n\u00e3o damos 100% de garantia. Portanto, n\u00e3o escreva dados financeiros l\u00e1. Para isso, temos bancos de dados com transa\u00e7\u00f5es.<\/p>\n<p><\/p>\n<p><strong>Pergunta<\/strong>: Quando a API gera uma mensagem no log e passa o controle para os microsservi\u00e7os, voc\u00ea j\u00e1 encontrou o problema de que mensagens de diferentes microsservi\u00e7os chegam na ordem errada? Isso causa confus\u00e3o.<\/p>\n<p><\/p>\n<p><strong>Resposta<\/strong>: \u00c9 normal que elas cheguem em ordens diferentes. Voc\u00ea precisa estar preparado para isso. Porque qualquer entrega em rede n\u00e3o garante a ordem, ou voc\u00ea precisa gastar recursos especificamente para isso. Se pegarmos sistemas de armazenamento de arquivos, cada API salva logs em seu pr\u00f3prio arquivo. Na verdade, o rsyslog os organiza em diret\u00f3rios. Cada API tem seus pr\u00f3prios logs, onde voc\u00ea pode ir e verificar, e depois, pelo timestamp nesse log, pode correlacion\u00e1-los. Se eles olharem no Graylog, l\u00e1 eles estar\u00e3o ordenados por timestamp. Tudo ser\u00e1 bom.<\/p>\n<p><\/p>\n<p><strong>Pergunta<\/strong>: O timestamp pode diferir em milissegundos.<\/p>\n<p><\/p>\n<p><strong>Resposta<\/strong>: O timestamp \u00e9 gerado pela pr\u00f3pria API. Essa \u00e9, na verdade, toda a quest\u00e3o. Temos NTP. A API gera o timestamp j\u00e1 na pr\u00f3pria mensagem. N\u00e3o \u00e9 o rsyslog que o adiciona.<\/p>\n<p><\/p>\n<p><strong>Pergunta<\/strong>: N\u00e3o est\u00e1 muito claro como ocorre a intera\u00e7\u00e3o entre os data centers. No contexto de um data center, \u00e9 compreens\u00edvel como os logs foram coletados e processados. Como se d\u00e1 a intera\u00e7\u00e3o entre os data centers? Ou cada data center vive sua pr\u00f3pria vida?<\/p>\n<p><\/p>\n<p><strong>Resposta<\/strong>: Quase. Cada pa\u00eds est\u00e1 localizado em um \u00fanico data center. No momento, n\u00e3o temos uma configura\u00e7\u00e3o distribu\u00edda onde um pa\u00eds esteja alocado em diferentes data centers. Portanto, n\u00e3o \u00e9 necess\u00e1rio integr\u00e1-los. Dentro de cada centro, existe um Log Relay. \u00c9 um servidor Rsyslog. Na verdade, s\u00e3o duas m\u00e1quinas de gerenciamento. Elas est\u00e3o configuradas da mesma forma. Mas, por enquanto, o tr\u00e1fego est\u00e1 passando por apenas uma delas. Ela agrega todos os logs. Possui uma fila em disco para precau\u00e7\u00f5es. Ela comprime os logs e os envia para o data center central (em Singapura), de onde s\u00e3o enviados para o Graylog. E em cada data center h\u00e1 seu pr\u00f3prio armazenamento de arquivos. Caso ocorra uma perda de conex\u00e3o, ainda temos todos os logs l\u00e1. Eles permanecer\u00e3o l\u00e1. Eles ser\u00e3o salvos.<\/p>\n<p><\/p>\n<p><strong>Pergunta<\/strong>: Em situa\u00e7\u00f5es incomuns, voc\u00ea recebe logs de l\u00e1?<\/p>\n<p><\/p>\n<p><strong>Resposta<\/strong>: \u00c9 poss\u00edvel ir at\u00e9 l\u00e1 (no armazenamento de arquivos) e verificar.<\/p>\n<p><\/p>\n<p><strong>Pergunta<\/strong>: Como voc\u00eas monitoram para garantir que n\u00e3o est\u00e3o perdendo logs?<\/p>\n<p><\/p>\n<p><strong>Resposta<\/strong>: Na verdade, n\u00f3s os perdemos, e estamos monitorando isso. Iniciamos o monitoramento h\u00e1 um m\u00eas. Na biblioteca utilizada pelo Go API, h\u00e1 m\u00e9tricas. Ela consegue contar quantas vezes n\u00e3o conseguiu gravar no socket. Atualmente, existe uma heur\u00edstica inteligente. H\u00e1 um buffer. Ele tenta gravar a mensagem no socket a partir dele. Se o buffer ficar cheio, ele come\u00e7a a descartar mensagens. E conta quantas ele descartou. Se os contadores come\u00e7arem a se encher, ficamos sabendo. Os dados chegam tamb\u00e9m ao Prometheus, e os gr\u00e1ficos podem ser visualizados no Grafana. \u00c9 poss\u00edvel configurar alertas. Mas, por enquanto, n\u00e3o est\u00e1 claro para quem envi\u00e1-los.<\/p>\n<p><\/p>\n<p><strong>Pergunta<\/strong>: No Elasticsearch, voc\u00eas armazenam logs com redund\u00e2ncia. Quantas r\u00e9plicas voc\u00eas t\u00eam?<\/p>\n<p><\/p>\n<p><strong>Resposta<\/strong>: Uma r\u00e9plica.<\/p>\n<p><\/p>\n<p><strong>Pergunta<\/strong>: Isso \u00e9 apenas uma r\u00e9plica?<\/p>\n<p><\/p>\n<p><strong>Resposta<\/strong>: \u00c9 um mestre e uma r\u00e9plica. Os dados s\u00e3o armazenados em duas inst\u00e2ncias.<\/p>\n<p><\/p>\n<p><strong>Pergunta<\/strong>: Voc\u00ea fez algum ajuste no tamanho do buffer do rsyslog? <\/p>\n<p><\/p>\n<p><strong>Resposta<\/strong>: Escrevemos datagramas em um socket unix personalizado. Isso imediatamente nos imp\u00f5e um limite de 128 kilobytes. N\u00e3o podemos escrever mais do que isso. Estipulamos isso no padr\u00e3o. Quem quiser entrar nos storages deve escrever 128 kilobytes. As bibliotecas, por sua vez, truncam e marcam a mensagem como truncada. Nosso padr\u00e3o de mensagem possui um campo especial que indica se foi truncada durante a grava\u00e7\u00e3o ou n\u00e3o. Assim, temos a oportunidade de rastrear esse aspecto.<\/p>\n<p><\/p>\n<p><strong>Pergunta<\/strong>: Voc\u00ea est\u00e1 escrevendo JSON corrompido? <\/p>\n<p><\/p>\n<p><strong>Resposta<\/strong>: JSON corrompido ser\u00e1 descartado durante o relay, porque \u00e9 um pacote muito grande. Ou ser\u00e1 descartado pelo Graylog, pois n\u00e3o poder\u00e1 fazer o parsing do JSON. Mas existem nuances que precisam ser corrigidas, e a maior parte delas est\u00e1 relacionada ao rsyslog. J\u00e1 abri algumas issues l\u00e1 que ainda precisam de trabalho.<\/p>\n<p><\/p>\n<p><strong>Pergunta<\/strong>: Por que Kafka? Voc\u00ea j\u00e1 experimentou o RabbitMQ? O Graylog n\u00e3o se ajusta a essas cargas?<\/p>\n<p><\/p>\n<p><strong>Resposta<\/strong>: N\u00e3o conseguimos nos conectar com o Graylog. Mas o Graylog funciona para n\u00f3s. \u00c9 realmente problem\u00e1tico. \u00c9 uma coisa peculiar. E, na verdade, n\u00e3o \u00e9 necess\u00e1rio. Eu preferiria escrever diretamente do rsyslog para o Elasticsearch e depois visualizar no Kibana. Mas precisamos resolver essa quest\u00e3o com os seguran\u00e7as. Essa \u00e9 uma poss\u00edvel dire\u00e7\u00e3o para nosso desenvolvimento, quando descartaremos o Graylog e utilizaremos o Kibana. N\u00e3o faria sentido usar o Logstash. Porque eu posso fazer tudo isso com o rsyslog. E ele possui um m\u00f3dulo para grava\u00e7\u00e3o no Elasticsearch. Estamos tentando conviver com o Graylog. At\u00e9 fizemos algumas melhorias. Mas ainda h\u00e1 espa\u00e7o para melhorias.<\/p>\n<p><\/p>\n<p>Sobre o Kafka. Assim aconteceu historicamente. Quando cheguei, j\u00e1 existia e j\u00e1 eram registrados logs nele. N\u00f3s apenas configuramos nosso cluster e transferimos os logs para l\u00e1. N\u00f3s o gerenciamos, sabemos como ele est\u00e1. Sobre o RabbitMQ... n\u00e3o estamos indo bem com o RabbitMQ. Mas temos o RabbitMQ funcionando. Ele est\u00e1 em produ\u00e7\u00e3o e tivemos problemas com ele. Agora, antes da liquida\u00e7\u00e3o, ele foi ajustado e come\u00e7ou a funcionar bem. Mas antes disso, eu n\u00e3o estava pronto para coloc\u00e1-lo em produ\u00e7\u00e3o. H\u00e1 ainda outro ponto. O Graylog consegue ler a vers\u00e3o AMQP 0.9, enquanto o rsyslog consegue escrever na vers\u00e3o AMQP 1.0. E n\u00e3o h\u00e1 uma \u00fanica solu\u00e7\u00e3o que consiga fazer as duas coisas. H\u00e1 ou uma coisa ou outra. Portanto, por enquanto, fica somente com Kafka. Mas isso tamb\u00e9m tem suas nuances. Porque o omkafka, na vers\u00e3o do rsyslog que estamos usando, pode perder todo o buffer de mensagens que ele retirou do rsyslog. Por enquanto, estamos lidando com isso. <\/p>\n<p><\/p>\n<p><strong>Pergunta<\/strong>: Voc\u00ea usa o Kafka porque ele j\u00e1 estava a\u00ed? N\u00e3o \u00e9 usado para mais nada?<\/p>\n<p><\/p>\n<p><strong>Resposta<\/strong>: O Kafka que existia \u00e9 usado pela equipe de Data Science. \u00c9 um projeto completamente separado, sobre o qual, infelizmente, n\u00e3o posso dizer nada. N\u00e3o estou a par. Ele estava sob a responsabilidade da equipe de Data Science. Quando foram registrados os logs, decidiram utiliz\u00e1-lo para n\u00e3o precisar instalar o seu pr\u00f3prio. Agora, atualizamos o Graylog e perdemos a compatibilidade, porque h\u00e1 uma vers\u00e3o antiga do Kafka. Precisamos configurar o nosso pr\u00f3prio. De quebra, nos livramos desses quatro t\u00f3picos por cada API. Fizemos um t\u00f3pico amplo para todos os ambientes de produ\u00e7\u00e3o, um outro t\u00f3pico amplo para todos os ambientes de testes e apenas jogamos tudo l\u00e1. O Graylog extrai tudo isso em paralelo.<\/p>\n<p><\/p>\n<p><strong>Pergunta<\/strong>: Por que essa malandragem com os sockets? Voc\u00eas tentaram usar o driver de log syslog para cont\u00eaineres?<\/p>\n<p><\/p>\n<p><strong>Resposta<\/strong>: Na \u00e9poca em que est\u00e1vamos lidando com essa quest\u00e3o, nosso relacionamento com o Docker era tenso. Era o Docker 1.0 ou 0.9. O Docker em si era peculiar. Em segundo lugar, se voc\u00ea ainda tentar inserir logs nele... Tenho uma suspeita n\u00e3o confirmada de que ele passa todos os logs por ele mesmo, atrav\u00e9s do daemon do Docker. Se uma API entra em pane, as outras APIs ficam travadas porque n\u00e3o conseguem enviar stdout e stderr. N\u00e3o sei a que isso levar\u00e1. Tenho uma suspeita intuitiva de que n\u00e3o devemos usar o driver syslog do Docker neste ponto. Nosso departamento de testes funcionais tem seu pr\u00f3prio cluster Graylog com logs. Eles usam os drivers de log do Docker e parece que est\u00e1 tudo funcionando bem. Mas eles escrevem diretamente em Graylog usando GELF. Quando come\u00e7amos tudo isso, precis\u00e1vamos que funcionasse. Pode ser que mais tarde, quando algu\u00e9m disser que j\u00e1 est\u00e1 funcionando bem h\u00e1 muito tempo, possamos tentar de novo.<\/p>\n<p><\/p>\n<p><strong>Pergunta<\/strong>: Voc\u00eas fazem a entrega entre data centers usando rsyslog. Por que n\u00e3o usar Kafka?<\/p>\n<p><\/p>\n<p><strong>Resposta<\/strong>: Estamos fazendo os dois, na verdade, por duas raz\u00f5es. Se a conex\u00e3o estiver completamente ruim, todos os nossos logs, mesmo compactados, n\u00e3o conseguem passar. E o Kafka permite que eles sejam simplesmente descartados durante o processo. Dessa forma, evitemos o entupimento desses logs. Usamos o Kafka diretamente nesse caso. Se nossa conex\u00e3o estiver boa e quisermos liber\u00e1-la, usamos o rsyslog. Mas na verdade podemos configur\u00e1-lo para que ele mesmo descarte o que n\u00e3o passou. Neste momento, usamos a entrega do rsyslog diretamente em alguns lugares e o Kafka em outros.<\/p>\n<p>Fonte: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/450098\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041b\u043e\u0433\u0438 \u2014 \u0432\u0430\u0436\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0441\u0438\u0441\u0442\u0435\u043c\u044b, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0430\u044f \u043f\u043e\u043d\u044f\u0442\u044c, \u0447\u0442\u043e \u043e\u043d\u0430 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 (\u043b\u0438\u0431\u043e \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442), \u043a\u0430\u043a \u043e\u0436\u0438\u0434\u0430\u0435\u0442\u0441\u044f. \u0412 \u0443\u0441\u043b\u043e\u0432\u0438\u044f\u0445 \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u043d\u043e\u0439 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b \u0440\u0430\u0431\u043e\u0442\u0430 \u0441 \u043b\u043e\u0433\u0430\u043c\u0438 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0439 \u0434\u0438\u0441\u0446\u0438\u043f\u043b\u0438\u043d\u043e\u0439 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u043e\u043b\u0438\u043c\u043f\u0438\u0430\u0434\u044b. \u041d\u0443\u0436\u043d\u043e \u0440\u0435\u0448\u0438\u0442\u044c \u0441\u0440\u0430\u0437\u0443 \u043a\u0443\u0447\u0443 \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u0432: \u043a\u0430\u043a \u043f\u0438\u0441\u0430\u0442\u044c \u043b\u043e\u0433\u0438 \u0438\u0437 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f; \u043a\u0443\u0434\u0430 \u043f\u0438\u0441\u0430\u0442\u044c \u043b\u043e\u0433\u0438; \u043a\u0430\u043a \u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u043b\u043e\u0433\u0438 \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438; \u043a\u0430\u043a \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0438 \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043b\u043e\u0433\u0438. \u041f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0445 \u043d\u044b\u043d\u0435 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":24507,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-32723","post","type-post","status-publish","format-standard","has-post-thumbnail","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=\"\u041b\u043e\u0433\u0438 \u2014 \u0432\u0430\u0436\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0441\u0438\u0441\u0442\u0435\u043c\u044b, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0430\u044f \u043f\u043e\u043d\u044f\u0442\u044c, \u0447\u0442\u043e \u043e\u043d\u0430 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 (\u043b\u0438\u0431\u043e \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442), \u043a\u0430\u043a \u043e\u0436\u0438\u0434\u0430\u0435\u0442\u0441\u044f. \u0412 \u0443\u0441\u043b\u043e\u0432\u0438\u044f\u0445 \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u043d\u043e\u0439 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b \u0440\u0430\u0431\u043e\u0442\u0430 \u0441 \u043b\u043e\u0433\u0430\u043c\u0438 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0439 \u0434\u0438\u0441\u0446\u0438\u043f\u043b\u0438\u043d\u043e\u0439 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u043e\u043b\u0438\u043c\u043f\u0438\u0430\u0434\u044b.\" \/>\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\/yurij-bushmelev-karta-grablej-na-pole-sbora-i-dostavki-logov-rasshifrovka-doklada\" \/>\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\udd47\u042e\u0440\u0438\u0439 \u0411\u0443\u0448\u043c\u0435\u043b\u0435\u0432 \u00ab\u041a\u0430\u0440\u0442\u0430 \u0433\u0440\u0430\u0431\u043b\u0435\u0439 \u043d\u0430 \u043f\u043e\u043b\u0435 \u0441\u0431\u043e\u0440\u0430 \u0438 \u0434\u043e\u0441\u0442\u0430\u0432\u043a\u0438 \u043b\u043e\u0433\u043e\u0432\u00bb \u2014 \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u043a\u0430 \u0434\u043e\u043a\u043b\u0430\u0434\u0430 | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041b\u043e\u0433\u0438 \u2014 \u0432\u0430\u0436\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0441\u0438\u0441\u0442\u0435\u043c\u044b, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0430\u044f \u043f\u043e\u043d\u044f\u0442\u044c, \u0447\u0442\u043e \u043e\u043d\u0430 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 (\u043b\u0438\u0431\u043e \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442), \u043a\u0430\u043a \u043e\u0436\u0438\u0434\u0430\u0435\u0442\u0441\u044f. \u0412 \u0443\u0441\u043b\u043e\u0432\u0438\u044f\u0445 \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u043d\u043e\u0439 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b \u0440\u0430\u0431\u043e\u0442\u0430 \u0441 \u043b\u043e\u0433\u0430\u043c\u0438 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0439 \u0434\u0438\u0441\u0446\u0438\u043f\u043b\u0438\u043d\u043e\u0439 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u043e\u043b\u0438\u043c\u043f\u0438\u0430\u0434\u044b.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/yurij-bushmelev-karta-grablej-na-pole-sbora-i-dostavki-logov-rasshifrovka-doklada\" \/>\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-31T18:48:35+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T18:48:35+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\udd47Yuri Bushmelev \"Mapa de problemas no campo de coleta e entrega de logs\" \u2014 transcri\u00e7\u00e3o da apresenta\u00e7\u00e3o | ProHoster","description":"Os logs s\u00e3o uma parte importante do sistema, permitindo entender se ele est\u00e1 funcionando (ou n\u00e3o) como esperado. Em uma arquitetura de microsservi\u00e7os, trabalhar com logs se torna uma disciplina pr\u00f3pria, como se fosse uma olimp\u00edada especial.","canonical_url":"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/yurij-bushmelev-karta-grablej-na-pole-sbora-i-dostavki-logov-rasshifrovka-doklada","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\udd47\u042e\u0440\u0438\u0439 \u0411\u0443\u0448\u043c\u0435\u043b\u0435\u0432 \u00ab\u041a\u0430\u0440\u0442\u0430 \u0433\u0440\u0430\u0431\u043b\u0435\u0439 \u043d\u0430 \u043f\u043e\u043b\u0435 \u0441\u0431\u043e\u0440\u0430 \u0438 \u0434\u043e\u0441\u0442\u0430\u0432\u043a\u0438 \u043b\u043e\u0433\u043e\u0432\u00bb \u2014 \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u043a\u0430 \u0434\u043e\u043a\u043b\u0430\u0434\u0430 | ProHoster","og:description":"\u041b\u043e\u0433\u0438 \u2014 \u0432\u0430\u0436\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0441\u0438\u0441\u0442\u0435\u043c\u044b, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0430\u044f \u043f\u043e\u043d\u044f\u0442\u044c, \u0447\u0442\u043e \u043e\u043d\u0430 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 (\u043b\u0438\u0431\u043e \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442), \u043a\u0430\u043a \u043e\u0436\u0438\u0434\u0430\u0435\u0442\u0441\u044f. \u0412 \u0443\u0441\u043b\u043e\u0432\u0438\u044f\u0445 \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u043d\u043e\u0439 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b \u0440\u0430\u0431\u043e\u0442\u0430 \u0441 \u043b\u043e\u0433\u0430\u043c\u0438 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0439 \u0434\u0438\u0441\u0446\u0438\u043f\u043b\u0438\u043d\u043e\u0439 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u043e\u043b\u0438\u043c\u043f\u0438\u0430\u0434\u044b.","og:url":"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/yurij-bushmelev-karta-grablej-na-pole-sbora-i-dostavki-logov-rasshifrovka-doklada","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-31T18:48:35+00:00","article:modified_time":"2019-10-31T18:48:35+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"32723","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-21 12:16:55","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 02:53:25","updated":"2026-01-21 12:16:55","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\/32723","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=32723"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts\/32723\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/media\/24507"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/media?parent=32723"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/categories?post=32723"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/tags?post=32723"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}