{"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\/ro\/blog\/administrirovanie\/yurij-bushmelev-karta-grablej-na-pole-sbora-i-dostavki-logov-rasshifrovka-doklada","title":{"rendered":"Yuri Bushmelev \u201eHarta r\u0103s\u0103riturilor pe c\u00e2mpul de colectare \u0219i livrare a bu\u0219tenilor\u201d \u2013 interpretarea raportului.","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Jurnalizarea este o parte esen\u021bial\u0103 a sistemului, care ne permite s\u0103 \u00een\u021belegem dac\u0103 acesta func\u021bioneaz\u0103 (sau nu), a\u0219a cum ne a\u0219tept\u0103m. \u00cen condi\u021biile arhitecturii microserviciilor, lucrul cu jurnalele devine o disciplin\u0103 de sine st\u0103t\u0103toare a unei olimpiade speciale. Trebuie s\u0103 rezolv\u0103m imediat o mul\u021bime de \u00eentreb\u0103ri:<\/p>\n<p><\/p>\n<ul>\n<li>cum s\u0103 scriem jurnale din aplica\u021bie;<\/li>\n<li>unde s\u0103 scriem jurnalele;<\/li>\n<li>cum s\u0103 livr\u0103m jurnalele pentru stocare \u0219i procesare;<\/li>\n<li>cum s\u0103 proces\u0103m \u0219i s\u0103 stoc\u0103m jurnalele.<\/li>\n<\/ul>\n<p><\/p>\n<p>Aplicarea tehnologiilor populare de containerizare adaug\u0103 dificult\u0103\u021bi suplimentare \u00een g\u0103sirea solu\u021biilor pentru aceast\u0103 problem\u0103.<\/p>\n<p><\/p>\n<p>Acesta este de fapt titlul prezent\u0103rii lui Yuri Bushmelev \"Harta capcanelor \u00een domeniul colect\u0103rii \u0219i livr\u0103rii jurnalelor\" <\/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=\"Reda\u021bi 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>Cine este interesat, v\u0103 rog s\u0103 citi\u021bi mai departe.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>M\u0103 numesc Yuri Bushmelev. Lucrez la Lazada. Ast\u0103zi voi vorbi despre cum am gestionat jurnalele noastre, cum le-am colectat \u0219i ce scriem \u00een ele. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Yuri Bushmelev \u201eHarta r\u0103s\u0103riturilor pe c\u00e2mpul de colectare \u0219i livrare a bu\u0219tenilor\u201d \u2013 interpretarea raportului.\" src=\"\/wp-content\/uploads\/2019\/04\/ece6053b1027ab3681022049ddcd79ea.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>De unde suntem? Cine suntem? Lazada este magazinul online nr. 1 \u00een \u0219ase \u021b\u0103ri din Asia de Sud-Est. Toate aceste \u021b\u0103ri sunt distribuite pe centre de date. \u00cen prezent, avem 4 centre de date. De ce este important? Pentru c\u0103 unele solu\u021bii au fost dictate de faptul c\u0103 leg\u0103tura \u00eentre centre este foarte slab\u0103. Avem o arhitectur\u0103 microservicii. Am fost surprins s\u0103 descop\u0103r c\u0103 avem deja 80 de microservicii. C\u00e2nd am \u00eenceput s\u0103 m\u0103 ocup de jurnale, erau doar 20. \u00cen plus, exist\u0103 un segment destul de mare de legacitate PHP, cu care trebuie s\u0103 tr\u0103im \u0219i s\u0103 ne \u00eemp\u0103c\u0103m. Toate acestea genereaz\u0103 \u00een prezent mai mult de 6 milioane de mesaje pe minut \u00een \u00eentreg sistemul. Mai departe, voi ar\u0103ta cum \u00eencerc\u0103m s\u0103 gestion\u0103m asta \u0219i de ce este a\u0219a.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Yuri Bushmelev \u201eHarta r\u0103s\u0103riturilor pe c\u00e2mpul de colectare \u0219i livrare a bu\u0219tenilor\u201d \u2013 interpretarea raportului.\" src=\"\/wp-content\/uploads\/2019\/04\/0ba5fcee5064865e836cefd47c40d246.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Trebuie s\u0103 gestion\u0103m aceste 6 milioane de mesaje cumva. Ce trebuie s\u0103 facem cu ele? 6 milioane de mesaje, care trebuie s\u0103:<\/p>\n<p><\/p>\n<ul>\n<li>fie trimise din aplica\u021bie<\/li>\n<li>fie primite pentru livrare<\/li>\n<li>fie livrate pentru analiz\u0103 \u0219i stocare.<\/li>\n<li>s\u0103 fie analizate<\/li>\n<li>s\u0103 fie stocate cumva.<\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Yuri Bushmelev \u201eHarta r\u0103s\u0103riturilor pe c\u00e2mpul de colectare \u0219i livrare a bu\u0219tenilor\u201d \u2013 interpretarea raportului.\" src=\"\/wp-content\/uploads\/2019\/04\/a449062193c4b1757a61f5c92e270a74.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>C\u00e2nd au ap\u0103rut trei milioane de mesaje, aveam un aspect similar. Pentru c\u0103 am \u00eenceput cu c\u00e2\u021biva b\u0103nu\u021bi. Este clar c\u0103 acolo se scriu logurile aplica\u021biilor. De exemplu, nu m-am putut conecta la baza de date, m-am putut conecta la baza de date, dar nu am putut citi ceva. Dar, \u00een afar\u0103 de asta, fiecare microserviciu al nostru scrie \u0219i un log de acces. Fiecare cerere care ajunge la microserviciu cade \u00een log. De ce facem asta? Dezvoltatorii vor s\u0103 aib\u0103 posibilitatea de a face tracing. \u00cen fiecare log de acces exist\u0103 un c\u00e2mp traceid, pe baza c\u0103ruia o interfa\u021b\u0103 special\u0103 reconstruie\u0219te \u00eentreaga lan\u021b \u0219i arat\u0103 frumos tracing-ul. Tracing-ul arat\u0103 cum a trecut cererea \u0219i asta \u00eei ajut\u0103 pe dezvoltatorii no\u0219tri s\u0103 fac\u0103 fa\u021b\u0103 mai repede oric\u0103rei probleme neidentificate.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Yuri Bushmelev \u201eHarta r\u0103s\u0103riturilor pe c\u00e2mpul de colectare \u0219i livrare a bu\u0219tenilor\u201d \u2013 interpretarea raportului.\" src=\"\/wp-content\/uploads\/2019\/04\/e13a2d37ce57e894d023ad405a2b5200.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Cum tr\u0103im cu asta? Acum voi rezuma c\u00e2teva op\u021biuni \u2014 cum se rezolv\u0103, de fapt, aceast\u0103 problem\u0103. Cum s\u0103 abord\u0103m sarcina de colectare, transmitere \u0219i stocare a logurilor. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Yuri Bushmelev \u201eHarta r\u0103s\u0103riturilor pe c\u00e2mpul de colectare \u0219i livrare a bu\u0219tenilor\u201d \u2013 interpretarea raportului.\" src=\"\/wp-content\/uploads\/2019\/04\/60af5e5db804770295741995adb37d90.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Cum s\u0103 scrii din aplica\u021bie? Este clar c\u0103 exist\u0103 diferite metode. \u00cen special, exist\u0103 cele mai bune practici, a\u0219a cum ne spun speciali\u0219tii trendy. Exist\u0103 \u0219i stilul vechi \u00een dou\u0103 forme, a\u0219a cum ne-au povestit b\u0103tr\u00e2nii. Exist\u0103 \u0219i alte metode. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Yuri Bushmelev \u201eHarta r\u0103s\u0103riturilor pe c\u00e2mpul de colectare \u0219i livrare a bu\u0219tenilor\u201d \u2013 interpretarea raportului.\" src=\"\/wp-content\/uploads\/2019\/04\/deab57e4ac0472a8591c0fad9e9f2910.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u00cen ceea ce prive\u0219te colectarea logurilor, situa\u021bia este similar\u0103. Op\u021biunile pentru rezolvarea acestei p\u0103r\u021bi specifice nu sunt foarte multe. Au devenit mai multe, dar \u00eenc\u0103 nu sunt foarte multe. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Yuri Bushmelev \u201eHarta r\u0103s\u0103riturilor pe c\u00e2mpul de colectare \u0219i livrare a bu\u0219tenilor\u201d \u2013 interpretarea raportului.\" src=\"\/wp-content\/uploads\/2019\/04\/8a6004aaeb931332983a975d0fa5c1d6.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Dar \u00een ceea ce prive\u0219te livrarea \u0219i analiza ulterioar\u0103 \u2014 num\u0103rul de varia\u021bii \u00eencepe s\u0103 explodeze. Nu voi descrie fiecare op\u021biune acum. Cred c\u0103 principalele op\u021biuni sunt cunoscute tuturor celor interesa\u021bi de acest subiect.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Yuri Bushmelev \u201eHarta r\u0103s\u0103riturilor pe c\u00e2mpul de colectare \u0219i livrare a bu\u0219tenilor\u201d \u2013 interpretarea raportului.\" src=\"\/wp-content\/uploads\/2019\/04\/6a0b64c7e58bc59f56aaddd27112ec51.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Voi ar\u0103ta cum am f\u0103cut asta la Lazada \u0219i cum a \u00eenceput totul, de fapt. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Yuri Bushmelev \u201eHarta r\u0103s\u0103riturilor pe c\u00e2mpul de colectare \u0219i livrare a bu\u0219tenilor\u201d \u2013 interpretarea raportului.\" src=\"\/wp-content\/uploads\/2019\/04\/20f3aa5ceea8b28733ce5399bc30f5b5.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Acum un an am venit la Lazada \u0219i am fost trimis pe un proiect despre loguri. A\u0219a era situa\u021bia. Logul din aplica\u021bie era scris \u00een stdout \u0219i stderr. Totul a fost f\u0103cut conform tendin\u021belor. Dar mai departe dezvoltatorii acestea le-au scos din fluxurile standard, iar apoi infrastructura se va ocupa de ele. \u00centre speciali\u0219tii \u00een infrastructur\u0103 \u0219i dezvoltatori mai sunt \u0219i cei care se ocup\u0103 de lans\u0103ri, care au spus: \u201eehh\u2026 bine, hai s\u0103 le punem \u00eentr-un fi\u0219ier, doar cu shell\u201d, \u0219i totul. \u0218i, deoarece totul se desf\u0103\u0219ura \u00eentr-un container, le-am pus direct \u00een containerul respectiv, am mapat un director \u00een interior \u0219i le-am pus acolo. Cred c\u0103 tuturor le este destul de clar ce a rezultat din asta.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Yuri Bushmelev \u201eHarta r\u0103s\u0103riturilor pe c\u00e2mpul de colectare \u0219i livrare a bu\u0219tenilor\u201d \u2013 interpretarea raportului.\" src=\"\/wp-content\/uploads\/2019\/04\/d92e02c18a4c683c9389321e4d5412df.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>S\u0103 ne uit\u0103m pu\u021bin mai departe. Cum am livrat aceste loguri. Cineva a ales td-agent, care de fapt este fluentd, dar nu chiar fluentd. Nu am \u00een\u021beles rela\u021bia dintre aceste dou\u0103 proiecte, dar pare c\u0103 este vorba de acela\u0219i lucru. \u0218i acest fluentd, scris \u00een Ruby, citea fi\u0219ierele de log, le analiza \u00een JSON dup\u0103 anumite expresii regulate. Apoi le trimitea \u00een Kafka. \u00cen Kafka, pentru fiecare API, aveam 4 subiecte separate. De ce 4? Pentru c\u0103 exist\u0103 live, exist\u0103 staging \u0219i pentru c\u0103 sunt stdout \u0219i stderr. Dezvoltatorii le creeaz\u0103, iar cei care se ocup\u0103 de infrastructur\u0103 trebuie s\u0103 le configureze \u00een Kafka. \u00cen plus, Kafka era controlat\u0103 de un alt departament. A\u0219adar, era nevoie s\u0103 se creeze un tichet pentru a se crea cele 4 subiecte pentru fiecare API. Toat\u0103 lumea uita de asta. \u00cen general, a fost haos. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Yuri Bushmelev \u201eHarta r\u0103s\u0103riturilor pe c\u00e2mpul de colectare \u0219i livrare a bu\u0219tenilor\u201d \u2013 interpretarea raportului.\" src=\"\/wp-content\/uploads\/2019\/04\/3130f9ebfda22713cffacf10db45ca89.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ce am f\u0103cut mai departe cu asta? Am trimis-o \u00een Kafka. Apoi, din Kafka, jum\u0103tate din loguri s-au dus \u00een Logstash. Cealalt\u0103 jum\u0103tate a logurilor s-a \u00eemp\u0103r\u021bit. O parte s-a dus \u00eentr-un Graylog, iar partea \u2013 \u00een alt Graylog. \u00cen final, totul s-a dus \u00eentr-un singur cluster Elasticsearch. Deci, tot acest haos ajungea \u00een cele din urm\u0103 acolo. Nu trebuie s\u0103 proced\u0103m a\u0219a!<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Yuri Bushmelev \u201eHarta r\u0103s\u0103riturilor pe c\u00e2mpul de colectare \u0219i livrare a bu\u0219tenilor\u201d \u2013 interpretarea raportului.\" src=\"\/wp-content\/uploads\/2019\/04\/98bf4811c102fc12fcd1114c25886b69.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>A\u0219a arat\u0103 dac\u0103 ne uit\u0103m de sus, de la distan\u021b\u0103. Nu trebuie s\u0103 proceda\u021bi a\u0219a! Aici, numerele indic\u0103 imediat locurile problematice. De fapt, sunt mai multe, dar 6 sunt efectiv problematice, cu care trebuie s\u0103 facem ceva. Despre acestea voi povesti separat. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Yuri Bushmelev \u201eHarta r\u0103s\u0103riturilor pe c\u00e2mpul de colectare \u0219i livrare a bu\u0219tenilor\u201d \u2013 interpretarea raportului.\" src=\"\/wp-content\/uploads\/2019\/04\/69f7682e6677bdda3068d6dea4db7732.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Aici (1,2,3) se scriu fi\u0219iere \u0219i, \u00een consecin\u021b\u0103, aici sunt imediat trei capcane. <\/p>\n<p><\/p>\n<p>Primul (1) \u2013 trebuie s\u0103 le scriem undeva. Nu \u00eentotdeauna ne-ar pl\u0103cea s\u0103 permitem API-ului s\u0103 scrie direct \u00een fi\u0219ier. Ar fi de preferat ca API-ul s\u0103 fie izolat \u00eentr-un container, iar \u0219i mai bine \u2013 s\u0103 fie read-only. Eu sunt administrator de sistem, a\u0219a c\u0103 am o viziune pu\u021bin alternativ\u0103 asupra acestor lucruri.<\/p>\n<p><\/p>\n<p>Un al doilea punct (2,3) \u2014 primim multe cereri \u00een API. API-ul scrie multe date \u00eentr-un fi\u0219ier. Fi\u0219ierele cresc. Trebuie s\u0103 le rotim. Altfel, nu o s\u0103 avem loc pe discuri. Rotirea lor este complicat\u0103, deoarece sunt redirec\u021bionate prin shell \u00eentr-un catalog. Nu putem s\u0103 le rotim. Nu putem spune aplica\u021biei s\u0103 redeschid\u0103 descriptorii. Deoarece dezvoltatorii se vor uita la tine ca la un nebun: \u201eCe descriptorii? Noi scriem direct \u00een stdout\u201d. Inginerii de infrastructur\u0103 au implementat copytruncate \u00een logrotate, care face pur \u0219i simplu o copie a fi\u0219ierului \u0219i truncateaz\u0103 originalul. Prin urmare, \u00eentre aceste procese de copiere, de obicei, termin\u0103m par\u021bi de pe disc.<\/p>\n<p><\/p>\n<p>(4) Am avut diferite formate \u00een diferite API-uri. Ele se asem\u0103nau pu\u021bin, dar a fost necesar s\u0103 scriem regex-uri diferite. Deoarece totul era gestionat de Puppet, existau multe clase interconectate cu propriile lor probleme. \u00cen plus, td-agent putea consuma mult\u0103 memorie, putea fi lent, putea doar s\u0103 fac\u0103 pe c\u0103 lucreaz\u0103 \u0219i s\u0103 nu fac\u0103 nimic. Din exterior, era imposibil s\u0103 \u00een\u021belegem c\u0103 nu face nimic. \u00cen cel mai bun caz, se oprea \u0219i cineva \u00eel repunea \u00een func\u021biune apoi. Mai precis, ap\u0103rea un alert \u0219i cineva mergea s\u0103-l repun\u0103 manual. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Yuri Bushmelev \u201eHarta r\u0103s\u0103riturilor pe c\u00e2mpul de colectare \u0219i livrare a bu\u0219tenilor\u201d \u2013 interpretarea raportului.\" src=\"\/wp-content\/uploads\/2019\/04\/424cda2b60e9e5669b7ef2b34ca74e48.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>(6) Cea mai mare problem\u0103 a fost elasticsearch. Deoarece era o versiune veche. Deoarece nu aveam mae\u0219tri dedica\u021bi la acel moment. Aveam jurnale eterogene, ale c\u0103ror c\u00e2mpuri se puteau suprapune. Jurnale diferite ale unor aplica\u021bii diferite se puteau scrie cu acelea\u0219i denumiri de c\u00e2mpuri, dar cu date diferite de interior. De exemplu, un jurnal poate primi un Integer \u00een c\u00e2mpul level. Alt jurnal poate primi un String \u00een c\u00e2mpul level. \u00cen absen\u021ba unui mapping static, ob\u021binem o situa\u021bie interesant\u0103. Dac\u0103 dup\u0103 rota\u021bia indexului \u00een elasticsearch primul mesaj care ajunge este un string, atunci totul merge normal. Dar dac\u0103 primul mesaj vine cu un Integer, atunci toate mesajele ulterioare care vin cu un String sunt pur \u0219i simplu eliminate. Deoarece tipurile de c\u00e2mp nu corespund.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Yuri Bushmelev \u201eHarta r\u0103s\u0103riturilor pe c\u00e2mpul de colectare \u0219i livrare a bu\u0219tenilor\u201d \u2013 interpretarea raportului.\" src=\"\/wp-content\/uploads\/2019\/04\/bc869f827bed326792857113191bb028.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Am \u00eenceput s\u0103 ne punem aceste \u00eentreb\u0103ri. Am decis s\u0103 nu c\u0103ut\u0103m vinova\u021bi.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Yuri Bushmelev \u201eHarta r\u0103s\u0103riturilor pe c\u00e2mpul de colectare \u0219i livrare a bu\u0219tenilor\u201d \u2013 interpretarea raportului.\" src=\"\/wp-content\/uploads\/2019\/04\/a071a4b38462f249339c988c35463639.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Dar trebuie s\u0103 facem ceva! Este evident c\u0103 trebuie stabilite norme. Unele norme au existat deja. Altele au fost introduse pu\u021bin mai t\u00e2rziu. Din fericire, un format unic de jurnale pentru toate API-urile fusese deja aprobat la acea dat\u0103. Acesta este specificat direct \u00een standardele de interac\u021biune ale serviciilor. Prin urmare, cei care doresc s\u0103 primeasc\u0103 jurnale trebuie s\u0103 le scrie \u00een acest format. Dac\u0103 cineva nu scrie jurnale \u00een acest format, \u00eenseamn\u0103 c\u0103 nu garant\u0103m nimic. <\/p>\n<p><\/p>\n<p>\u00cen continuare, a\u0219 dori s\u0103 stabilim un standard unic pentru metodele de \u00eenregistrare, livrare \u0219i colectare a jurnalele. Adic\u0103, unde s\u0103 le scriem \u0219i cu ce s\u0103 le livr\u0103m. Situa\u021bia ideal\u0103 este atunci c\u00e2nd \u00een proiecte se folose\u0219te aceea\u0219i bibliotec\u0103. Exist\u0103 o bibliotec\u0103 separat\u0103 pentru jurnale pentru Go, exist\u0103 o bibliotec\u0103 separat\u0103 pentru PHP. To\u021bi cei pe care \u00eei avem ar trebui s\u0103 le foloseasc\u0103. \u00cen prezent, a\u0219 spune c\u0103 avem acest lucru realizat \u00een aproximativ 80%. Dar unii continu\u0103 s\u0103 m\u0103n\u00e2nce cactu\u0219i.<\/p>\n<p><\/p>\n<p>\u0218i acolo, \u00een dreapta (\u00een slide), abia-abia \u00eencepe s\u0103 apar\u0103 \u201eSLA pentru livrarea jurnalele\u201d. Deocamdat\u0103 nu avem, dar lucr\u0103m la asta. Pentru c\u0103 este foarte convenabil c\u00e2nd infrastructura spune c\u0103 dac\u0103 scrie\u021bi \u00eentr-un anumit format \u00eentr-un anumit loc \u0219i nu mai mult de N mesaje pe secund\u0103, atunci noi le vom livra acolo cu o probabilitate de X. Asta elimin\u0103 o mul\u021bime de dureri de cap. Dac\u0103 avem SLA, atunci este pur \u0219i simplu minunat!<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Yuri Bushmelev \u201eHarta r\u0103s\u0103riturilor pe c\u00e2mpul de colectare \u0219i livrare a bu\u0219tenilor\u201d \u2013 interpretarea raportului.\" src=\"\/wp-content\/uploads\/2019\/04\/a887aceac13135afe90bb5f5a5ec1d26.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Cum am \u00eenceput s\u0103 rezolv\u0103m problema? Principalul obstacol a fost cu td-agent. Era neclar unde se duc jurnalele noastre. Se livreaz\u0103? Se colecteaz\u0103? Unde sunt de fapt? Prin urmare, primul punct a fost s\u0103 \u00eenlocuim td-agent. Op\u021biunile pentru a-l \u00eenlocui le-am schi\u021bat aici pe scurt.<\/p>\n<p><\/p>\n<p>Fluentd. \u00cen primul r\u00e2nd, m-am \u00eent\u00e2lnit cu el la locul de munc\u0103 anterior, \u0219i acolo c\u0103dea periodic. \u00cen al doilea r\u00e2nd, este acela\u0219i lucru, doar c\u0103 optimizat. <\/p>\n<p><\/p>\n<p>Filebeat. Ce a fost convenabil pentru noi? Faptul c\u0103 este scris \u00een Go, iar noi avem o mare expertiz\u0103 \u00een Go. Prin urmare, dac\u0103 era necesar, puteam cumva s\u0103-l adapt\u0103m. De aceea nu l-am luat. Ca s\u0103 nu existe niciun motiv de a \u00eencepe s\u0103-l rescriem pentru noi. <\/p>\n<p><\/p>\n<p>O solu\u021bie evident\u0103 pentru administrator r\u0103m\u00e2n diversele syslog-uri \u00eentr-o asemenea cantitate (syslog-ng\/rsyslog\/nxlog).<\/p>\n<p><\/p>\n<p>Sau s\u0103 scriem ceva propriu, dar am abandonat asta, la fel ca \u0219i filebeat. Dac\u0103 ar fi s\u0103 scriem ceva, atunci mai bine am scrie ceva util pentru afaceri. Pentru livrarea jurnalele, mai bine s\u0103 lu\u0103m ceva deja existent.<\/p>\n<p><\/p>\n<p>Prin urmare, alegerea a fost practic o alegere \u00eentre syslog-ng \u0219i rsyslog. Am \u00eenclinat spre rsyslog doar pentru c\u0103 aveam deja clase pentru rsyslog \u00een Puppet \u0219i nu am g\u0103sit nicio diferen\u021b\u0103 evident\u0103 \u00eentre ele. Ce este syslog acolo, este syslog \u0219i aici. Da, unii au documenta\u021bia mai proast\u0103, al\u021bii mai bun\u0103. Unul face \u00eentr-un fel, iar cel\u0103lalt - \u00een alt fel.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Yuri Bushmelev \u201eHarta r\u0103s\u0103riturilor pe c\u00e2mpul de colectare \u0219i livrare a bu\u0219tenilor\u201d \u2013 interpretarea raportului.\" src=\"\/wp-content\/uploads\/2019\/04\/a88116711b547fa5b2b34daf72cc4220.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u0218i pu\u021bin despre rsyslog. \u00cen primul r\u00e2nd, e grozav, pentru c\u0103 are multe module. Are un RainerScript prietenos pentru utilizatori (un limbaj de configurare modern). Un bonus excelent este c\u0103 am putut simula comportamentul td-agent folosind unelte standard, iar pentru aplica\u021bii nu s-a schimbat nimic. Asta \u00eenseamn\u0103 c\u0103 schimb\u0103m td-agent cu rsyslog, iar restul r\u0103m\u00e2ne neschimbat. \u0218i ob\u021binem imediat livrarea func\u021bional\u0103. \u00cen continuare, mmnormalize - este o chestie grozav\u0103 \u00een rsyslog. Permite parsearea jurnalelor, dar nu prin Grok \u0219i regexp. Creeaz\u0103 un arbore sintactic abstract. Parseaz\u0103 jurnalele aproximativ a\u0219a cum compileaz\u0103 un compilator sursele. Asta permite o func\u021bionare foarte rapid\u0103, consum\u0103 pu\u021bin CPU \u0219i este, \u00een general, o chestie foarte bun\u0103. Exist\u0103 o gr\u0103mad\u0103 de alte bonusuri. Nu m\u0103 voi opri asupra lor.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Yuri Bushmelev \u201eHarta r\u0103s\u0103riturilor pe c\u00e2mpul de colectare \u0219i livrare a bu\u0219tenilor\u201d \u2013 interpretarea raportului.\" src=\"\/wp-content\/uploads\/2019\/04\/ca811be9f9ff318fb8c8bbf3dc45a038.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Rsyslog are o gr\u0103mad\u0103 de dezavantaje. Acestea sunt aproximativ la fel ca \u0219i bonusurile. Problemele principale sunt c\u0103 trebuie s\u0103 \u0219tii cum s\u0103-l configurezi \u0219i trebuie s\u0103 alegi versiunea corespunz\u0103toare.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Yuri Bushmelev \u201eHarta r\u0103s\u0103riturilor pe c\u00e2mpul de colectare \u0219i livrare a bu\u0219tenilor\u201d \u2013 interpretarea raportului.\" src=\"\/wp-content\/uploads\/2019\/04\/034f588e0834b1d4e4873d9c3dbd0873.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Am decis c\u0103 vom scrie jurnalele \u00een socket unix. \u0218i nu \u00een \/dev\/log, pentru c\u0103 acolo avem o aglomerare de jurnale de sistem, unde journald este \u00een acest pipeline. A\u0219adar, haide\u021bi s\u0103 scriem \u00eentr-un socket personalizat. \u00cel vom conecta la un ruleset separat. Nu vom amesteca nimic. Totul va fi transparent \u0219i clar. A\u0219a am procedat. Directorul cu aceste socketuri este standardizat \u0219i este transmis \u00een toate containerele. Containerele pot vedea socketul de care au nevoie, se pot deschide \u0219i pot scrie \u00een el. <\/p>\n<p><\/p>\n<p>De ce nu un fi\u0219ier? Pentru c\u0103 toat\u0103 lumea a citit <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/badoo\/blog\/280606\/\">articolul despre B\u0103du\u0219ic\u0103<\/a><\/noindex>, care \u00eencerca s\u0103 transmit\u0103 un fi\u0219ier \u00een docker \u0219i descoperea c\u0103, dup\u0103 repornirea rsyslog, descriptorul de fi\u0219ier se schimb\u0103, iar docker pierde acest fi\u0219ier. Se \u021bine deschis altceva, dar nu socketul pe care se scrie. Am decis c\u0103 vom ocoli aceast\u0103 problem\u0103 \u0219i, de asemenea, vom ocoli problema bloc\u0103rii.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Yuri Bushmelev \u201eHarta r\u0103s\u0103riturilor pe c\u00e2mpul de colectare \u0219i livrare a bu\u0219tenilor\u201d \u2013 interpretarea raportului.\" src=\"\/wp-content\/uploads\/2019\/04\/78db15581a68ce16d11f5ebe7e6fe04e.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Rsyslog efectueaz\u0103 ac\u021biunile indicate pe diapozitiv \u0219i trimite jurnalele fie \u00een relaye, fie \u00een Kafka. Kafka corespunde vechii metode. Relay - este pur \u0219i simplu rsyslog folosit pentru livrarea jurnalelor. F\u0103r\u0103 Message Queue, cu unelte standard din rsyslog. \u00cen principiu, func\u021bioneaz\u0103.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Yuri Bushmelev \u201eHarta r\u0103s\u0103riturilor pe c\u00e2mpul de colectare \u0219i livrare a bu\u0219tenilor\u201d \u2013 interpretarea raportului.\" src=\"\/wp-content\/uploads\/2019\/04\/e61a25005ecbdc86d9de3215ee6fb97e.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Dar sunt nuan\u021be \u00een modul de a le introduce \u00een aceast\u0103 parte (Logstash\/Graylog\/ES). Aceast\u0103 parte (rsyslog-rsyslog) este folosit\u0103 \u00eentre centrele de date. Aici exist\u0103 un link TCP comprimat, care permite economisirea l\u0103\u021bimii de band\u0103 \u0219i, \u00een consecin\u021b\u0103, cre\u0219te probabilitatea de a primi unele jurnale din alt centru de date \u00een condi\u021biile \u00een care canalul este congestionat. De aceea, avem Indonezia, unde situa\u021bia este complicat\u0103. Acolo este o problem\u0103 constant\u0103.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Yuri Bushmelev \u201eHarta r\u0103s\u0103riturilor pe c\u00e2mpul de colectare \u0219i livrare a bu\u0219tenilor\u201d \u2013 interpretarea raportului.\" src=\"\/wp-content\/uploads\/2019\/04\/7509ba360be2db4dec0c8679225d285f.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ne-am g\u00e2ndit cum s\u0103 monitoriz\u0103m, care este probabilitatea ca jurnalele pe care le-am \u00eenregistrat din aplica\u021bie s\u0103 ajung\u0103 la destina\u021bie? Am decis s\u0103 cre\u0103m metrici. Rsyslog are un modul de colectare a statisticilor, care include diverse contoare. De exemplu, poate s\u0103 \u00ee\u021bi arate dimensiunea cozii sau c\u00e2te mesaje au ajuns \u00eentr-o anumit\u0103 ac\u021biune. Din acestea, putem extrage ceva. \u00cen plus, are contoare personalizate care pot fi configurate \u0219i care vor ar\u0103ta, de exemplu, num\u0103rul de mesaje pe care le-a \u00eenregistrat o anumit\u0103 API. Ulterior, am scris rsyslog_exporter \u00een Python \u0219i am trimis toate acestea \u00een Prometheus \u0219i am construit grafice. Ne doream foarte mult metrici din Graylog, dar deocamdat\u0103 nu am reu\u0219it s\u0103 le configur\u0103m.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Yuri Bushmelev \u201eHarta r\u0103s\u0103riturilor pe c\u00e2mpul de colectare \u0219i livrare a bu\u0219tenilor\u201d \u2013 interpretarea raportului.\" src=\"\/wp-content\/uploads\/2019\/04\/ef9bd61fc43e056b4a56240c85e7fd20.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Cu ce probleme ne-am confruntat? Problemele au ap\u0103rut c\u00e2nd am descoperit (SURPRIZ\u0102!), c\u0103 API-urile noastre Live scriu 50k mesaje pe secund\u0103. Asta este doar API-ul Live, f\u0103r\u0103 staging. Iar Graylog ne arat\u0103 doar 12 mii de mesaje pe secund\u0103. \u0218i a ap\u0103rut o \u00eentrebare ra\u021bional\u0103, unde sunt resturile? Din asta am dedus c\u0103 Graylog pur \u0219i simplu nu face fa\u021b\u0103. Am verificat \u0219i, \u00eentr-adev\u0103r, Graylog cu Elasticsearch nu a putut face fa\u021b\u0103 acestui volum.<\/p>\n<p><\/p>\n<p>\u00cen continuare, alte descoperiri pe care le-am f\u0103cut \u00een proces.<\/p>\n<p><\/p>\n<p>\u00censcrierea \u00een socket-uri este blocat\u0103. Cum s-a \u00eent\u00e2mplat asta? Atunci c\u00e2nd am folosit rsyslog pentru livrare, la un moment dat, canalul dintre centrele de date s-a rupt. Livrarea s-a oprit \u00eentr-un loc, livrarea s-a oprit \u00een alt loc. Toate acestea au afectat ma\u0219ina cu API-uri care scriu \u00een socket-ul rsyslog. Acolo s-a umplut coada. Apoi s-a umplut coada pentru scrierea \u00een socket-ul Unix, care are, \u00een mod implicit, 128 de pachete. \u0218i urm\u0103torul write() \u00een aplica\u021bie este blocat. C\u00e2nd ne-am uitat \u00een biblioteca pe care o folosim \u00een aplica\u021biile noastre scrise \u00een Go, scria c\u0103 scrierea \u00een socket se face \u00een modul non-blocant. Eram convin\u0219i c\u0103 nimic nu este blocat. Pentru c\u0103 citisem. <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/badoo\/blog\/280606\/\">articolul despre B\u0103du\u0219ic\u0103<\/a><\/noindex>, care a scris despre asta. Dar exist\u0103 un detaliu. \u00cen jurul acestei apel\u0103ri a fost un ciclu infinit, \u00een care \u00eencercam constant s\u0103 trimitem un mesaj \u00een socket. Asta nu am observat. A trebuit s\u0103 rescriem biblioteca. De atunci, a suferit c\u00e2teva modific\u0103ri, dar acum ne-am eliberat de blocaje \u00een toate subsistemele. De aceea, putem opri rsyslog, \u0219i nimic nu se va pr\u0103bu\u0219i.<\/p>\n<p><\/p>\n<p>Trebuie s\u0103 monitoriz\u0103m dimensiunea cozilor, ceea ce ajut\u0103 s\u0103 nu c\u0103dem \u00een aceste capcane. \u00cen primul r\u00e2nd, putem monitoriza c\u00e2nd \u00eencepem s\u0103 pierdem mesaje. \u00cen al doilea r\u00e2nd, putem monitoriza c\u0103 avem, \u00een principiu, probleme cu livrarea.<\/p>\n<p><\/p>\n<p>\u0218i un alt aspect nepl\u0103cut \u2014 amplificarea de 10 ori \u00een arhitectura microserviciilor \u2014 este foarte u\u0219oar\u0103. Nu avem at\u00e2t de multe cereri de intrare, dar din cauza grafului, pe care aceste mesaje \u00eel urmeaz\u0103 mai departe, din cauza jurnalelor de acces, cre\u0219tem efectiv \u00eenc\u0103rc\u0103tura din jurnal de aproximativ zece ori. Din p\u0103cate, nu am reu\u0219it s\u0103 calculez cifrele exacte, dar microserviciile sunt a\u0219a. Trebuie s\u0103 \u021binem cont de acest lucru. Rezultatul este c\u0103, \u00een prezent, subsistemul de colectare a jurnaleleor este cel mai solicitat \u00een Lazada. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Yuri Bushmelev \u201eHarta r\u0103s\u0103riturilor pe c\u00e2mpul de colectare \u0219i livrare a bu\u0219tenilor\u201d \u2013 interpretarea raportului.\" src=\"\/wp-content\/uploads\/2019\/04\/d76c6d91613ff77c41b8985cee83218f.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Cum rezolv\u0103m problema elasticsearch? Dac\u0103 trebuie s\u0103 ob\u021bine\u021bi rapid jurnalele \u00eentr-un singur loc, f\u0103r\u0103 a alerga prin toate ma\u0219inile \u0219i a le aduna, folosi\u021bi un sistem de stocare a fi\u0219ierelor. Asta func\u021bioneaz\u0103 garantat. Se poate face din orice server. Trebuie pur \u0219i simplu s\u0103 conecta\u021bi ni\u0219te discuri \u0219i s\u0103 instala\u021bi syslog. Dup\u0103 asta, ve\u021bi avea toate jurnalele \u00eentr-un singur loc. Apoi, pute\u021bi configura cu r\u0103bdare elasticsearch, graylog, sau altceva. Dar deja ve\u021bi avea toate jurnalele \u0219i, \u00een plus, le pute\u021bi stoca at\u00e2ta timp c\u00e2t v\u0103 permit unit\u0103\u021bile de disc.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Yuri Bushmelev \u201eHarta r\u0103s\u0103riturilor pe c\u00e2mpul de colectare \u0219i livrare a bu\u0219tenilor\u201d \u2013 interpretarea raportului.\" src=\"\/wp-content\/uploads\/2019\/04\/571297f25de76958769f3a4b9bfbf5b9.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>La momentul prezent\u0103rii mele, schema ar\u0103ta astfel. Practic am \u00eencetat s\u0103 scriem \u00een fi\u0219iere. Probabil, \u00een cur\u00e2nd, vom deconecta resturile. Pe ma\u0219inile locale, pe care sunt pornite API-urile, nu vom mai scrie \u00een fi\u0219iere. \u00cen primul r\u00e2nd, exist\u0103 un sistem de stocare a fi\u0219ierelor care func\u021bioneaz\u0103 foarte bine. \u00cen al doilea r\u00e2nd, pe aceste ma\u0219ini se termin\u0103 constant spa\u021biul, trebuie s\u0103-l monitoriz\u0103m constant.<\/p>\n<p><\/p>\n<p>Aceast\u0103 parte cu Logstash \u0219i Graylog, pur \u0219i simplu ne complic\u0103 via\u021ba. De aceea, trebuie s\u0103 ne eliber\u0103m de ea. Trebuie s\u0103 alegem ceva unul.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Yuri Bushmelev \u201eHarta r\u0103s\u0103riturilor pe c\u00e2mpul de colectare \u0219i livrare a bu\u0219tenilor\u201d \u2013 interpretarea raportului.\" src=\"\/wp-content\/uploads\/2019\/04\/4a285577708aa1c55c16a72364fa8072.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Am decis s\u0103 renun\u021b\u0103m la Logstash \u0219i Kibana. Pentru c\u0103 avem un departament de securitate. Care este leg\u0103tura? Leg\u0103tura este c\u0103 Kibana f\u0103r\u0103 X-Pack \u0219i f\u0103r\u0103 Shield nu permite delimitarea drepturilor de acces la loguri. A\u0219a c\u0103 am ales Graylog. Are tot ce avem nevoie. Nu-mi place, dar func\u021bioneaz\u0103. Am achizi\u021bionat hardware nou, am instalat Graylog proasp\u0103t acolo \u0219i am mutat toate logurile cu formate stricte \u00eentr-un Graylog separat. Am rezolvat problema cu diferitele tipuri de c\u00e2mpuri identice din punct de vedere organiza\u021bional.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Yuri Bushmelev \u201eHarta r\u0103s\u0103riturilor pe c\u00e2mpul de colectare \u0219i livrare a bu\u0219tenilor\u201d \u2013 interpretarea raportului.\" src=\"\/wp-content\/uploads\/2019\/04\/91b9fdada2648ae1caec05169b11926a.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ce include, de fapt, noul Graylog? Am notat totul \u00een Docker. Am luat o mul\u021bime de servere, am desf\u0103\u0219urat trei instan\u021be Kafka, \u0219apte servere Graylog versiunea 2.3 (pentru c\u0103 ne doream versiunea 5 de Elasticsearch). Totul a fost ridicat pe RAID-uri din HDD-uri. Am observat o rat\u0103 de indexare de p\u00e2n\u0103 la 100.000 de mesaje pe secund\u0103. Am v\u0103zut c\u0103 avem 140 terabyte de date pe s\u0103pt\u0103m\u00e2n\u0103. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Yuri Bushmelev \u201eHarta r\u0103s\u0103riturilor pe c\u00e2mpul de colectare \u0219i livrare a bu\u0219tenilor\u201d \u2013 interpretarea raportului.\" src=\"\/wp-content\/uploads\/2019\/04\/05f9b3c06739548f092bbe271bf8fc54.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Iar\u0103\u0219i am dat peste acelea\u0219i probleme! Avem dou\u0103 v\u00e2nz\u0103ri \u00een a\u0219teptare. Am ajuns la 6 milioane de mesaje. Graylog-ul nostru nu reu\u0219e\u0219te s\u0103 proceseze totul. Trebuie s\u0103 g\u0103sim o modalitate de a supravie\u021bui din nou. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Yuri Bushmelev \u201eHarta r\u0103s\u0103riturilor pe c\u00e2mpul de colectare \u0219i livrare a bu\u0219tenilor\u201d \u2013 interpretarea raportului.\" src=\"\/wp-content\/uploads\/2019\/04\/424aa2febc2fd903aabee4aeabb64010.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>A\u0219a am supravie\u021buit. Am ad\u0103ugat \u00eenc\u0103 c\u00e2teva servere \u0219i SSD-uri. \u00cen acest moment, tr\u0103im \u00een felul acesta. Acum reu\u0219im s\u0103 proces\u0103m deja 160.000 de mesaje pe secund\u0103. \u00cenc\u0103 nu am atins limita, deci nu este clar c\u00e2t de mult vom putea extrage din acest sistem. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Yuri Bushmelev \u201eHarta r\u0103s\u0103riturilor pe c\u00e2mpul de colectare \u0219i livrare a bu\u0219tenilor\u201d \u2013 interpretarea raportului.\" src=\"\/wp-content\/uploads\/2019\/04\/17d84fa7de5403551e55f42345e62a1a.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>A\u0219a arat\u0103 planurile noastre pentru viitor. Dintre acestea, cel mai important este, probabil, disponibilitatea mare. Momentan nu o avem. C\u00e2teva ma\u0219ini sunt configurate identic, dar totul trece \u00een continuare printr-o singur\u0103 ma\u0219in\u0103. Trebuie s\u0103 ne aloc\u0103m timp pentru a configura failover-ul \u00eentre ele.<\/p>\n<p><\/p>\n<p>Colectarea metricilor din Graylog.<\/p>\n<p><\/p>\n<p>Implementarea limit\u0103rii ratei pentru ca o API care a luat-o razna s\u0103 nu ne afecteze l\u0103\u021bimea de band\u0103 \u0219i celelalte aspecte.<\/p>\n<p><\/p>\n<p>\u0218i, \u00een final, semnarea unui SLA cu dezvoltatorii, \u00een care s\u0103 stabilim c\u0103 putem gestiona un anumit volum. Dac\u0103 scrie\u021bi mai mult, ne pare r\u0103u.<\/p>\n<p><\/p>\n<p>\u0218i redactarea documenta\u021biei.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Yuri Bushmelev \u201eHarta r\u0103s\u0103riturilor pe c\u00e2mpul de colectare \u0219i livrare a bu\u0219tenilor\u201d \u2013 interpretarea raportului.\" src=\"\/wp-content\/uploads\/2019\/04\/4a78e2834d5877f8bf17d77a44000c22.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Pe scurt, concluziile a tot ce am trecut. \u00cen primul r\u00e2nd, standarde. \u00cen al doilea r\u00e2nd, syslog - este tort. \u00cen al treilea r\u00e2nd, rsyslog func\u021bioneaz\u0103 exact a\u0219a cum este prezentat pe diapozitiv. \u0218i haide\u021bi s\u0103 trecem la \u00eentreb\u0103ri.<\/p>\n<p><\/p>\n<p><strong>\u00centreb\u0103ri<\/strong>.<\/p>\n<p><\/p>\n<p><strong>\u00centrebare<\/strong>: De ce a\u021bi decis totu\u0219i s\u0103 nu lua\u021bi... (filebeat?)<\/p>\n<p><\/p>\n<p><strong>R\u0103spuns<\/strong>: Trebuie s\u0103 scriem \u00een fi\u0219ier. Nu ne-am dorit deloc. C\u00e2nd API-ul t\u0103u scrie mii de mesaje pe secund\u0103, chiar dac\u0103 roti\u021bi fi\u0219ierul o dat\u0103 pe or\u0103, tot nu este o op\u021biune. Se poate scrie \u00een pipe. La care dezvoltatorii m-au \u00eentrebat: \u201eCe se \u00eent\u00e2mpl\u0103 dac\u0103 procesul \u00een care scriem se opre\u0219te\u201d? Pur \u0219i simplu nu am g\u0103sit un r\u0103spuns \u0219i am spus: \u201eBine, atunci s\u0103 nu facem a\u0219a.\u201d<\/p>\n<p><\/p>\n<p><strong>\u00centrebare<\/strong>: De ce nu scrie\u021bi jurnalele direct \u00een HDFS?<\/p>\n<p><\/p>\n<p><strong>R\u0103spuns<\/strong>: Aceasta este urm\u0103toarea etap\u0103. Ne-am g\u00e2ndit la ea \u00eenc\u0103 de la \u00eenceput, dar, av\u00e2nd \u00een vedere c\u0103 \u00een prezent nu avem resurse pentru a ne ocupa de asta, este \u0219i va r\u0103m\u00e2ne o solu\u021bie pe termen lung.<\/p>\n<p><\/p>\n<p><strong>\u00centrebare<\/strong>: Formatul pe coloane ar fi mai potrivit.<\/p>\n<p><\/p>\n<p><strong>R\u0103spuns<\/strong>: \u00cen\u021beleg totul. Suntem \"pentru\" din toate punctele de vedere. <\/p>\n<p><\/p>\n<p><strong>\u00centrebare<\/strong>: Scrie\u021bi \u00een rsyslog. Acolo sunt disponibile at\u00e2t TCP, c\u00e2t \u0219i UDP. Dar dac\u0103 folosi\u021bi UDP, cum garanta\u021bi livrarea?<\/p>\n<p><\/p>\n<p><strong>R\u0103spuns<\/strong>: Exist\u0103 dou\u0103 aspecte. Primul, le spun imediat tuturor c\u0103 nu garant\u0103m livrarea jurnalelor. Deoarece atunci c\u00e2nd dezvoltatorii vin \u0219i spun: \u201eHaide\u021bi s\u0103 \u00eencepem s\u0103 scriem date financiare acolo, iar voi le ve\u021bi stoca undeva \u00een caz c\u0103 se \u00eent\u00e2mpl\u0103 ceva\u201d, le r\u0103spundem \u201eExcelent! Haide\u021bi s\u0103 face\u021bi bloc\u0103ri la scrierea \u00een socket \u0219i s\u0103 face\u021bi acest lucru \u00een tranzac\u021bii, astfel \u00eenc\u00e2t s\u0103 ne asigura\u021bi c\u0103 a\u021bi pus asta \u00een socket \u0219i v-a\u021bi asigurat c\u0103 noi am primit acea informa\u021bie de cealalt\u0103 parte.\u201d \u0218i \u00een acel moment, toat\u0103 lumea devine imediat dezinteresat\u0103. \u0218i dac\u0103 nu sunt interesa\u021bi, ce \u00eentreb\u0103ri mai avem noi? Dac\u0103 nu dori\u021bi s\u0103 garanta\u021bi scrierea \u00een socket, de ce ar trebui s\u0103 garant\u0103m livrarea? Facem eforturi maxime. Ne str\u0103duim cu adev\u0103rat s\u0103 livr\u0103m c\u00e2t mai mult \u0219i c\u00e2t mai bine, dar nu oferim 100% garan\u021bie. A\u0219adar, nu este nevoie s\u0103 scrie\u021bi date financiare acolo. Exist\u0103 baze de date pentru tranzac\u021bii.<\/p>\n<p><\/p>\n<p><strong>\u00centrebare<\/strong>: Atunci c\u00e2nd API-ul genereaz\u0103 un mesaj \u00een jurnal \u0219i pred\u0103 controlul microserviciilor, v-a\u021bi confruntat vreodat\u0103 cu problema c\u0103 mesajele de la diferite microservicii sosesc \u00een ordine gre\u0219it\u0103? Din aceast\u0103 cauz\u0103 apare confuzia.<\/p>\n<p><\/p>\n<p><strong>R\u0103spuns<\/strong>: Este normal ca acestea s\u0103 soseasc\u0103 \u00een ordine diferit\u0103. Trebuie s\u0103 fi\u021bi preg\u0103ti\u021bi pentru asta. Deoarece orice livrare pe re\u021bea nu v\u0103 garanteaz\u0103 ordinea sau trebuie s\u0103 investe\u0219ti special resurse pentru asta. Dac\u0103 ne uit\u0103m la stoc\u0103rile de fi\u0219iere, fiecare API \u00ee\u0219i salveaz\u0103 jurnalele \u00een fi\u0219ierul s\u0103u. De fapt, rsyslog le organizeaz\u0103 pe categorii. Fiecare API are jurnalele sale, la care se poate merge \u0219i verifica, iar apoi, \u00een acest jurnal, se pot corela \u00een func\u021bie de timestamp. Dac\u0103 se uit\u0103 \u00een Graylog, acolo se vor sorta dup\u0103 timestamp. Totul va fi bine.<\/p>\n<p><\/p>\n<p><strong>\u00centrebare<\/strong>: Timestamp-ul poate diferi cu c\u00e2teva milisecunde.<\/p>\n<p><\/p>\n<p><strong>R\u0103spuns<\/strong>: Timestamp-ul este generat de API. Asta este, de fapt, toat\u0103 esen\u021ba. Avem NTP. API-ul genereaz\u0103 timestamp-ul chiar \u00een mesaj. Nu este ad\u0103ugat de rsyslog.<\/p>\n<p><\/p>\n<p><strong>\u00centrebare<\/strong>: Nu este foarte clar cum interac\u021bioneaz\u0103 centrele de date. \u00cen cadrul centrului de date este clar cum s-au colectat \u0219i procesat logurile. Cum are loc interac\u021biunea \u00eentre centrele de date? Sau fiecare centru de date \u00ee\u0219i duce via\u021ba separat?<\/p>\n<p><\/p>\n<p><strong>R\u0103spuns<\/strong>: Aproape. Fiecare \u021bar\u0103 se afl\u0103 \u00eentr-un singur centru de date. Momentan nu avem dispersie, astfel \u00eenc\u00e2t o \u021bar\u0103 s\u0103 fie g\u0103zduit\u0103 \u00een mai multe centre de date. Deci nu trebuie s\u0103 le integr\u0103m. \u00cen interiorul fiec\u0103rui centru exist\u0103 un Log Relay. Acesta este un server Rsyslog. De fapt, sunt dou\u0103 ma\u0219ini de management. Sunt configurate identic. Dar momentan, traficul trece prin una dintre ele. Aceasta agreg\u0103 toate logurile. Are o coad\u0103 de discuri pentru orice eventualitate. Compresioneaz\u0103 logurile \u0219i le trimite \u00een centrul de date central (cel din Singapore), unde sunt trimise mai departe \u00een Graylog. \u0218i \u00een fiecare centru de date exist\u0103 un storage de fi\u0219iere propriu. \u00cen cazul \u00een care pierdem conexiunea, avem toate logurile acolo. Ele vor r\u0103m\u00e2ne acolo. Vor fi p\u0103strate.<\/p>\n<p><\/p>\n<p><strong>\u00centrebare<\/strong>: \u00cen situa\u021bii neplanificate, ob\u021bine\u021bi loguri de acolo?<\/p>\n<p><\/p>\n<p><strong>R\u0103spuns<\/strong>: Po\u021bi merge acolo (la storage-ul de fi\u0219iere) \u0219i verifica.<\/p>\n<p><\/p>\n<p><strong>\u00centrebare<\/strong>: Cum monitoriza\u021bi c\u0103 nu pierde\u021bi loguri?<\/p>\n<p><\/p>\n<p><strong>R\u0103spuns<\/strong>: De fapt, le pierdem \u0219i monitoriz\u0103m acest lucru. Monitorizarea a fost activat\u0103 acum o lun\u0103. \u00cen biblioteca utilizat\u0103 de Go API, exist\u0103 metrici. Aceasta poate contabiliza de c\u00e2te ori nu a reu\u0219it s\u0103 scrie \u00een socket. Momentan exist\u0103 o heuristica sofisticat\u0103. Exist\u0103 un buffer. Acesta \u00eencearc\u0103 s\u0103 scrie din el un mesaj \u00een socket. Dac\u0103 bufferul se umple, \u00eencepe s\u0103 le abandoneze. \u0218i contabilizeaz\u0103 c\u00e2te a abandonat. Dac\u0103 acolo \u00eencep s\u0103 se umple contoarele, afl\u0103m despre asta. Acestea sosesc acum \u0219i \u00een Prometheus, iar \u00een Grafana po\u021bi vedea graficele. Se pot configura alerte. Dar momentan nu este clar cui s\u0103 le trimitem.<\/p>\n<p><\/p>\n<p><strong>\u00centrebare<\/strong>: \u00cen Elasticsearch, p\u0103stra\u021bi logurile cu redundan\u021b\u0103. C\u00e2te replici ave\u021bi?<\/p>\n<p><\/p>\n<p><strong>R\u0103spuns<\/strong>: O replic\u0103.<\/p>\n<p><\/p>\n<p><strong>\u00centrebare<\/strong>: Asta este doar o replic\u0103?<\/p>\n<p><\/p>\n<p><strong>R\u0103spuns<\/strong>: Este un master \u0219i o replic\u0103. Datele sunt stocate \u00een dou\u0103 exemplare.<\/p>\n<p><\/p>\n<p><strong>\u00centrebare<\/strong>: A\u021bi ajustat cumva dimensiunea bufferului Rsyslog? <\/p>\n<p><\/p>\n<p><strong>R\u0103spuns<\/strong>: Scriem datagrame \u00eentr-un socket unix personalizat. Asta ne impune imediat o limitare de 128 kilobi\u021bi. Nu putem scrie mai mult de at\u00e2t. Acest lucru este stipulat \u00een standard. Cei care vor s\u0103 intre \u00een storaje, scriu 128 kilobi\u021bi. Bibliotecile, de altfel, taie mesajul \u0219i marcheaz\u0103 faptul c\u0103 mesajul a fost t\u0103iat. \u00cen standardul mesajului nostru exist\u0103 un c\u00e2mp special care arat\u0103 dac\u0103 acesta a fost t\u0103iat la scriere sau nu. A\u0219adar, avem posibilitatea de a urm\u0103ri \u0219i acest aspect.<\/p>\n<p><\/p>\n<p><strong>\u00centrebare<\/strong>: Scrie\u021bi JSON-uri defecte? <\/p>\n<p><\/p>\n<p><strong>R\u0103spuns<\/strong>: JSON-ul defect va fi respins fie \u00een timpul relay-ului, pentru c\u0103 pachetul este prea mare. Fie va fi respins de Graylog, pentru c\u0103 nu va putea s\u0103 parseze JSON-ul. Dar aici sunt nuan\u021be care trebuie rezolvate, \u0219i acestea sunt \u00een mare parte legate de rsyslog. Am deja c\u00e2teva issue completate acolo, la care trebuie s\u0103 mai lucr\u0103m.<\/p>\n<p><\/p>\n<p><strong>\u00centrebare<\/strong>: De ce Kafka? A\u021bi \u00eencercat RabbitMQ? Nu se descurc\u0103 Graylog cu astfel de \u00eenc\u0103rc\u0103ri?<\/p>\n<p><\/p>\n<p><strong>R\u0103spuns<\/strong>: La noi nu func\u021bioneaz\u0103 cu Graylog. Dar Graylog-ul nostru func\u021bioneaz\u0103. Este o chestiune complicat\u0103. De fapt, el nu este necesar. A\u0219 prefera s\u0103 scriu din rsyslog direct \u00een elasticsearch \u0219i s\u0103 vizualizez apoi \u00een Kibana. Dar trebuie s\u0103 rezolv\u0103m problema cu cei de la securitate. Aceasta este o posibil\u0103 direc\u021bie de dezvoltare pentru noi, c\u00e2nd vom elimina Graylog-ul \u0219i vom folosi Kibana. Nu ar avea sens s\u0103 folosim Logstash. Pentru c\u0103, pot face toate acestea cu rsyslog. \u0218i acesta are un modul pentru a scrie \u00een elasticsearch. Cu Graylog \u00eencerc\u0103m cumva s\u0103 coabit\u0103m. Chiar l-am optimizat pu\u021bin. Dar mai este loc pentru \u00eembun\u0103t\u0103\u021biri.<\/p>\n<p><\/p>\n<p>Despre Kafka. A\u0219a a fost istoric. C\u00e2nd am venit, ea era deja acolo \u0219i se scriau deja jurnale \u00een ea. Noi ne-am ridicat clusterele \u0219i am mutat log-urile \u00een ea. Noi ne ocup\u0103m de managementul s\u0103u, \u0219tim cum se simte. Despre RabbitMQ... nu ne iese cu RabbitMQ. Pe de alt\u0103 parte, RabbitMQ func\u021bioneaz\u0103 pentru noi. Avem \u00een produc\u021bie \u0219i au fost probleme cu el. Acum, \u00eenainte de v\u00e2nzarea de reduceri, l-am optimizat \u0219i a \u00eenceput s\u0103 func\u021bioneze corect. Dar \u00eenainte de asta, nu m\u0103 sim\u021beam preg\u0103tit s\u0103-l pun \u00een produc\u021bie. Mai este \u00eenc\u0103 un aspect. Graylog poate citi versiunea AMQP 0.9, iar rsyslog poate scrie versiunea AMQP 1.0. Nu exist\u0103 nicio solu\u021bie care s\u0103 poat\u0103 gestiona ambele. Fie este una, fie cealalt\u0103. A\u0219adar, \u00een acest moment, doar Kafka. Dar au \u0219i ele nuan\u021bele lor. Pentru c\u0103 omkafka la versiunea rsyslog pe care o folosim poate pierde tot buffer-ul de mesaje pe care l-a extras din rsyslog. P\u00e2n\u0103 acum ne-am adaptat la asta. <\/p>\n<p><\/p>\n<p><strong>\u00centrebare<\/strong>: Folosi\u021bi Kafka pentru c\u0103 era deja la voi? Nu este folosit\u0103 pentru alte scopuri?<\/p>\n<p><\/p>\n<p><strong>R\u0103spuns<\/strong>: Kafka, care era, este folosit\u0103 de echipa de Data Science. Este un proiect complet separat, despre care, din p\u0103cate, nu pot spune nimic. Nu sunt la curent. A fost \u00een administrarea echipei de Data Science. C\u00e2nd au \u00eenceput s\u0103 utilizeze log-uri, au decis s\u0103 o foloseasc\u0103, pentru a nu fi nevoie s\u0103 instaleze \u00eenc\u0103 una. Acum am actualizat Graylog \u0219i compatibilitatea s-a pierdut, deoarece era o versiune veche de Kafka. A trebuit s\u0103 ne configur\u0103m propria versiune. De asemenea, ne-am desf\u0103cut aceste patru subiecte pentru fiecare API. Am creat un subiect larg pentru tot live, un subiect larg pentru toate staging-urile \u0219i pur \u0219i simplu trimitem tot acolo. Graylog le extrage pe toate acestea \u00een paralel.<\/p>\n<p><\/p>\n<p><strong>\u00centrebare<\/strong>: De ce este necesar\u0103 toat\u0103 aceast\u0103 magie cu socket-urile? A\u021bi \u00eencercat s\u0103 folosi\u021bi driverul log syslog pentru containere.<\/p>\n<p><\/p>\n<p><strong>R\u0103spuns<\/strong>: La acel moment c\u00e2nd ne ocupam de aceast\u0103 problem\u0103, rela\u021bia noastr\u0103 cu Docker era tensioat\u0103. Era Docker 1.0 sau 0.9. Docker, \u00een sine, era ciudat. \u00cen al doilea r\u00e2nd, dac\u0103 ad\u0103ug\u0103m \u0219i loguri \u00een el... Am o suspiciune neconfirmat\u0103 c\u0103 acesta trece toate logurile prin el, prin demonul Docker. Dac\u0103 un API devine instabil, celelalte API-uri dau peste problema c\u0103 nu pot trimite stdout \u0219i stderr. Nu \u0219tiu unde va duce asta. Am o intui\u021bie c\u0103 nu ar trebui s\u0103 folosim driverul syslog Docker \u00een acest context. Departamentul nostru de testare func\u021bional\u0103 are propriul cluster mic Graylog cu loguri. Ei folosesc driverele de loguri ale Docker-ului \u0219i se pare c\u0103 la ei merge totul bine. Dar ei scriu GELF direct \u00een Graylog. La acel moment, c\u00e2nd am \u00eenceput totul, aveam nevoie s\u0103 func\u021bioneze pur \u0219i simplu. Poate mai t\u00e2rziu, c\u00e2nd cineva va veni \u0219i va spune c\u0103 func\u021bioneaz\u0103 bine de o sut\u0103 de ani, vom \u00eencerca.<\/p>\n<p><\/p>\n<p><strong>\u00centrebare<\/strong>: Face\u021bi livrarea \u00eentre centrele de date pe rsyslog. De ce nu pe Kafka?<\/p>\n<p><\/p>\n<p><strong>R\u0103spuns<\/strong>: Facem \u0219i a\u0219a, \u0219i a\u0219a, de fapt. Din dou\u0103 motive. Dac\u0103 canalul este complet distrus, atunci toate logurile noastre, chiar \u0219i \u00een format comprimat, nu trec. Iar Kafka permite pur \u0219i simplu pierderea acestora \u00een proces. Prin acest mod ne eliber\u0103m de blocajele acestor loguri. Folosim direct Kafka \u00een acest caz. Dac\u0103 avem un canal bun \u0219i vrem s\u0103-l eliber\u0103m, atunci folosim rsyslog-ul. Dar, de fapt, se poate configura astfel \u00eenc\u00e2t s\u0103 elimine automat ceea ce nu a trecut. \u00cen acest moment folosim livrarea rsyslog direct \u00een unele locuri, iar \u00een altele Kafka.<\/p>\n<p>Sursa: <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.2.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\/ro\/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.2.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"ro_RO\" \/>\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\/ro\/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\udd47Iurii Bu\u0219melev \u201eHarta capcanelor pe c\u00e2mpul de colectare \u0219i livrare a logurilor\u201d \u2014 transcrierea prezent\u0103rii | ProHoster","description":"Logurile sunt o parte important\u0103 a sistemului, permi\u021b\u00e2ndu-ne s\u0103 \u00een\u021belegem dac\u0103 func\u021bioneaz\u0103 (sau nu) a\u0219a cum ne a\u0219teptam. \u00cen condi\u021biile arhitecturii de microservicii, gestionarea logurilor devine o disciplin\u0103 separat\u0103 a unei olimpiade speciale.","canonical_url":"https:\/\/prohoster.info\/ro\/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":"ro_RO","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\/ro\/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\/ro\/wp-json\/wp\/v2\/posts\/32723","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/comments?post=32723"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts\/32723\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/media\/24507"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/media?parent=32723"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/categories?post=32723"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/tags?post=32723"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}