{"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\/it\/blog\/administrirovanie\/yurij-bushmelev-karta-grablej-na-pole-sbora-i-dostavki-logov-rasshifrovka-doklada","title":{"rendered":"Yuri Bushmelev 'Mappa dei problemi sul campo di raccolta e consegna dei log' \u2014 trascrizione della relazione","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>I log e un'importante parte del sistema, che permette di capire se funziona (o non funziona) come previsto. In un'architettura a microservizi, la gestione dei log diventa una disciplina a s\u00e9 stante. \u00c8 necessario affrontare una serie di quesiti:<\/p>\n<p><\/p>\n<ul>\n<li>come scrivere i log dall'applicazione;<\/li>\n<li>dove scrivere i log;<\/li>\n<li>come inviare i log per la conservazione e l'elaborazione;<\/li>\n<li>come elaborare e conservare i log.<\/li>\n<\/ul>\n<p><\/p>\n<p>L'uso di tecnologie di containerizzazione popolari aggiunge ulteriori complessit\u00e0 alla gi\u00e0 complessa questione della gestione dei log.<\/p>\n<p><\/p>\n<p>Proprio su questo si basa la relazione di Yuri Bushmelev \"Mappa delle insidie nel campo della raccolta e consegna dei log\" <\/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=\"Riproduci video\" 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>Chi \u00e8 interessato, prosegua oltre.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>Mi chiamo Yuri Bushmelev. Lavoro in Lazada. Oggi parler\u00f2 di come gestiamo i nostri log, come li raccogliamo e cosa ci scriviamo. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Yuri Bushmelev &#039;Mappa dei problemi sul campo di raccolta e consegna dei log&#039; \u2014 trascrizione della relazione\" src=\"\/wp-content\/uploads\/2019\/04\/ece6053b1027ab3681022049ddcd79ea.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Da dove veniamo? Chi siamo? Lazada \u00e8 il numero 1 degli e-commerce in sei paesi del Sud-Est asiatico. Tutti questi paesi sono distribuiti tra diversi data center. Al momento abbiamo 4 data center. Perch\u00e9 \u00e8 importante? Perch\u00e9 alcune soluzioni sono state dettate dalla debole connessione tra i centri. Abbiamo un'architettura a microservizi. Sono rimasto sorpreso di scoprire che abbiamo gi\u00e0 80 microservizi. Quando ho iniziato a lavorare sulla gestione dei log, erano solo 20. Inoltre, c'\u00e8 un considerevole pezzo di legacy PHP con cui dobbiamo convivere. Tutto ci\u00f2 genera attualmente oltre 6 milioni di messaggi al minuto nel sistema complessivo. Ora mostrer\u00f2 come gestiamo tutto questo e perch\u00e9 \u00e8 cos\u00ec.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Yuri Bushmelev &#039;Mappa dei problemi sul campo di raccolta e consegna dei log&#039; \u2014 trascrizione della relazione\" src=\"\/wp-content\/uploads\/2019\/04\/0ba5fcee5064865e836cefd47c40d246.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Dobbiamo in qualche modo convivere con questi 6 milioni di messaggi. Cosa dobbiamo fare con loro? 6 milioni di messaggi che dobbiamo:<\/p>\n<p><\/p>\n<ul>\n<li>inviare dall'applicazione<\/li>\n<li>ricevere per la consegna<\/li>\n<li>consegnare per analisi e conservazione.<\/li>\n<li>analizzare<\/li>\n<li>deve essere conservato in qualche modo.<\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Yuri Bushmelev &#039;Mappa dei problemi sul campo di raccolta e consegna dei log&#039; \u2014 trascrizione della relazione\" src=\"\/wp-content\/uploads\/2019\/04\/a449062193c4b1757a61f5c92e270a74.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Quando sono apparsi tre milioni di messaggi, il mio aspetto era pi\u00f9 o meno lo stesso. Anche perch\u00e9 eravamo partiti da piccole cifre. \u00c8 chiaro che nei log dell'applicazione ci sono scritti messaggi come \"impossibile connettersi al database\" o \"connessione riuscita, ma impossibile leggere qualcosa\". Oltre a questo, ciascun nostro microservizio registra anche un access log. Ogni richiesta che arriva a un microservizio viene registrata nel log. Perch\u00e9 lo facciamo? I programmatori vogliono avere la possibilit\u00e0 di tracciare. In ogni access log c'\u00e8 un campo traceid, che permette a un'interfaccia speciale di seguire l'intera catena e mostrare il tracciamento in modo chiaro. Il tracciamento mostra come \u00e8 passata la richiesta, e questo aiuta i nostri sviluppatori a risolvere pi\u00f9 rapidamente eventuali problemi non identificati.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Yuri Bushmelev &#039;Mappa dei problemi sul campo di raccolta e consegna dei log&#039; \u2014 trascrizione della relazione\" src=\"\/wp-content\/uploads\/2019\/04\/e13a2d37ce57e894d023ad405a2b5200.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Come vivere con tutto ci\u00f2? Ora vi parler\u00f2 brevemente delle soluzioni disponibili per risolvere il problema della raccolta, trasmissione e conservazione dei log. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Yuri Bushmelev &#039;Mappa dei problemi sul campo di raccolta e consegna dei log&#039; \u2014 trascrizione della relazione\" src=\"\/wp-content\/uploads\/2019\/04\/60af5e5db804770295741995adb37d90.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Come scrivere dall'applicazione? \u00c8 chiaro che ci sono diversi modi. In particolare, ci sono le best practice raccomandate dai guru del settore. Esiste l'approccio vecchia scuola in due varianti, come raccontano i nonni. Ci sono anche altri modi. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Yuri Bushmelev &#039;Mappa dei problemi sul campo di raccolta e consegna dei log&#039; \u2014 trascrizione della relazione\" src=\"\/wp-content\/uploads\/2019\/04\/deab57e4ac0472a8591c0fad9e9f2910.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>La situazione \u00e8 simile anche per la raccolta dei log. Non ci sono molte soluzioni specifiche per questa parte, gi\u00e0 ci sono pi\u00f9 opzioni, ma non tantissime. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Yuri Bushmelev &#039;Mappa dei problemi sul campo di raccolta e consegna dei log&#039; \u2014 trascrizione della relazione\" src=\"\/wp-content\/uploads\/2019\/04\/8a6004aaeb931332983a975d0fa5c1d6.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Per quanto riguarda la consegna e l'analisi successiva, il numero di varianti inizia ad esplodere. Non descriver\u00f2 ogni opzione ora. Penso che le principali siano note a tutti coloro che sono interessati all'argomento.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Yuri Bushmelev &#039;Mappa dei problemi sul campo di raccolta e consegna dei log&#039; \u2014 trascrizione della relazione\" src=\"\/wp-content\/uploads\/2019\/04\/6a0b64c7e58bc59f56aaddd27112ec51.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Mostrer\u00f2 come abbiamo fatto in Lazada e come \u00e8 iniziato tutto questo. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Yuri Bushmelev &#039;Mappa dei problemi sul campo di raccolta e consegna dei log&#039; \u2014 trascrizione della relazione\" src=\"\/wp-content\/uploads\/2019\/04\/20f3aa5ceea8b28733ce5399bc30f5b5.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Un anno fa sono arrivato in Lazada e mi hanno assegnato a un progetto sui log. Era circa cos\u00ec. Il log dall'applicazione veniva scritto in stdout e stderr. Tutti hanno fatto tutto secondo le ultime mode. Ma poi gli sviluppatori lo hanno rimosso dai flussi standard e hanno lasciato che i professionisti dell'infrastruttura si occupassero del resto. Tra i professionisti dell'infrastruttura e gli sviluppatori ci sono anche i responsabili delle release, che hanno detto: \"eh... ok, semplicemente avvolgiamoli in un file usando lo shell, e basta\". Poich\u00e9 il tutto era in un container, l'hanno avvolto direttamente all'interno del container, mappando la directory all'interno e ponendovi questi log. Credo che sia chiaro a tutti cosa ne sia uscito.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Yuri Bushmelev &#039;Mappa dei problemi sul campo di raccolta e consegna dei log&#039; \u2014 trascrizione della relazione\" src=\"\/wp-content\/uploads\/2019\/04\/d92e02c18a4c683c9389321e4d5412df.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Guardiamo ora pi\u00f9 da vicino come consegnavamo questi log. Qualcuno ha scelto td-agent, che in realt\u00e0 \u00e8 fluentd, ma non propriamente fluentd. Non ho mai capito bene il rapporto tra questi due progetti, ma sembrano riguardare la stessa cosa. Questo fluentd, scritto in Ruby, leggevano i file di log, li analizzava in JSON utilizzando alcune espressioni regolari. Poi li inviava a Kafka. Inoltre, in Kafka avevamo 4 topic separati per ciascuna API. Perch\u00e9 4? Perch\u00e9 ci sono l'ambiente di produzione, quello di staging, e perch\u00e9 ci sono stdout e stderr. Gli sviluppatori li generano, mentre i professionisti dell'infrastruttura devono crearli in Kafka. Inoltre, Kafka era controllata da un altro dipartimento. Quindi, era necessario creare un ticket affinch\u00e9 creassero 4 topic per ciascuna API. Tutti dimenticavano questa cosa. Insomma, era un disastro totale. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Yuri Bushmelev &#039;Mappa dei problemi sul campo di raccolta e consegna dei log&#039; \u2014 trascrizione della relazione\" src=\"\/wp-content\/uploads\/2019\/04\/3130f9ebfda22713cffacf10db45ca89.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Cosa abbiamo fatto dopo? Lo abbiamo inviato a Kafka. Poi met\u00e0 dei log andava a Logstash. L'altra met\u00e0 veniva distribuita. Parte andava in un Graylog, parte in un altro Graylog. Alla fine, tutto questo finiva in un unico cluster Elasticsearch. Quindi, tutto questo disordine finiva l\u00ec. Non si dovrebbe fare cos\u00ec!<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Yuri Bushmelev &#039;Mappa dei problemi sul campo di raccolta e consegna dei log&#039; \u2014 trascrizione della relazione\" src=\"\/wp-content\/uploads\/2019\/04\/98bf4811c102fc12fcd1114c25886b69.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ecco come appare, se lo guardiamo dall'alto. Non si dovrebbe fare cos\u00ec! Qui sono gi\u00e0 contrassegnati con dei numeri i punti critici. Ce ne sono in realt\u00e0 di pi\u00f9, ma 6 sono proprio i pi\u00f9 problematici, con cui bisogna fare qualcosa. Di questi parler\u00f2 separatamente. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Yuri Bushmelev &#039;Mappa dei problemi sul campo di raccolta e consegna dei log&#039; \u2014 trascrizione della relazione\" src=\"\/wp-content\/uploads\/2019\/04\/69f7682e6677bdda3068d6dea4db7732.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Qui (1,2,3 scriviamo i file e, di conseguenza, qui abbiamo subito tre difficolt\u00e0. <\/p>\n<p><\/p>\n<p>Primo (1) \u2014 dobbiamo scriverli da qualche parte. Non sempre vorremmo dare all'API la possibilit\u00e0 di scrivere direttamente nei file. \u00c8 preferibile che l'API sia isolata in un container, e ancor meglio se sia in sola lettura. Io sono un sysadmin, quindi ho una visione un po' alternativa su queste cose.<\/p>\n<p><\/p>\n<p>Secondo punto (2,3) \u2014 riceviamo molte richieste nell'API. L'API scrive molti dati nei file. I file crescono. Dobbiamo ruotarli. Perch\u00e9 altrimenti non avrai mai spazio su disco. La rotazione \u00e8 problematica perch\u00e9 sono gestiti tramite un redirect della shell in una directory. Non riusciamo a ruotare. Non possiamo dire all'applicazione di riaprire i descrittori. Perch\u00e9 gli sviluppatori ti guarderanno come un idiota: \"Quali descrittori? Noi scriviamo solo in stdout\". Gli infrastruttori hanno fatto un copytruncate in logrotate, che semplicemente copia il file e tronca l'originale. Di conseguenza, tra questi processi di copia, di solito, finisce lo spazio sul disco.<\/p>\n<p><\/p>\n<p>(4) Avevamo diversi formati in diverse API. Si differenziavano leggermente, ma dovevamo scrivere regex diverse. Poich\u00e9 tutto era gestito da Puppet, c'era una grande rete di classi con le loro complicazioni. Inoltre, td-agent per la maggior parte del tempo poteva consumare memoria, rallentare e semplicemente fare finta di lavorare senza fare nulla. Capire dall'esterno che non stava facendo nulla era impossibile. Nel migliore dei casi, si bloccava e qualcuno doveva farlo ripartire. O meglio, arrivava un alert, e qualcuno andava a riavviarlo manualmente. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Yuri Bushmelev &#039;Mappa dei problemi sul campo di raccolta e consegna dei log&#039; \u2014 trascrizione della relazione\" src=\"\/wp-content\/uploads\/2019\/04\/424cda2b60e9e5669b7ef2b34ca74e48.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>(6) E il peggior problema era Elasticsearch. Perch\u00e9 era una versione vecchia. Perch\u00e9 non avevamo maestri dedicati a quel momento. Avevamo log eterogenei, nei quali i campi potevano sovrapporsi. Log diversi di diverse applicazioni potevano avere nomi di campo identici, ma con dati diversi all'interno. Quindi, un log arriva con un Integer nel campo, ad esempio, level. Un altro log arriva con una String nel campo level. In assenza di una mappatura statica, otteniamo questa situazione notevole. Se dopo la rotazione dell'indice in Elasticsearch primo arriva un messaggio con una stringa, allora va tutto bene. Ma se primo arriva un Integer, tutti i messaggi successivi che sono arrivati come String vengono semplicemente scartati. Perch\u00e9 non corrisponde al tipo di campo.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Yuri Bushmelev &#039;Mappa dei problemi sul campo di raccolta e consegna dei log&#039; \u2014 trascrizione della relazione\" src=\"\/wp-content\/uploads\/2019\/04\/bc869f827bed326792857113191bb028.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Abbiamo iniziato a porci queste domande. Abbiamo deciso di non cercare colpevoli.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Yuri Bushmelev &#039;Mappa dei problemi sul campo di raccolta e consegna dei log&#039; \u2014 trascrizione della relazione\" src=\"\/wp-content\/uploads\/2019\/04\/a071a4b38462f249339c988c35463639.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ma qualcosa deve essere fatto! \u00c8 ovvio che dobbiamo stabilire degli standard. Alcuni standard erano gi\u00e0 in atto. Alcuni li abbiamo stabiliti pi\u00f9 tardi. Fortunatamente, un formato unico per i log di tutte le API era gi\u00e0 stato approvato a quel momento. \u00c8 scritto direttamente negli standard di interazione dei servizi. Di conseguenza, coloro che vogliono ricevere i log devono scriverli in questo formato. Se qualcuno non scrive i log in questo formato, significa che non possiamo garantire nulla. <\/p>\n<p><\/p>\n<p>Inoltre, vorremmo stabilire uno standard unico per i metodi di registrazione, consegna e raccolta dei log. Dove scriverli e come consegnarli. La situazione ideale \u00e8 quando i progetti utilizzano tutti la stessa libreria. C'\u00e8 una libreria di registrazione separata per Go, una separata per PHP. Tutti noi \u2014 tutti devono utilizzarle. Al momento direi che ci siamo riusciti per il 80%. Ma alcuni continuano a mangiare i cactus.<\/p>\n<p><\/p>\n<p>E l\u00ec (nello slide) inizia a intravedersi \u00abSLA per la consegna dei log\u00bb. Non c'\u00e8 ancora, ma ci stiamo lavorando. Perch\u00e9 \u00e8 molto comodo quando l'infrastruttura dice che se scrivi in un certo formato in un certo posto e non pi\u00f9 di N messaggi al secondo, con una certa probabilit\u00e0 li consegneremo a quel posto. Questo elimina un sacco di mal di testa. Se l'SLA \u00e8 presente, \u00e8 semplicemente fantastico!<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Yuri Bushmelev &#039;Mappa dei problemi sul campo di raccolta e consegna dei log&#039; \u2014 trascrizione della relazione\" src=\"\/wp-content\/uploads\/2019\/04\/a887aceac13135afe90bb5f5a5ec1d26.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Come abbiamo cominciato a risolvere il problema? Il principale problema riguardava td-agent. Non era chiaro dove andassero i nostri log. Vengono consegnati? Vengono raccolti? Dove sono? Quindi, il primo punto \u00e8 stato decidere di sostituire td-agent. Qui ho abbozzato brevemente alcune opzioni su cosa sostituirlo.<\/p>\n<p><\/p>\n<p>Fluentd. Prima di tutto, l'ho affrontato nel mio lavoro precedente, e anche l\u00ec crashava di tanto in tanto. In secondo luogo, \u00e8 fondamentalmente lo stesso, solo con un profilo diverso. <\/p>\n<p><\/p>\n<p>Filebeat. Cosa lo rendeva comodo per noi? Il fatto che fosse scritto in Go, e noi abbiamo una grande esperienza in Go. Di conseguenza, se necessario, potevamo adattarlo alle nostre esigenze. Ecco perch\u00e9 non lo abbiamo scelto. Non volevamo nemmeno essere tentati di riscriverlo. <\/p>\n<p><\/p>\n<p>Una soluzione ovvia per gli amministratori di sistema rimangono vari sistemi di logging in questa forma (syslog-ng\/rsyslog\/nxlog).<\/p>\n<p><\/p>\n<p>Oppure scrivere qualcosa da zero, ma abbiamo scartato anche l'idea di filebeat. Se dobbiamo scrivere qualcosa, \u00e8 meglio che sia utile per il business. Per la trasmissione dei log, \u00e8 meglio utilizzare qualcosa di gi\u00e0 pronto.<\/p>\n<p><\/p>\n<p>Pertanto, la scelta si \u00e8 sostanzialmente ridotta tra syslog-ng e rsyslog. Ho optato per rsyslog semplicemente perch\u00e9 nel nostro Puppet c'erano gi\u00e0 classi per rsyslog, e non ho trovato differenze evidenti tra i due. Che sia syslog qui o l\u00e0, la sostanza non cambia. Certamente, qualcuno ha documentazione migliore, qualcun altro peggiore. Uno sa fare una cosa, l'altro in un altro modo.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Yuri Bushmelev &#039;Mappa dei problemi sul campo di raccolta e consegna dei log&#039; \u2014 trascrizione della relazione\" src=\"\/wp-content\/uploads\/2019\/04\/a88116711b547fa5b2b34daf72cc4220.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E un po' su rsyslog. Prima di tutto, \u00e8 fantastico perch\u00e9 ha molti moduli. Possiede un RainerScript comprensibile dall'uomo (un linguaggio di configurazione moderno). Un grande vantaggio \u00e8 che abbiamo potuto emulare il comportamento di td-agent con strumenti standard, e per le applicazioni non \u00e8 cambiato nulla. Cio\u00e8, sostituiamo td-agent con rsyslog, mentre tutto il resto rimane invariato. E otteniamo subito una trasmissione funzionante. Inoltre, mmnormalize \u00e8 una cosa fantastica in rsyslog. Permette di analizzare i log, non tramite Grok e regexp. Crea un albero di sintassi astratta. Analizza i log in modo simile a come fa un compilatore con il codice sorgente. Questo consente di lavorare molto rapidamente, consumando poca CPU, ed \u00e8 davvero una cosa straordinaria. Ci sono molti altri vantaggi, ma non mi soffermer\u00f2 su di essi.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Yuri Bushmelev &#039;Mappa dei problemi sul campo di raccolta e consegna dei log&#039; \u2014 trascrizione della relazione\" src=\"\/wp-content\/uploads\/2019\/04\/ca811be9f9ff318fb8c8bbf3dc45a038.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>rsyslog ha anche molti svantaggi. Sono, in un certo senso, simili ai vantaggi. I principali problemi sono che bisogna sapere come configurarlo e scegliere la versione giusta.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Yuri Bushmelev &#039;Mappa dei problemi sul campo di raccolta e consegna dei log&#039; \u2014 trascrizione della relazione\" src=\"\/wp-content\/uploads\/2019\/04\/034f588e0834b1d4e4873d9c3dbd0873.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Abbiamo deciso che scriveremo i log in un socket Unix. Non in \/dev\/log, perch\u00e9 l\u00ec ci sono confusione di log di sistema, con journald in quel pipeline. Quindi, scriviamo in un socket personalizzato. Lo collegheremo a un ruleset separato. Non mescoleremo nulla. Tutto sar\u00e0 trasparente e chiaro. E cos\u00ec abbiamo proceduto. La cartella con questi socket \u00e8 standardizzata e viene passata a tutti i container. I container possono vedere e scrivere nel socket di cui hanno bisogno. <\/p>\n<p><\/p>\n<p>Perch\u00e9 non un file? Perch\u00e9 tutti hanno letto <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/badoo\/blog\/280606\/\">l'articolo su Badushka<\/a><\/noindex>, che cercava di passare un file a Docker, e si scopriva che dopo il riavvio rsyslog cambiava il file descriptor, e Docker perdesse quel file. Teneva aperto qualcos'altro, ma non era pi\u00f9 quel socket dove si scrive. Abbiamo deciso di aggirare questo problema, e, nel frattempo, di evitare anche i problemi di blocco.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Yuri Bushmelev &#039;Mappa dei problemi sul campo di raccolta e consegna dei log&#039; \u2014 trascrizione della relazione\" src=\"\/wp-content\/uploads\/2019\/04\/78db15581a68ce16d11f5ebe7e6fe04e.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Rsyslog esegue le azioni indicate nella slide e invia i log o a un relay, o a Kafka. Kafka corrisponde al vecchio metodo. Relay \u00e8 il tentativo di utilizzare rsyslog per la consegna dei log. Senza Message Queue, con gli strumenti standard di rsyslog. In linea di principio, funziona.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Yuri Bushmelev &#039;Mappa dei problemi sul campo di raccolta e consegna dei log&#039; \u2014 trascrizione della relazione\" src=\"\/wp-content\/uploads\/2019\/04\/e61a25005ecbdc86d9de3215ee6fb97e.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ma ci sono sfide su come immetterli poi in quella parte (Logstash\/Graylog\/ES). Questa parte (rsyslog-rsyslog) \u00e8 utilizzata tra i data center. Qui c'\u00e8 un link TCP compresso, che consente di risparmiare larghezza di banda e, di conseguenza, aumentare la probabilit\u00e0 di ricevere alcuni log da un altro data center quando la connessione \u00e8 congestionata. Perch\u00e9 abbiamo l'Indonesia dove le cose non vanno bene. L\u00ec c'\u00e8 questo problema costante.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Yuri Bushmelev &#039;Mappa dei problemi sul campo di raccolta e consegna dei log&#039; \u2014 trascrizione della relazione\" src=\"\/wp-content\/uploads\/2019\/04\/7509ba360be2db4dec0c8679225d285f.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ci siamo chiesti come monitorare, a quale probabilit\u00e0 i log che abbiamo registrato dall'applicazione, arrivano dall'altra parte? Abbiamo deciso di avviare delle metriche. rsyslog ha il proprio modulo di raccolta statistiche, con alcuni contatori. Ad esempio, pu\u00f2 mostrarti la dimensione della coda, o quanti messaggi sono stati ricevuti in una certa azione. Da l\u00ec possiamo ottenere qualcosa. Inoltre, ha contatori personalizzati che possono essere configurati, e mostrer\u00e0, ad esempio, il numero di messaggi registrati da un certo API. In seguito, ho scritto rsyslog_exporter in Python, e tutto \u00e8 stato inviato a Prometheus per costruire grafici. Volevamo moltissimo le metriche di Graylog, ma non abbiamo ancora avuto tempo per configurarle.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Yuri Bushmelev &#039;Mappa dei problemi sul campo di raccolta e consegna dei log&#039; \u2014 trascrizione della relazione\" src=\"\/wp-content\/uploads\/2019\/04\/ef9bd61fc43e056b4a56240c85e7fd20.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Quali problemi sono sorti? I problemi sono emersi quando abbiamo scoperto (IMPROVVISAMENTE!) che le nostre API Live scrivono 50.000 messaggi al secondo. Questo solo per le Live API senza il staging. E Graylog ci mostra solo 12.000 messaggi al secondo. E sorge la legittima domanda, dove sono i rimanenti? Da cui abbiamo dedotto che Graylog semplicemente non riesce a gestire questo flusso. Abbiamo verificato, e in effetti, Graylog con Elasticsearch non riesce a sostenere questo carico.<\/p>\n<p><\/p>\n<p>In seguito, ci sono state altre scoperte fatte nel processo.<\/p>\n<p><\/p>\n<p>La scrittura nel socket viene bloccata. Come \u00e8 successo? Quando ho utilizzato rsyslog per la consegna, ad un certo punto abbiamo avuto un'interruzione del canale tra i data center. La consegna si \u00e8 bloccata in un punto, bloccandosi in un altro punto. Tutto questo \u00e8 arrivato a una macchina con API, che scrive nel socket rsyslog. L\u00ec si \u00e8 riempita la coda. Poi si \u00e8 riempita la coda per la scrittura nel socket unix, che per impostazione predefinita contiene 128 pacchetti. E la prossima write() nell'applicazione si blocca. Quando abbiamo esaminato la libreria che utilizziamo nelle applicazioni Go, era scritto che la scrittura nel socket avviene in modalit\u00e0 non bloccante. Eravamo certi che nulla si bloccasse. Perch\u00e9 avevamo letto <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/badoo\/blog\/280606\/\">l'articolo su Badushka<\/a><\/noindex>, che ne parlava. Ma c'\u00e8 un problema. Intorno a questa chiamata c'era un ciclo infinito, in cui si tentava continuamente di inviare un messaggio nel socket. Questo non lo abbiamo notato. Abbiamo dovuto riscrivere la libreria. Da allora \u00e8 cambiata diverse volte, ma adesso ci siamo liberati dai blocchi in tutti i sottosistemi. Quindi, possiamo fermare rsyslog senza che nulla si interrompa.<\/p>\n<p><\/p>\n<p>\u00c8 necessario monitorare la dimensione delle code, il che aiuta a evitare di inciampare in questi problemi. Innanzitutto, possiamo monitorare quando iniziamo a perdere messaggi. In secondo luogo, possiamo monitorare se abbiamo a che fare con problemi di consegna.<\/p>\n<p><\/p>\n<p>E c'\u00e8 anche un aspetto sgradevole: l'amplificazione dieci volte nell'architettura a microservizi \u00e8 molto facile. Non abbiamo molti richieste in entrata, ma a causa del grafo dove questi messaggi si muovono, a causa dei log di accesso, aumentiamo davvero il carico sui log circa dieci volte. Purtroppo non ho avuto il tempo di calcolare le cifre esatte, ma i microservizi sono cos\u00ec. Bisogna tenerne conto. Risulta che attualmente il sottosistema di raccolta dei log \u00e8 il pi\u00f9 sovraccarico in Lazada. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Yuri Bushmelev &#039;Mappa dei problemi sul campo di raccolta e consegna dei log&#039; \u2014 trascrizione della relazione\" src=\"\/wp-content\/uploads\/2019\/04\/d76c6d91613ff77c41b8985cee83218f.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Come risolvere il problema di elasticsearch? Se \u00e8 necessario ottenere rapidamente i log in un unico luogo, per non dover girovagare tra tutte le macchine e raccoglierli, utilizzare uno storage di file. Questo funziona garantito. Pu\u00f2 essere creato da qualsiasi server. \u00c8 sufficiente attaccare dischi e installare syslog. Dopo di ci\u00f2, avrete garantito tutti i log in un unico luogo. Poi potete impostare elasticsearch, graylog o qualcos'altro. Ma avrete gi\u00e0 tutti i log, e, per di pi\u00f9, potrete conservarli a seconda della capacit\u00e0 dei dischi.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Yuri Bushmelev &#039;Mappa dei problemi sul campo di raccolta e consegna dei log&#039; \u2014 trascrizione della relazione\" src=\"\/wp-content\/uploads\/2019\/04\/571297f25de76958769f3a4b9bfbf5b9.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Al momento della mia presentazione, lo schema era cos\u00ec. Abbiamo praticamente smesso di scrivere su file. Ora, probabilmente, disattiveremo il resto. Sulle macchine locali, su cui sono eseguite le API, smetteremo di scrivere su file. In primo luogo, c'\u00e8 uno storage di file che funziona molto bene. In secondo luogo, su queste macchine il posto finisce sempre, bisogna monitorarlo costantemente.<\/p>\n<p><\/p>\n<p>Questa parte con Logstash e Graylog \u00e8 davvero problematica. Quindi dobbiamo liberarci di essa. \u00c8 necessario scegliere una sola cosa.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Yuri Bushmelev &#039;Mappa dei problemi sul campo di raccolta e consegna dei log&#039; \u2014 trascrizione della relazione\" src=\"\/wp-content\/uploads\/2019\/04\/4a285577708aa1c55c16a72364fa8072.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Abbiamo deciso di eliminare Logstash e Kibana. Perch\u00e9 abbiamo un dipartimento di sicurezza. Qual \u00e8 il legame? La connessione \u00e8 che Kibana senza X-Pack e Shield non consente di limitare i diritti di accesso ai log. Pertanto, abbiamo scelto Graylog. Ha tutto ci\u00f2 che serve. Non mi piace, ma funziona. Abbiamo acquistato nuovo hardware, installato Graylog recente e trasferito tutti i log con formati rigorosi in un Graylog separato. Abbiamo risolto il problema con i diversi tipi di campi identici a livello organizzativo.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Yuri Bushmelev &#039;Mappa dei problemi sul campo di raccolta e consegna dei log&#039; \u2014 trascrizione della relazione\" src=\"\/wp-content\/uploads\/2019\/04\/91b9fdada2648ae1caec05169b11926a.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ci\u00f2 che entra nel nuovo Graylog. Abbiamo semplicemente registrato tutto in docker. Abbiamo preso una serie di server, distribuito tre istanze di Kafka, 7 server Graylog versione 2.3 (perch\u00e9 volevamo Elasticsearch versione 5). Tutto questo su RAID di HDD. Abbiamo visto una velocit\u00e0 di indicizzazione fino a 100.000 messaggi al secondo. Abbiamo visto che 140 terabyte di dati vengono elaborati a settimana. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Yuri Bushmelev &#039;Mappa dei problemi sul campo di raccolta e consegna dei log&#039; \u2014 trascrizione della relazione\" src=\"\/wp-content\/uploads\/2019\/04\/05f9b3c06739548f092bbe271bf8fc54.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E di nuovo problemi! Abbiamo due saldi in arrivo. Siamo passati a 6 milioni di messaggi. Graylog non riesce a elaborare. Dobbiamo trovare un modo per sopravvivere. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Yuri Bushmelev &#039;Mappa dei problemi sul campo di raccolta e consegna dei log&#039; \u2014 trascrizione della relazione\" src=\"\/wp-content\/uploads\/2019\/04\/424aa2febc2fd903aabee4aeabb64010.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Siamo sopravvissuti in questo modo. Abbiamo aggiunto un po' di server e SSD. Attualmente viviamo in questo modo. Ora, stiamo elaborando gi\u00e0 160.000 messaggi al secondo. Non abbiamo ancora raggiunto i limiti, quindi per il momento non \u00e8 chiaro quanto realmente riusciremo a ottenere da questo. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Yuri Bushmelev &#039;Mappa dei problemi sul campo di raccolta e consegna dei log&#039; \u2014 trascrizione della relazione\" src=\"\/wp-content\/uploads\/2019\/04\/17d84fa7de5403551e55f42345e62a1a.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Questi sono i nostri piani per il futuro. Tra di essi, probabilmente, la cosa pi\u00f9 importante \u00e8 l'alta disponibilit\u00e0. Al momento non ce l'abbiamo. Alcune macchine sono configurate allo stesso modo, ma tutto passa ancora attraverso una macchina. Dobbiamo prendere tempo per impostare il failover tra di loro.<\/p>\n<p><\/p>\n<p>Raccogliere le metriche da Graylog.<\/p>\n<p><\/p>\n<p>Impostare un rate limit in modo che una API impazzita non ci uccida la larghezza di banda e tutto il resto.<\/p>\n<p><\/p>\n<p>E infine, firmare un SLA con gli sviluppatori, con cui possiamo garantire questo grado di servizio. Se scrivete di pi\u00f9, ci dispiace.<\/p>\n<p><\/p>\n<p>E scrivere la documentazione.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Yuri Bushmelev &#039;Mappa dei problemi sul campo di raccolta e consegna dei log&#039; \u2014 trascrizione della relazione\" src=\"\/wp-content\/uploads\/2019\/04\/4a78e2834d5877f8bf17d77a44000c22.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>In breve, un riepilogo di tutto ci\u00f2 che abbiamo vissuto. Prima di tutto, gli standard. In secondo luogo, syslog \u00e8 come una torta. In terzo luogo, rsyslog funziona proprio cos\u00ec come indicato nella slide. Passiamo ora alle domande.<\/p>\n<p><\/p>\n<p><strong>Domande<\/strong>.<\/p>\n<p><\/p>\n<p><strong>Domanda<\/strong>: Perch\u00e9 alla fine avete deciso di non prendere\u2026 (filebeat?)<\/p>\n<p><\/p>\n<p><strong>Risposta<\/strong>: \u00c8 necessario scrivere su file. Non volevo proprio. Quando l'API scrive migliaia di messaggi al secondo, anche se ruoti ogni ora, non \u00e8 comunque un'opzione. Si pu\u00f2 scrivere in pipe. Gli sviluppatori mi hanno chiesto: \u00abE se il processo su cui scriviamo si blocca?\u00bb Non sapevo cosa rispondere e ho detto: \u00abVa bene, evitiamo di farlo\u00bb.<\/p>\n<p><\/p>\n<p><strong>Domanda<\/strong>: Perch\u00e9 non scrivete semplicemente i log in HDFS?<\/p>\n<p><\/p>\n<p><strong>Risposta<\/strong>: Questo \u00e8 il prossimo passo. Ci abbiamo pensato fin dall'inizio, ma attualmente non abbiamo risorse per gestirlo, quindi rimane una soluzione a lungo termine.<\/p>\n<p><\/p>\n<p><strong>Domanda<\/strong>: Un formato colonnare sarebbe pi\u00f9 appropriato.<\/p>\n<p><\/p>\n<p><strong>Risposta<\/strong>: Capisco tutto. Noi siamo \"a favore\" con entrambe le mani. <\/p>\n<p><\/p>\n<p><strong>Domanda<\/strong>: Scrivete in rsyslog. Ci si pu\u00f2 connettere sia via TCP che UDP. Ma se usate UDP, come garantite la consegna?<\/p>\n<p><\/p>\n<p><strong>Risposta<\/strong>: Ci sono due aspetti. Primo, dico subito a tutti che non garantiamo la consegna dei log. Perch\u00e9 quando gli sviluppatori arrivano e dicono: \u00abIniziamo a scrivere dati finanziari l\u00ec e voi li terrete da qualche parte nel caso succeda qualcosa\u00bb, noi rispondiamo: \u00abOttimo! Cominciate a bloccarvi mentre scrivete nel socket e a farlo in transazioni, in modo da garantirci che li mettiate nel socket e che noi li riceviamo dall'altro lato.\u00bb E in quel momento tutti si tirano indietro. Se non volete garantire la scrittura nel socket, perch\u00e9 dovremmo garantire la consegna? Facciamo del nostro meglio. Ci impegniamo realmente a consegnare il pi\u00f9 possibile e nel modo migliore, ma non offriamo garanzie al 100%. Quindi non scrivete dati finanziari l\u00ec. Ci sono database con transazioni per questo.<\/p>\n<p><\/p>\n<p><strong>Domanda<\/strong>: Quando l'API genera un messaggio nel log e passa il controllo ai microservizi, avete riscontrato problemi con l'arrivo dei messaggi in ordine errato? Questo crea confusione.<\/p>\n<p><\/p>\n<p><strong>Risposta<\/strong>: \u00c8 normale che arrivino in ordine diverso. Bisogna essere pronti a questo. Perch\u00e9 qualsiasi consegna su rete non garantisce l'ordine, o bisogna spendere risorse specifiche per farlo. Se consideriamo gli archivi file, ogni API salva i log nel proprio file. In effetti, rsyslog li organizza in cartelle. Ogni API ha i propri log, dove si pu\u00f2 andare a controllare, e poi si possono confrontare per timestamp. Se guardano in Graylog, l\u00ec saranno ordinati per timestamp. Tutto sar\u00e0 in ordine.<\/p>\n<p><\/p>\n<p><strong>Domanda<\/strong>: Il timestamp pu\u00f2 differire di millisecondi.<\/p>\n<p><\/p>\n<p><strong>Risposta<\/strong>: Il timestamp \u00e8 generato dall'API stessa. Questo \u00e8, in realt\u00e0, il punto. Noi abbiamo NTP. L'API genera il timestamp gi\u00e0 nel messaggio. Non lo aggiunge rsyslog.<\/p>\n<p><\/p>\n<p><strong>Domanda<\/strong>: Non \u00e8 chiaro come avviene l'interazione tra i data center. All'interno del data center \u00e8 chiaro come sono stati raccolti e elaborati i log. Come avviene l'interazione tra i data center? Oppure ogni data center vive la propria vita?<\/p>\n<p><\/p>\n<p><strong>Risposta<\/strong>: Quasi. Ogni paese \u00e8 situato in un singolo data center. Attualmente non abbiamo distribuzioni che mettano un paese in diversi data center. Quindi non \u00e8 necessario unirli. All'interno di ogni centro c'\u00e8 un Log Relay. \u00c8 un server Rsyslog. In realt\u00e0 ci sono due macchine di gestione. Sono configurate in modo identico. Ma per ora il traffico passa attraverso una di esse. Questa aggrega i log. Ha una coda su disco per ogni evenienza. Comprime i log e li invia al data center centrale (a Singapore), dove poi vengono inviati a Graylog. E in ogni data center c'\u00e8 il proprio storage file. In caso di perdita di connessione, abbiamo tutti i log l\u00ec. Rimarranno l\u00e0. Saranno salvati.<\/p>\n<p><\/p>\n<p><strong>Domanda<\/strong>: In situazioni straordinarie, ricevete i log da l\u00ec?<\/p>\n<p><\/p>\n<p><strong>Risposta<\/strong>: Si pu\u00f2 andare l\u00ec (nello storage file) e controllare.<\/p>\n<p><\/p>\n<p><strong>Domanda<\/strong>: Come monitorate di non perdere log?<\/p>\n<p><\/p>\n<p><strong>Risposta<\/strong>: In realt\u00e0, li perdiamo e ne monitoriamo la perdita. Abbiamo avviato il monitoraggio un mese fa. Nella libreria utilizzata dall'API Go, ci sono metriche. \u00c8 in grado di contare quante volte non \u00e8 riuscita a scrivere nel socket. Attualmente c'\u00e8 un'astuzia. C'\u00e8 un buffer. Cerca di scrivere messaggi in esso nel socket. Se il buffer si riempie, inizia a eliminarli. E conta quanti ne ha eliminati. Se i contatori iniziano a riempirsi, ne veniamo a conoscenza. Questi dati arrivano anche a Prometheus e si possono visualizzare grafici in Grafana. \u00c8 possibile impostare avvisi. Ma per ora non \u00e8 chiaro a chi inviarli.<\/p>\n<p><\/p>\n<p><strong>Domanda<\/strong>: In Elasticsearch, conservate i log con il backup. Quante repliche hai?<\/p>\n<p><\/p>\n<p><strong>Risposta<\/strong>: Una replica.<\/p>\n<p><\/p>\n<p><strong>Domanda<\/strong>: \u00c8 solo una replica?<\/p>\n<p><\/p>\n<p><strong>Risposta<\/strong>: Questo \u00e8 un master e una replica. I dati sono memorizzati in due copie.<\/p>\n<p><\/p>\n<p><strong>Domanda<\/strong>: Hai modificato in qualche modo la dimensione del buffer di rsyslog? <\/p>\n<p><\/p>\n<p><strong>Risposta<\/strong>: Scriviamo datagrammi in un socket Unix personalizzato. Questo ci impone immediatamente un limite di 128 kilobyte. Non possiamo scrivere pi\u00f9 di questo. L'abbiamo specificato nello standard. Chi vuole entrare negli storage deve scrivere 128 kilobyte. Le librerie, tra l'altro, troncano e impostano un flag che indica che il messaggio \u00e8 stato troncato. Nel nostro standard del messaggio c'\u00e8 un campo speciale che mostra se \u00e8 stato troncato durante la scrittura. Quindi abbiamo la possibilit\u00e0 di tracciare anche questo aspetto.<\/p>\n<p><\/p>\n<p><strong>Domanda<\/strong>: Scrivete JSON danneggiati? <\/p>\n<p><\/p>\n<p><strong>Risposta<\/strong>: Un JSON danneggiato verr\u00e0 scartato o durante il relay, perch\u00e9 il pacchetto \u00e8 troppo grande. Oppure verr\u00e0 scartato da Graylog, perch\u00e9 non riesce a fare il parsing del JSON. Ma ci sono delle sfumature che devono essere sistemate, e sono per lo pi\u00f9 legate a rsyslog. Ho gi\u00e0 inserito alcune issue l\u00ec su cui dobbiamo ancora lavorare.<\/p>\n<p><\/p>\n<p><strong>Domanda<\/strong>: Perch\u00e9 Kafka? Hai provato RabbitMQ? Graylog non funziona con questi carichi?<\/p>\n<p><\/p>\n<p><strong>Risposta<\/strong>: Con Graylog non funziona. Ma Graylog funziona con noi. \u00c8 davvero complicato. \u00c8 una cosa particolare. E, in realt\u00e0, non \u00e8 necessario. Preferirei scrivere da rsyslog direttamente in Elasticsearch e poi vedere Kibana. Ma dobbiamo risolvere la questione con i responsabili della sicurezza. Questa \u00e8 una possibile direzione per il nostro sviluppo, quando elimineremo Graylog e utilizzeremo Kibana. Non avrebbe senso usare Logstash. Perch\u00e9, posso fare tutto ci\u00f2 con rsyslog. E ha un modulo per scrivere in Elasticsearch. Stiamo cercando di convivere con Graylog. L'abbiamo anche ottimizzato un po'. Ma c'\u00e8 ancora margine per miglioramenti.<\/p>\n<p><\/p>\n<p>Per quanto riguarda Kafka. \u00c8 cos\u00ec storicamente. Quando sono arrivato, c'era gi\u00e0 e ci scrivevano gi\u00e0 i log. Abbiamo semplicemente alzato il nostro cluster e ci siamo trasferiti con i log. Lo gestiamo, sappiamo come si comporta. Per quanto riguarda RabbitMQ... con RabbitMQ non funziona. E noi abbiamo un RabbitMQ funzionante. \u00c8 in produzione, e c'erano problemi. Ora lo abbiamo sistemato prima della vendita, e ha iniziato a funzionare correttamente. Ma prima non ero pronto a rilasciarlo in produzione. C'\u00e8 anche un altro punto. Graylog sa leggere la versione AMQP 0.9, mentre rsyslog sa scrivere la versione AMQP 1.0. E non esiste alcuna soluzione che sia in grado di gestire entrambe le versioni. Ci sono o l'uno o l'altro. Quindi al momento solo Kafka. Ma ci sono anche alcune sfide. Perch\u00e9 omkafka, la versione di rsyslog che stiamo utilizzando, pu\u00f2 perdere l'intero buffer dei messaggi che ha estratto da rsyslog. Al momento conviviamo con questo. <\/p>\n<p><\/p>\n<p><strong>Domanda<\/strong>: Utilizzate Kafka perch\u00e9 era gi\u00e0 presente? Non viene utilizzato per altri scopi?<\/p>\n<p><\/p>\n<p><strong>Risposta<\/strong>: La Kafka che c'era viene utilizzata dal team di Data Science. \u00c8 un progetto completamente separato, di cui purtroppo non posso dire nulla. Non sono al corrente. Era sotto la gestione del team di Data Science. Quando hanno avviato i log, hanno deciso di utilizzarla per non doverne installare un'altra. Ora abbiamo aggiornato Graylog, e abbiamo perso la compatibilit\u00e0, perch\u00e9 c'era una vecchia versione di Kafka. Abbiamo dovuto creare la nostra. Allo stesso tempo, ci siamo liberati di quei quattro topic per ogni API. Abbiamo creato un ampio topic per tutto il live, un ampio topic per tutto lo staging e semplicemente ci buttiamo tutto dentro. Graylog estrae tutto questo in parallelo.<\/p>\n<p><\/p>\n<p><strong>Domanda<\/strong>: Perch\u00e9 \u00e8 necessario questo rito sciamanico con i socket? Hai provato a utilizzare il driver di log syslog per i contenitori?<\/p>\n<p><\/p>\n<p><strong>Risposta<\/strong>: Al momento in cui ci ponemmo questa domanda, i nostri rapporti con Docker erano tesi. Era Docker 1.0 o 0.9. Docker era strano di per s\u00e9. In secondo luogo, se dovessimo anche registrare i log... Ho un sospetto non verificato che faccia passare tutti i log attraverso di s\u00e9, tramite il demone di Docker. Se un API impazzisce, le altre API non possono inviare stdout e stderr. Non so a cosa porter\u00e0 questo. Ho la sensazione che non sia necessario utilizzare il driver syslog di Docker in quel contesto. Il nostro dipartimento di test funzionali ha il proprio piccolo cluster Graylog con log. Utilizzano i driver di log di Docker e sembra che funzioni bene. Ma scrivono direttamente in Graylog in formato GELF. Quando abbiamo iniziato tutto questo, dovevamo solo che funzionasse. Forse poi, quando qualcuno dir\u00e0 che funziona bene da anni, proveremo.<\/p>\n<p><\/p>\n<p><strong>Domanda<\/strong>: Fai il trasporto tra i datacenter utilizzando rsyslog. Perch\u00e9 non con Kafka?<\/p>\n<p><\/p>\n<p><strong>Risposta<\/strong>: Facciamo cos\u00ec e cos\u00ec in realt\u00e0. Per due motivi. Se il canale \u00e8 completamente danneggiato, i nostri log, anche in forma compressa, non riescono a passarvi attraverso. Kafka consente semplicemente di perderli nel processo. In questo modo ci liberiamo dall'intasamento di questi log. In questo caso, utilizziamo Kafka direttamente. Se il nostro canale \u00e8 buono e vogliamo liberarlo, utilizziamo rsyslog. Ma in realt\u00e0 pu\u00f2 essere configurato in modo tale da scartare ci\u00f2 che non passa. Al momento utilizziamo direttamente la consegna di rsyslog in alcune situazioni e Kafka in altre.<\/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.0.1 - 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\/it\/blog\/administrirovanie\/yurij-bushmelev-karta-grablej-na-pole-sbora-i-dostavki-logov-rasshifrovka-doklada\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.0.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"it_IT\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\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\/it\/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 \u00abMappa delle insidie nel campo di raccolta e consegna dei log\u00bb \u2014 trascrizione della presentazione | ProHoster","description":"I log \u2014 una parte importante del sistema che consente di comprendere se funzioni (o non funzioni) come previsto. Nelle architetture a microservizi, la gestione dei log diventa un'area di competenza a s\u00e9 stante.","canonical_url":"https:\/\/prohoster.info\/it\/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":"it_IT","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\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\/it\/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\/it\/wp-json\/wp\/v2\/posts\/32723","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/comments?post=32723"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts\/32723\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/media\/24507"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/media?parent=32723"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/categories?post=32723"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/tags?post=32723"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}