{"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 \u00abMappa delle insidie sul campo di raccolta e consegna dei log\u00bb \u2014 trascrizione della relazione","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>I log sono una parte importante del sistema, permettendo di capire se funziona (o non funziona) come previsto. Nelle architetture a microservizi, lavorare con i log diventa una disciplina a s\u00e9 stante per le olimpiadi speciali. \u00c8 necessario risolvere subito una serie di questioni:<\/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 consegnare i log per l'archiviazione e l'elaborazione;<\/li>\n<li>come elaborare e archiviare i log.<\/li>\n<\/ul>\n<p><\/p>\n<p>L'uso di tecnologie di containerizzazione attualmente popolari aggiunge ulteriori insidie nel campo delle possibili soluzioni.<\/p>\n<p><\/p>\n<p>Questo \u00e8 esattamente ci\u00f2 di cui parla l'interpretazione della relazione di Yuri Bushmelev \"La mappa dei ganci nel campo di 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=\"Guarda il 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, prego di proseguire.<\/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 abbiamo gestito i nostri log, come li abbiamo raccolti e cosa scriviamo in essi. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Yuri Bushmelev \u00abMappa delle insidie sul campo di raccolta e consegna dei log\u00bb \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 negozio online numero 1 in sei paesi del Sud-Est asiatico. Questi paesi sono distribuiti nei nostri data center. Attualmente abbiamo un totale di 4 data center. Perch\u00e9 \u00e8 importante? Perch\u00e9 alcune soluzioni sono state determinate dal fatto che tra i centri c'\u00e8 un collegamento molto debole. Abbiamo un'architettura a microservizi. Sono rimasto sorpreso scoprendo che abbiamo gi\u00e0 80 microservizi. Quando ho iniziato a lavorare sui log, ce ne erano solo 20. Inoltre, c'\u00e8 un bel pezzo di legacy PHP con cui dobbiamo convivere. Questo genera attualmente pi\u00f9 di 6 milioni di messaggi al minuto nel sistema in generale. In seguito mostrer\u00f2 come cerchiamo di gestire questa situazione e perch\u00e9 \u00e8 cos\u00ec.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Yuri Bushmelev \u00abMappa delle insidie sul campo di raccolta e consegna dei log\u00bb \u2014 trascrizione della relazione\" src=\"\/wp-content\/uploads\/2019\/04\/0ba5fcee5064865e836cefd47c40d246.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Con questi 6 milioni di messaggi dobbiamo trovare un modo per convivere. Cosa dobbiamo fare con essi? 6 milioni di messaggi che devono essere:<\/p>\n<p><\/p>\n<ul>\n<li>inviati dall'applicazione<\/li>\n<li>ricevuti per la consegna<\/li>\n<li>consegnati per l'analisi e l'archiviazione.<\/li>\n<li>analizzare<\/li>\n<li>in qualche modo archiviati.<\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Yuri Bushmelev \u00abMappa delle insidie sul campo di raccolta e consegna dei log\u00bb \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 stati inviati tre milioni di messaggi, avevo un aspetto simile. Perch\u00e9 siamo partiti da pochi centesimi. \u00c8 chiaro che l\u00ec vengono scritti i log delle applicazioni. Ad esempio, non sono riuscito a connettermi al database, sono riuscito a connettermi al database, ma non sono riuscito a leggere qualcosa. Ma oltre a questo, ogni nostro microservizio scrive anche un access-log. Ogni richiesta che arriva al microservizio viene registrata nel log. Perch\u00e9 facciamo questo? Gli sviluppatori vogliono avere la possibilit\u00e0 di fare tracing. In ogni access-log c'\u00e8 un campo traceid, che poi un'interfaccia speciale utilizza per ricostruire tutto il tracciato e mostrare il tracing in modo chiaro. Il tracing mostra come \u00e8 passata la richiesta e questo aiuta i nostri sviluppatori a gestire pi\u00f9 rapidamente ogni problema sconosciuto.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Yuri Bushmelev \u00abMappa delle insidie sul campo di raccolta e consegna dei log\u00bb \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 racconter\u00f2 brevemente alcune opzioni \u2014 come viene affrontato questo problema. Come risolvere il compito di raccolta, trasmissione e archiviazione dei log. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Yuri Bushmelev \u00abMappa delle insidie sul campo di raccolta e consegna dei log\u00bb \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, come ci raccontano i trendy. C'\u00e8 il vecchio stile in due forme, come raccontavano i nostri nonni. Ci sono altri metodi. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Yuri Bushmelev \u00abMappa delle insidie sul campo di raccolta e consegna dei log\u00bb \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 con la raccolta dei log \u00e8 pi\u00f9 o meno la stessa. Le opzioni per risolvere questa particolare parte non sono molte. Ce ne sono di pi\u00f9, ma non ancora tante. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Yuri Bushmelev \u00abMappa delle insidie sul campo di raccolta e consegna dei log\u00bb \u2014 trascrizione della relazione\" src=\"\/wp-content\/uploads\/2019\/04\/8a6004aaeb931332983a975d0fa5c1d6.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ma per quanto riguarda la consegna e l'analisi successiva, il numero di varianti inizia a esplodere. Non vi descriver\u00f2 ogni opzione ora. Penso che le opzioni principali siano note a chiunque abbia seguito l'argomento.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Yuri Bushmelev \u00abMappa delle insidie sul campo di raccolta e consegna dei log\u00bb \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 tutto \u00e8 iniziato. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Yuri Bushmelev \u00abMappa delle insidie sul campo di raccolta e consegna dei log\u00bb \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 mandato a lavorare su un progetto relativo ai log. Era pi\u00f9 o meno cos\u00ec. Il log dall'applicazione veniva scritto in stdout e stderr. Tutti hanno fatto secondo le mode. Ma poi gli sviluppatori lo hanno tolto dai flussi standard, mentre l\u00ec come buona sorte ci avrebbero pensato gli specialisti dell'infrastruttura. Tra gli specialisti dell'infrastruttura e gli sviluppatori ci sono anche i rilascisti, che hanno detto: \u00abeeeh... va bene, avvolgiamoli semplicemente in un file con shell, e basta\u00bb. E poich\u00e9 tutto questo era in un contenitore, \u00e8 stato avvolto direttamente nel contenitore stesso, con la mappatura della directory interna e l'archiviazione l\u00ec. Penso che sia abbastanza chiaro a tutti cosa sia uscito da questo.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Yuri Bushmelev \u00abMappa delle insidie sul campo di raccolta e consegna dei log\u00bb \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 un po\u2019 pi\u00f9 in l\u00e0. Come abbiamo consegnato questi log. Qualcuno ha scelto td-agent, che in realt\u00e0 \u00e8 fluentd, ma non \u00e8 proprio fluentd. Non ho mai capito il rapporto tra questi due progetti, ma sembrerebbe che trattino entrambi della stessa cosa. E questo fluentd, scritto in Ruby, leggeva i file di log, li analizzava in JSON secondo alcune espressioni regolari. Poi li inviava a Kafka. Tra l'altro, in Kafka avevamo 4 topic separati per ogni API. Perch\u00e9 4? Perch\u00e9 ci sono live, staging e ci sono stdout e stderr. Gli sviluppatori li creano, e chi si occupa dell'infrastruttura deve crearli in Kafka. Inoltre, Kafka era controllata da un altro dipartimento. Quindi bisognava aprire un ticket affinch\u00e9 creassero 4 topic per ogni API. Tutti si dimenticavano di ci\u00f2. Insomma, c'era un gran caos. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Yuri Bushmelev \u00abMappa delle insidie sul campo di raccolta e consegna dei log\u00bb \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 con questo? Lo abbiamo inviato a Kafka. Successivamente, dalla Kafka, met\u00e0 dei log andava a Logstash. L'altra met\u00e0 dei log veniva suddivisa. Una parte andava a un Graylog, un'altra parte a un altro Graylog. Alla fine tutto questo finiva in un unico cluster Elasticsearch. Cio\u00e8, tutto quel disordine alla fine andava a finire l\u00ec. Cos\u00ec non si deve fare!<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Yuri Bushmelev \u00abMappa delle insidie sul campo di raccolta e consegna dei log\u00bb \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 si guarda dall'alto. Non bisogna farlo in questo modo! Qui ci sono segnati immediatamente i punti problematici. Ce ne sono in realt\u00e0 di pi\u00f9, ma 6 sono proprio quelli gravi, con cui bisogna fare qualcosa. Di questi parler\u00f2 separatamente ora. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Yuri Bushmelev \u00abMappa delle insidie sul campo di raccolta e consegna dei log\u00bb \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) stiamo scrivendo i file e, di conseguenza, qui ci sono subito tre grane. <\/p>\n<p><\/p>\n<p>Primo (1) \u2014 dobbiamo scriverli da qualche parte. Non sempre \u00e8 desiderabile dare all'API la possibilit\u00e0 di scrivere direttamente nel file. \u00c8 preferibile che l'API sia isolata in un contenitore, e sarebbe ancora meglio se fosse in sola lettura. Io sono un sysadmin, quindi ho un po\u2019 un punto di vista alternativo su queste cose.<\/p>\n<p><\/p>\n<p>Il secondo punto (2,3) \u00e8 che riceviamo molte richieste tramite l'API. L'API scrive molti dati in un file. I file crescono. Dobbiamo ruotarli. Altrimenti non riusciremo mai a tenere sotto controllo lo spazio su disco. Ruotarli \u00e8 problematico perch\u00e9 sono gestiti tramite un redirect in shell in una directory. Non possiamo farlo. Non possiamo chiedere all'applicazione di riaprire i descrittori. Perch\u00e9 gli sviluppatori ti guarderebbero come se fossi un idiota: \"Quali descrittori? Scriviamo direttamente in stdout\". Gli esperti di infrastruttura hanno creato il copytruncate in logrotate, che fa semplicemente una copia del file e tronca l'originale. Di conseguenza, tra questi processi di copia di solito finisce lo spazio su disco.<\/p>\n<p><\/p>\n<p>(4) Avevamo diversi formati in diverse API. Si differenziavano un po', ma era necessario scrivere regex diversi. Poich\u00e9 tutto era gestito da Puppet, c'era un gran numero di classi con le proprie idiosincrasie. Inoltre, il td-agent spesso poteva usare molta memoria, impantanarsi o semplicemente fare finta di funzionare senza fare nulla. Era impossibile capire dall'esterno che non stava facendo nulla. Nel migliore dei casi, si bloccava e qualcuno lo riavviava poi. Anzi, arrivava un alert e qualcuno andava a riavviarlo manualmente. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Yuri Bushmelev \u00abMappa delle insidie sul campo di raccolta e consegna dei log\u00bb \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) Il vero caos era elasticsearch. Perch\u00e9 era una versione obsoleta. Non avevamo master dedicati in quel momento. Avevamo log eterogenei i cui campi potevano sovrapporsi. Log di diverse applicazioni potevano avere gli stessi nomi di campo, ma contenere dati diversi. Ad esempio, un log potrebbe arrivare con un Integer nel campo level. Un altro log potrebbe arrivare con un String nello stesso campo level. In assenza di un mapping statico, si otteneva una situazione interessante. Se, dopo la rotazione dell'indice in elasticsearch, il primo messaggio arrivava con una stringa, tutto funzionava normalmente. Ma se il primo messaggio arrivava con un Integer, tutti i seguenti messaggi con String venivano semplicemente scartati. Perch\u00e9 il tipo di campo non corrisponde.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Yuri Bushmelev \u00abMappa delle insidie sul campo di raccolta e consegna dei log\u00bb \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 \u00abMappa delle insidie sul campo di raccolta e consegna dei log\u00bb \u2014 trascrizione della relazione\" src=\"\/wp-content\/uploads\/2019\/04\/a071a4b38462f249339c988c35463639.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ecco, c'\u00e8 qualcosa che dobbiamo fare! \u00c8 ovvio che dobbiamo stabilire degli standard. Alcuni standard li avevamo gi\u00e0, altri sono stati introdotti successivamente. Fortunatamente, a quel momento era gi\u00e0 stato approvato un formato unico per i log di tutte le API. \u00c8 scritto direttamente negli standard di interazione dei servizi. Pertanto, coloro che desiderano 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>In seguito, sarebbe utile stabilire uno standard unico per i metodi di registrazione, consegna e raccolta dei log. In sostanza, dove scriverli e come consegnarli. La situazione ideale \u00e8 quando nei progetti viene utilizzata la stessa libreria. Esiste una libreria di log separata per Go e una separata per PHP. Tutti quelli che abbiamo devono usarle. Al momento direi che ci siamo riusciti per l'80%. Ma alcuni continuano a mangiare cactus.<\/p>\n<p><\/p>\n<p>E l\u00ec (nella diapositiva) inizia finalmente a emergere il \u00abSLA per la consegna dei log\u00bb. Non \u00e8 ancora presente, ma ci stiamo lavorando. Perch\u00e9 \u00e8 molto comodo quando l'infrastruttura dice che se scrivi in un certo formato in un certo luogo e non pi\u00f9 di N messaggi al secondo, allora lo consegneremo l\u00ec con una certa probabilit\u00e0. Questo elimina un sacco di mal di testa. Se c'\u00e8 un SLA, \u00e8 davvero fantastico!<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Yuri Bushmelev \u00abMappa delle insidie sul campo di raccolta e consegna dei log\u00bb \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 iniziato a risolvere il problema? Il principale ostacolo era con il td-agent. Non era chiaro dove finissero i nostri log. Vengono consegnati? Vengono raccolti? Dove sono? Pertanto, il primo punto \u00e8 stato deciso: sostituire il td-agent. Qui ho rapidamente elencato le opzioni per una sostituzione.<\/p>\n<p><\/p>\n<p>Fluentd. Prima di tutto, ho avuto a che fare con esso nel lavoro precedente e anche l\u00ec \u00e8 caduto periodicamente. In secondo luogo, \u00e8 la stessa cosa, ma con una specializzazione. <\/p>\n<p><\/p>\n<p>Filebeat. Perch\u00e9 era comodo per noi? Perch\u00e9 \u00e8 scritto in Go e abbiamo una grande esperienza in questo linguaggio. Pertanto, se necessario, avremmo potuto modificarlo in base alle nostre esigenze. Ecco perch\u00e9 non l'abbiamo scelto. Per evitare anche il tentativo di modificarlo. <\/p>\n<p><\/p>\n<p>Una soluzione ovvia per un amministratore di sistema rimane l'uso di vari syslog in una tale quantit\u00e0 (syslog-ng\/rsyslog\/nxlog).<\/p>\n<p><\/p>\n<p>Oppure scrivere qualcosa di nostro, ma abbiamo scartato anche questa opzione, cos\u00ec come filebeat. Se dobbiamo scrivere qualcosa, \u00e8 meglio scrivere qualcosa di utile per il business. Per la consegna dei log, \u00e8 meglio utilizzare qualcosa di gi\u00e0 pronto.<\/p>\n<p><\/p>\n<p>Quindi, la scelta si \u00e8 ridotta a una scelta tra syslog-ng e rsyslog. Ho optato per rsyslog semplicemente perch\u00e9 avevamo gi\u00e0 delle classi per rsyslog in Puppet, e non ho trovato differenze evidenti tra i due. Che sia syslog da una parte, o syslog dall'altra. S\u00ec, ci sono documentazioni migliori e peggiori. Alcuni gestiscono in un modo, altri in un altro.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Yuri Bushmelev \u00abMappa delle insidie sul campo di raccolta e consegna dei log\u00bb \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. Ha un RainerScript facilmente comprensibile (un linguaggio di configurazione moderno). Un fantastico bonus \u00e8 che abbiamo potuto emulare il comportamento di td-agent con strumenti standard e per le applicazioni non \u00e8 cambiato niente. Quindi, cambiamo td-agent con rsyslog e lasciamo tutto il resto per ora. E otteniamo immediatamente una consegna funzionante. Inoltre, mmnormalize \u00e8 una funzione eccezionale in rsyslog. Consente di analizzare i log non utilizzando Grok o regexp. Crea un albero di sintassi astratta. Analizza i log in modo simile a come un compilatore analizza il codice sorgente. Questo permette di lavorare molto velocemente, consumando poco CPU, ed \u00e8 veramente una cosa molto utile. Ci sono molti altri bonus. Non mi soffermer\u00f2 su di essi.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Yuri Bushmelev \u00abMappa delle insidie sul campo di raccolta e consegna dei log\u00bb \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 molte carenze. Sono praticamente simili ai bonus. I principali problemi sono che bisogna saperlo configurare e bisogna scegliere la versione giusta.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Yuri Bushmelev \u00abMappa delle insidie sul campo di raccolta e consegna dei log\u00bb \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 di scrivere i log in un socket unix. Non in \/dev\/log, perch\u00e9 l\u00ec abbiamo un miscuglio di log di sistema, c'\u00e8 journald in questo pipeline. Quindi, scriviamo in un socket custom. Lo collegheremo a un ruleset separato. Non ci sar\u00e0 confusione. Sar\u00e0 tutto trasparente e chiaro. Cos\u00ec abbiamo fatto. La directory con questi socket \u00e8 standardizzata e viene inoltrata a tutti i contenitori. I contenitori possono vedere il socket di cui hanno bisogno, aprirlo e scriverci. <\/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 inoltrare un file in docker, e si scopriva che dopo il riavvio di rsyslog il descrittore di file cambiava, e docker perdeva quel file. Tiene aperto qualcos'altro, ma non pi\u00f9 quel socket in cui scrivono. Abbiamo deciso di aggirare questo problema e, in aggiunta, evitare il problema del blocco.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Yuri Bushmelev \u00abMappa delle insidie sul campo di raccolta e consegna dei log\u00bb \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 diapositiva e invia i log o a un relay, o a Kafka. Kafka corrisponde al metodo tradizionale. Relay \u00e8 stato un tentativo di utilizzare solo rsyslog per la consegna dei log. Senza Message Queue, con le sole funzionalit\u00e0 standard di rsyslog. In linea di principio, funziona.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Yuri Bushmelev \u00abMappa delle insidie sul campo di raccolta e consegna dei log\u00bb \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 delle sfide su come inserirli poi in questa 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 il canale \u00e8 congestionato. Perch\u00e9 abbiamo l'Indonesia, dove le cose vanno male. L\u00ec c'\u00e8 questa costante problematica.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Yuri Bushmelev \u00abMappa delle insidie sul campo di raccolta e consegna dei log\u00bb \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 effettivamente con quale probabilit\u00e0 i log che abbiamo registrato dall'applicazione arrivino all'altra estremit\u00e0? Abbiamo deciso di introdurre delle metriche. rsyslog ha il suo modulo di raccolta statistica, che ha alcuni contatori. Ad esempio, pu\u00f2 mostrarti la dimensione della coda o quanti messaggi sono arrivati in un certo action. Da questi puoi estrarre delle informazioni. Inoltre, ha contatori personalizzati che possono essere configurati, e ti mostrer\u00e0, ad esempio, il numero di messaggi registrati da un certo API. Inoltre, ho scritto rsyslog_exporter in Python, e abbiamo inviato tutto a Prometheus e costruito dei grafici. Ci sarebbe piaciuto molto avere le metriche di Graylog, ma per ora non abbiamo avuto tempo di configurarle.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Yuri Bushmelev \u00abMappa delle insidie sul campo di raccolta e consegna dei log\u00bb \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 emersi? I problemi sono emersi quando abbiamo scoperto (PLUTONICAMENTE!) che le nostre Live API scrivono 50k messaggi al secondo. Questo solo per le Live API senza staging. E Graylog ci mostra solo 12 mila messaggi al secondo. E sorge la domanda legittima: dove sono andati a finire gli altri? Da ci\u00f2 abbiamo dedotto che Graylog semplicemente non ce la fa. Abbiamo controllato e, in effetti, Graylog con Elasticsearch non stava gestendo questo flusso.<\/p>\n<p><\/p>\n<p>In seguito, ulteriori scoperte che abbiamo fatto durante il processo.<\/p>\n<p><\/p>\n<p>La scrittura nel socket \u00e8 stata bloccata. Come \u00e8 successo? Quando ho usato rsyslog per la consegna, a un certo punto si \u00e8 rotto il canale tra i data center. La consegna si \u00e8 bloccata in un posto, la consegna si \u00e8 bloccata in un altro posto. Tutto questo \u00e8 arrivato alla macchina con le API, che scrivevano nel socket rsyslog. L\u00e0 la coda si \u00e8 riempita. Poi si \u00e8 riempita la coda per la scrittura nel unix socket, che per impostazione predefinita \u00e8 di 128 pacchetti. E la successiva 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 ha scritto a riguardo. Ma c'\u00e8 un momento. Attorno a questa chiamata c'era un ciclo infinito, in cui si tentava costantemente di inserire un messaggio nel socket. Questo non lo abbiamo notato. Abbiamo dovuto riscrivere la libreria. Da allora \u00e8 cambiata diverse volte, ma ora ci siamo liberati dei blocchi in tutti i sottosistemi. Pertanto, possiamo fermare rsyslog, e nulla cadr\u00e0.<\/p>\n<p><\/p>\n<p>\u00c8 necessario monitorare la dimensione delle code, il che aiuta a non inciampare in queste trappole. In primo luogo, possiamo monitorare quando iniziamo a perdere messaggi. In secondo luogo, possiamo monitorare se abbiamo problemi di consegna.<\/p>\n<p><\/p>\n<p>E c'\u00e8 anche una sgradevole questione: l'amplificazione di 10 volte in un'architettura a microservizi \u00e8 molto semplice. Non abbiamo cos\u00ec tante richieste in ingresso, ma a causa del grafo attraverso il quale questi messaggi vengono inviati, a causa dei log di accesso, aumentiamo realmente il carico dei log di circa dieci volte. Purtroppo non ho avuto tempo di calcolare i numeri esatti, ma i microservizi sono cos\u00ec. Questo \u00e8 da tenere a mente. Risulta che al momento 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 \u00abMappa delle insidie sul campo di raccolta e consegna dei log\u00bb \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 ricevere rapidamente i log in un unico posto, per non dover andare in giro per tutte le macchine e raccoglierli, utilizzare uno storage di file. Questo funziona garantito. Pu\u00f2 essere fatto da qualsiasi server. Basta semplicemente inserire dei dischi e impostare syslog. Dopo di che avrete garantito tutti i log in un solo posto. Dopo sar\u00e0 possibile configurare con calma elasticsearch, graylog o qualcos'altro. Ma avrete gi\u00e0 tutti i log e, tra l'altro, potete conservarli quanto basta le risorse di disco.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Yuri Bushmelev \u00abMappa delle insidie sul campo di raccolta e consegna dei log\u00bb \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 \u00e8 diventato cos\u00ec. Abbiamo praticamente smesso di scrivere nei file. Adesso, probabilmente, disconneteremo i resti. Sulle macchine locali, su cui sono avviati gli API, non scriveremo pi\u00f9 nei file. In primo luogo, c'\u00e8 uno storage di file che funziona molto bene. In secondo luogo, su queste macchine lo spazio finisce costantemente, \u00e8 necessario monitorarlo continuamente.<\/p>\n<p><\/p>\n<p>Questa parte con Logstash e Graylog \u00e8 veramente fastidiosa. Pertanto, dobbiamo liberarci di essa. \u00c8 necessario scegliere una sola opzione.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Yuri Bushmelev \u00abMappa delle insidie sul campo di raccolta e consegna dei log\u00bb \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 abbandonare Logstash e Kibana. Perch\u00e9 abbiamo un reparto sicurezza. Qual \u00e8 il nesso? Il nesso \u00e8 che Kibana senza X-Pack e senza Shield non consente di differenziare i diritti di accesso ai log. Perci\u00f2 abbiamo scelto Graylog. Ha tutto ci\u00f2 di cui abbiamo bisogno. A me non piace, ma funziona. Abbiamo acquistato nuovo hardware, installato un Graylog fresco e trasferito tutti i log con formati rigidi 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 \u00abMappa delle insidie sul campo di raccolta e consegna dei log\u00bb \u2014 trascrizione della relazione\" src=\"\/wp-content\/uploads\/2019\/04\/91b9fdada2648ae1caec05169b11926a.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Cosa comprende effettivamente il nuovo Graylog. Abbiamo semplicemente registrato tutto in Docker. Abbiamo preso un bel po' di server, distribuito tre istanze di Kafka, 7 server Graylog versione 2.3 (perch\u00e9 volevamo Elasticsearch versione 5). Tutto questo \u00e8 stato caricato su RAID di HDD. Abbiamo visto un tasso di indicizzazione fino a 100 mila messaggi al secondo. Abbiamo visto che i dati ammontano a 140 terabyte a settimana. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Yuri Bushmelev \u00abMappa delle insidie sul campo di raccolta e consegna dei log\u00bb \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 ostacoli! Abbiamo davanti a noi due vendite straordinarie. Siamo passati a 6 milioni di messaggi. Graylog non riesce a elaborare in tempo. Dobbiamo trovare un modo per sopravvivere di nuovo. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Yuri Bushmelev \u00abMappa delle insidie sul campo di raccolta e consegna dei log\u00bb \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 qualche server e SSD in pi\u00f9. Attualmente viviamo in questo modo. Ora stiamo elaborando gi\u00e0 160.000 messaggi al secondo. Non abbiamo ancora raggiunto il limite, quindi non \u00e8 chiaro fin dove possiamo realmente spingerci. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Yuri Bushmelev \u00abMappa delle insidie sul campo di raccolta e consegna dei log\u00bb \u2014 trascrizione della relazione\" src=\"\/wp-content\/uploads\/2019\/04\/17d84fa7de5403551e55f42345e62a1a.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ecco quali sono i nostri piani per il futuro. Tra di essi, davvero, la cosa pi\u00f9 importante \u00e8 probabilmente l'alta disponibilit\u00e0. Finora non ce l'abbiamo. Alcune macchine sono configurate allo stesso modo, ma tutto passa ancora attraverso una macchina. Dobbiamo investire tempo per impostare un failover tra di loro.<\/p>\n<p><\/p>\n<p>Raccogliere metriche da Graylog.<\/p>\n<p><\/p>\n<p>Implementare un rate limit affinch\u00e9 un'API impazzita non ci distrugga la larghezza di banda e tutto il resto.<\/p>\n<p><\/p>\n<p>E infine, firmare qualche SLA con gli sviluppatori, in modo da evidenziare che possiamo gestire solo un certo volume. Se ne scrivete di pi\u00f9, ci dispiace.<\/p>\n<p><\/p>\n<p>E redigere la documentazione.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Yuri Bushmelev \u00abMappa delle insidie sul campo di raccolta e consegna dei log\u00bb \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 sintesi, ecco i risultati di tutto ci\u00f2 che abbiamo vissuto. Prima di tutto, gli standard. In secondo luogo, syslog \u2014 un capolavoro. In terzo luogo, rsyslog funziona proprio come scritto nella diapositiva. E ora passiamo 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 usare\u2026 (filebeat?)<\/p>\n<p><\/p>\n<p><strong>Risposta<\/strong>: \u00c8 necessario scrivere su file. Molto controvoglia. Quando hai un'API che scrive migliaia di messaggi al secondo, anche se ruoti ogni ora, non \u00e8 comunque una soluzione praticabile. Si pu\u00f2 scrivere su pipe. A questo punto, gli sviluppatori mi hanno chiesto: \"E se il processo in cui scriviamo si interrompe?\" Non ho trovato cosa rispondere e ho detto: \"Va bene, non facciamolo\".<\/p>\n<p><\/p>\n<p><strong>Domanda<\/strong>: Perch\u00e9 non scrivete i log direttamente in HDFS?<\/p>\n<p><\/p>\n<p><strong>Risposta<\/strong>: Questo \u00e8 il prossimo passo. Ci abbiamo pensato all'inizio, ma poich\u00e9 al momento non ci sono risorse per occuparci di questo, resta una soluzione a lungo termine.<\/p>\n<p><\/p>\n<p><strong>Domanda<\/strong>: Il formato colonnare sarebbe pi\u00f9 appropriato.<\/p>\n<p><\/p>\n<p><strong>Risposta<\/strong>: Capisco tutto. Siamo \"a favore\" con entrambe le mani. <\/p>\n<p><\/p>\n<p><strong>Domanda<\/strong>: Scrivete in rsyslog. Qui si pu\u00f2 usare sia TCP che UDP. Ma se usate UDP, come garantite la consegna?<\/p>\n<p><\/p>\n<p><strong>Risposta<\/strong>: Ci sono due aspetti. Prima di tutto, dico subito a tutti che non garantiamo la consegna dei log. Perch\u00e9 quando i programmatori vengono e dicono: \u00abIniziamo a scrivere i dati finanziari l\u00ec, e voi li archivierete da qualche parte nel caso succeda qualcosa\u00bb, noi rispondiamo: \u00abOttimo! Iniziate a bloccarvi nella scrittura nel socket e fatelo in transazioni, per assicurarvi di metterlo nel socket e di essere certi che noi dall'altra parte lo abbiamo ricevuto.\u00bb E in quel momento a tutti non interessa pi\u00f9. E se non interessa, quali domande possono avere nei nostri confronti? Se non volete garantire la scrittura nel socket, perch\u00e9 dovremmo garantire la consegna? Noi facciamo il massimo sforzo. Ci impegniamo davvero a consegnare il pi\u00f9 possibile e nel miglior modo possibile, ma non diamo il 100% di garanzia. Pertanto, non scrivete l\u00ec i dati finanziari. Per questo ci sono database con transazioni.<\/p>\n<p><\/p>\n<p><strong>Domanda<\/strong>: Quando l'API genera un messaggio nei log e passa il controllo ai microservizi, non vi siete mai imbattuti nel problema che i messaggi dai diversi microservizi arrivano nell'ordine sbagliato? 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 di rete non garantisce l'ordine, o si deve spendere risorse specifiche per questo. Se consideriamo i file di archiviazione, ogni API salva i log nel proprio file. In realt\u00e0, rsyslog li organizza in cartelle. Ogni API ha i propri log, dove si pu\u00f2 andare a vedere e poi confrontarli per timestamp. Se vanno a vedere in Graylog, l\u00ec saranno ordinati per timestamp. Tutto andr\u00e0 bene.<\/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 viene generato dall'API stessa. Questa \u00e8 tutta la questione. Abbiamo NTP. L'API genera il timestamp gi\u00e0 nel messaggio. Non \u00e8 rsyslog a aggiungerlo.<\/p>\n<p><\/p>\n<p><strong>Domanda<\/strong>: Non \u00e8 molto chiara l'interazione tra i data center. All'interno del data center \u00e8 chiaro come vengono raccolti e elaborati i log. Come avviene l'interazione tra i data center? O ogni data center vive di vita propria?<\/p>\n<p><\/p>\n<p><strong>Risposta<\/strong>: Quasi. Ogni paese si trova in un unico data center. Al momento non abbiamo una distribuzione tale che un paese sia ospitato in pi\u00f9 data center. Quindi non c'\u00e8 bisogno di 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 allo stesso modo. Ma al momento tutto il traffico passa attraverso una di esse. Essa aggrega tutti i log. Ha una coda su disco per ogni evenienza. Comprime i log e li invia al data center centrale (quello di Singapore), dove vengono poi inviati a Graylog. E in ogni data center c'\u00e8 il proprio storage di file. In caso di perdita di connessione, abbiamo tutti i log l\u00ec. Resteranno l\u00ec. Saranno salvati.<\/p>\n<p><\/p>\n<p><strong>Domanda<\/strong>: In situazioni di emergenza ricevete log da l\u00ec?<\/p>\n<p><\/p>\n<p><strong>Risposta<\/strong>: Si pu\u00f2 andare l\u00ec (nello storage di file) e controllare.<\/p>\n<p><\/p>\n<p><strong>Domanda<\/strong>: Come monitorate di non perdere i log?<\/p>\n<p><\/p>\n<p><strong>Risposta<\/strong>: In realt\u00e0 li perdiamo, e lo monitoriamo. Il monitoraggio \u00e8 stato avviato un mese fa. Nella libreria utilizzata da Go API, ci sono delle metriche. \u00c8 in grado di contare quante volte non \u00e8 riuscita a scrivere nel socket. Attualmente c'\u00e8 un'euristica ingegnosa. C'\u00e8 un buffer. Prova a scrivere un messaggio dal buffer nel socket. Se il buffer si riempie, inizia a scartare i messaggi. E conta quanti ne ha scartati. Se i contatori iniziano a riempirsi, lo veniamo a sapere. Ora tutto questo arriva anche in Prometheus, e in Grafana \u00e8 possibile vedere i grafici. \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 ridondanza. Quante repliche avete?<\/p>\n<p><\/p>\n<p><strong>Risposta<\/strong>: Una replica.<\/p>\n<p><\/p>\n<p><strong>Domanda<\/strong>: Solo una replica?<\/p>\n<p><\/p>\n<p><strong>Risposta<\/strong>: Questo \u00e8 il master e la replica. I dati sono conservati in due esemplari.<\/p>\n<p><\/p>\n<p><strong>Domanda<\/strong>: Avete 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 subito un limite di 128 kilobyte. Non possiamo scrivere pi\u00f9 di questo. Abbiamo registrato questo nello standard. Chi vuole accedere agli storage deve scrivere 128 kilobyte. Le librerie, tra l'altro, accorciano e impostano un flag che indica che il messaggio \u00e8 stato accorciato. Nel nostro standard del messaggio stesso c'\u00e8 un campo speciale che mostra se \u00e8 stato accorciato durante la scrittura o meno. Quindi abbiamo la possibilit\u00e0 di monitorare 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, a causa di un pacchetto troppo grande. Oppure verr\u00e0 scartato da Graylog, perch\u00e9 non sar\u00e0 in grado di analizzare il JSON. Ma ci sono delle sfumature che devono essere sistemate, e in gran parte sono legate a rsyslog. Ho gi\u00e0 segnalato alcuni problemi l\u00ec, su cui dobbiamo ancora lavorare.<\/p>\n<p><\/p>\n<p><strong>Domanda<\/strong>: Perch\u00e9 Kafka? Avete provato RabbitMQ? Graylog non funziona con questi carichi?<\/p>\n<p><\/p>\n<p><strong>Risposta<\/strong>: Con Graylog non ci siamo. Ma Graylog funziona per noi. \u00c8 davvero problematico. \u00c8 una cosa particolare. E, in effetti, non \u00e8 necessario. Preferirei scrivere direttamente da rsyslog in elasticsearch e poi guardare in 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 esattamente la stessa cosa con rsyslog. E ha un modulo per scrivere in elasticsearch. Con Graylog stiamo cercando di convivere. L'abbiamo anche un po' ottimizzato. Ma c'\u00e8 ancora spazio per i miglioramenti.<\/p>\n<p><\/p>\n<p>Riguardo a Kafka. \u00c8 cos\u00ec storicamente. Quando sono arrivato, era gi\u00e0 presente e ci si scrivevano gi\u00e0 i log. Abbiamo semplicemente avviato il nostro cluster e ci siamo trasferiti l\u00ec con i log. Lo gestiamo, sappiamo come si comporta. Per quanto riguarda RabbitMQ... non ci stiamo trovando bene con RabbitMQ. Ma con RabbitMQ le cose vanno bene. Un production server ce l'abbiamo, e ci sono stati problemi. Prima dei saldi, l'abbiamo sistemato e ha iniziato a funzionare correttamente. Ma prima di ci\u00f2 non ero pronto a rilasciarlo in produzione. C'\u00e8 anche un altro aspetto. Graylog sa leggere la versione AMQP 0.9, mentre rsyslog sa scrivere la versione AMQP 1.0. E non c'\u00e8 una soluzione che faccia entrambe le cose. O una o l'altra. Pertanto, al momento stiamo usando solo Kafka. Ma ci sono anche delle peculiarit\u00e0. Perch\u00e9 omkafka, nella versione di rsyslog che stiamo usando, pu\u00f2 perdere tutto il buffer dei messaggi che ha estratto da rsyslog. Al momento ci stiamo convivendo. <\/p>\n<p><\/p>\n<p><strong>Domanda<\/strong>: Usate Kafka solo perch\u00e9 ce l'avevate gi\u00e0? Non \u00e8 utilizzato per altre finalit\u00e0?<\/p>\n<p><\/p>\n<p><strong>Risposta<\/strong>: Kafka, che gi\u00e0 avevate, \u00e8 utilizzato dal team Data Science. Questo \u00e8 un progetto completamente separato, di cui purtroppo non posso dire nulla. Non sono aggiornato. Era sotto la gestione del team Data Science. Quando hanno iniziato a raccogliere i log, hanno deciso di usarlo per non dover installare il proprio. Ora abbiamo aggiornato Graylog e abbiamo perso la compatibilit\u00e0, perch\u00e9 c'era una vecchia versione di Kafka. Abbiamo dovuto crearne uno nostro. Allo stesso tempo, ci siamo liberati di quei quattro topic per ogni API. Ne abbiamo creato uno ampio per tutto il live, uno ampio per tutto il staging e semplicemente ci buttiamo tutto. Graylog lo estrapola tutto in parallelo.<\/p>\n<p><\/p>\n<p><strong>Domanda<\/strong>: Perch\u00e9 c'\u00e8 bisogno di questa magia con i socket? Avete provato a utilizzare il log-driver syslog per i container?<\/p>\n<p><\/p>\n<p><strong>Risposta<\/strong>: Al momento in cui ci stavamo ponendo questa domanda, il nostro rapporto con Docker era teso. Si trattava di Docker 1.0 o 0.9. Docker in s\u00e9 era strano. In secondo luogo, se ci si mettevano anche i log... Ho il sospetto non verificato che faccia passare tutti i log attraverso di s\u00e9, attraverso il demone di Docker. Se una delle nostre API va in crisi, le altre API si bloccano perch\u00e9 non riescono a inviare stdout e stderr. Non so a cosa porter\u00e0. Ho la sensazione che in questo caso non si debba usare il driver syslog di Docker. Il nostro dipartimento di testing funzionale ha il suo cluster di Graylog con i log. Usano i driver di log di Docker e l\u00ec sembra che tutto vada bene. Ma scrivono direttamente in Graylog in formato GELF. Al momento in cui stava per iniziare tutto questo, avevamo bisogno che funzionasse e basta. Forse poi, quando qualcuno dir\u00e0 che funziona bene da un secolo, ci proveremo.<\/p>\n<p><\/p>\n<p><strong>Domanda<\/strong>: Perch\u00e9 fate la consegna tra i data center con rsyslog? Perch\u00e9 non con Kafka?<\/p>\n<p><\/p>\n<p><strong>Risposta<\/strong>: In realt\u00e0 facciamo entrambe le cose. Per due motivi. Se il canale \u00e8 completamente danneggiato, tutti i log, anche in formato compresso, non riescono a passare. Kafka ci permette semplicemente di perderli nel processo. In questo modo evitiamo che questi log si bloccano. In questo caso, usiamo Kafka direttamente. Se il nostro canale \u00e8 buono e vogliamo liberarlo, allora usiamo rsyslog. Ma in realt\u00e0 \u00e8 possibile configurarlo in modo che scarti da solo quanto non passa. Al momento usiamo semplicemente rsyslog direttamente 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.1.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.1.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 \"Mappa delle insidie nel campo di raccolta e consegna dei log\" \u2014 trascrizione della relazione | ProHoster","description":"I log sono una parte importante del sistema, che permette di capire se funziona (o non funziona) come previsto. Nelle architetture a microservizi, lavorare con i log diventa una disciplina 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}]}}