{"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\/pl\/blog\/administrirovanie\/yurij-bushmelev-karta-grablej-na-pole-sbora-i-dostavki-logov-rasshifrovka-doklada","title":{"rendered":"Jurij Buszmeliew \u201eMapa grbe\u0144 na polu zbierania i dostarczania log\u00f3w\u201d \u2014 transkrypcja wyk\u0142adu","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Logi to wa\u017cna cz\u0119\u015b\u0107 systemu, kt\u00f3ra pozwala zrozumie\u0107, czy dzia\u0142a on zgodnie z oczekiwaniami (lub nie). W kontek\u015bcie architektury mikroserwisowej praca z logami staje si\u0119 odr\u0119bn\u0105 dyscyplin\u0105 specjalnej olimpiady. Nale\u017cy rozwi\u0105za\u0107 od razu szereg kwestii:<\/p>\n<p><\/p>\n<ul>\n<li>jak pisa\u0107 logi z aplikacji;<\/li>\n<li>gdzie pisa\u0107 logi;<\/li>\n<li>jak dostarcza\u0107 logi do przechowywania i przetwarzania;<\/li>\n<li>jak przetwarza\u0107 i przechowywa\u0107 logi.<\/li>\n<\/ul>\n<p><\/p>\n<p>Wykorzystanie popularnych dzisiaj technologii konteneryzacji dodaje piasku na g\u00f3r\u0119 g\u00f3r na polu mo\u017cliwo\u015bci rozwi\u0105zania problemu.<\/p>\n<p><\/p>\n<p>Dok\u0142adnie o tym m\u00f3wi interpretacja raportu Jurija Buszmi\u0142ewa \u201eMapa pu\u0142apek na polu zbierania i dostarczania log\u00f3w\u201d <\/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=\"Odtwarzaj wideo\" 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>Kogo to interesuje, zapraszam dalej.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>Nazywam si\u0119 Jurij Buszmielew. Pracuj\u0119 w Lazada. Dzi\u015b opowiem o tym, jak tworzyli\u015bmy nasze logi, jak je zbierali\u015bmy i co do nich piszemy. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Jurij Buszmeliew \u201eMapa grbe\u0144 na polu zbierania i dostarczania log\u00f3w\u201d \u2014 transkrypcja wyk\u0142adu\" src=\"\/wp-content\/uploads\/2019\/04\/ece6053b1027ab3681022049ddcd79ea.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Sk\u0105d pochodzimy? Kim jeste\u015bmy? Lazada to numer 1 w e-commerce w sze\u015bciu krajach Azji Po\u0142udniowo-Wschodniej. Wszystkie te kraje s\u0105 rozproszone po centrach danych. Obecnie mamy 4 centra danych. Dlaczego to wa\u017cne? Poniewa\u017c niekt\u00f3re rozwi\u0105zania by\u0142y podyktowane bardzo s\u0142abym \u0142\u0105czem mi\u0119dzy centrami. Mamy architektur\u0119 mikroserwisow\u0105. By\u0142em zaskoczony, odkrywaj\u0105c, \u017ce mamy ju\u017c 80 mikroserwis\u00f3w. Kiedy zaczyna\u0142em zadanie z logami, by\u0142o ich tylko 20. Ponadto istnieje do\u015b\u0107 du\u017ca cz\u0119\u015b\u0107 starszego kodu PHP, z kt\u00f3r\u0105 r\u00f3wnie\u017c trzeba \u017cy\u0107 i si\u0119 zgadza\u0107. Wszystko to generuje nam w tej chwili ponad 6 milion\u00f3w wiadomo\u015bci na minut\u0119 w ca\u0142ym systemie. Nast\u0119pnie poka\u017c\u0119, jak pr\u00f3bujemy z tym \u017cy\u0107 i dlaczego jest to takie.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Jurij Buszmeliew \u201eMapa grbe\u0144 na polu zbierania i dostarczania log\u00f3w\u201d \u2014 transkrypcja wyk\u0142adu\" src=\"\/wp-content\/uploads\/2019\/04\/0ba5fcee5064865e836cefd47c40d246.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Z tymi 6 milionami wiadomo\u015bci musimy jako\u015b \u017cy\u0107. Co powinni\u015bmy z nimi zrobi\u0107? 6 milion\u00f3w wiadomo\u015bci, kt\u00f3re nale\u017cy:<\/p>\n<p><\/p>\n<ul>\n<li>wys\u0142a\u0107 z aplikacji<\/li>\n<li>otrzyma\u0107 do dostarczenia<\/li>\n<li>dostarczy\u0107 do analizy i przechowywania.<\/li>\n<li>analizowa\u0107<\/li>\n<li>jako\u015b przechowywa\u0107.<\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Jurij Buszmeliew \u201eMapa grbe\u0144 na polu zbierania i dostarczania log\u00f3w\u201d \u2014 transkrypcja wyk\u0142adu\" src=\"\/wp-content\/uploads\/2019\/04\/a449062193c4b1757a61f5c92e270a74.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Kiedy pojawi\u0142y si\u0119 trzy miliony wiadomo\u015bci, wygl\u0105da\u0142em mniej wi\u0119cej tak. Zaczynali\u015bmy od jakich\u015b groszy. Oczywi\u015bcie, \u017ce zapisujemy logi aplikacji. Na przyk\u0142ad, nie uda\u0142o si\u0119 po\u0142\u0105czy\u0107 z baz\u0105 danych, uda\u0142o si\u0119 po\u0142\u0105czy\u0107 z baz\u0105 danych, ale nie uda\u0142o si\u0119 czego\u015b przeczyta\u0107. Ale poza tym, ka\u017cdy nasz mikroserwis zapisuje r\u00f3wnie\u017c log dost\u0119pu. Ka\u017cde zapytanie, kt\u00f3re trafia do mikroserwisu, l\u0105duje w logu. Po co to robimy? Programi\u015bci chc\u0105 mie\u0107 mo\u017cliwo\u015b\u0107 \u015bledzenia. W ka\u017cdym logu dost\u0119pu znajduje si\u0119 pole traceid, wed\u0142ug kt\u00f3rego specjalny interfejs rozwija ca\u0142\u0105 sekwencj\u0119 i \u0142adnie pokazuje \u015blad. \u015alad pokazuje, jak przebiega\u0142o zapytanie, i to pomaga naszym programistom szybciej radzi\u0107 sobie z r\u00f3\u017cnymi nieznanymi sprawami.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Jurij Buszmeliew \u201eMapa grbe\u0144 na polu zbierania i dostarczania log\u00f3w\u201d \u2014 transkrypcja wyk\u0142adu\" src=\"\/wp-content\/uploads\/2019\/04\/e13a2d37ce57e894d023ad405a2b5200.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Jak z tym \u017cy\u0107? Teraz w skr\u00f3cie opowiem o mo\u017cliwo\u015bciach \u2014 jak w og\u00f3le ten problem jest rozwi\u0105zany. Jak rozwi\u0105za\u0107 zadanie zbierania, przesy\u0142ania i przechowywania log\u00f3w. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Jurij Buszmeliew \u201eMapa grbe\u0144 na polu zbierania i dostarczania log\u00f3w\u201d \u2014 transkrypcja wyk\u0142adu\" src=\"\/wp-content\/uploads\/2019\/04\/60af5e5db804770295741995adb37d90.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Jak pisa\u0107 z aplikacji? Oczywi\u015bcie, \u017ce s\u0105 r\u00f3\u017cne sposoby. W szczeg\u00f3lno\u015bci istniej\u0105 najlepsze praktyki, o kt\u00f3rych m\u00f3wi\u0105 modni koledzy. Jest stary styl w dw\u00f3ch wersjach, jak opowiadali dziadkowie. S\u0105 te\u017c inne sposoby. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Jurij Buszmeliew \u201eMapa grbe\u0144 na polu zbierania i dostarczania log\u00f3w\u201d \u2014 transkrypcja wyk\u0142adu\" src=\"\/wp-content\/uploads\/2019\/04\/deab57e4ac0472a8591c0fad9e9f2910.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Z zbieraniem log\u00f3w sytuacja jest podobna. Nie ma zbyt wielu opcji rozwi\u0105zania tej konkretnej cz\u0119\u015bci. Ju\u017c jest ich wi\u0119cej, ale wci\u0105\u017c nie tak wiele. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Jurij Buszmeliew \u201eMapa grbe\u0144 na polu zbierania i dostarczania log\u00f3w\u201d \u2014 transkrypcja wyk\u0142adu\" src=\"\/wp-content\/uploads\/2019\/04\/8a6004aaeb931332983a975d0fa5c1d6.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Natomiast je\u015bli chodzi o dostarczanie i p\u00f3\u017aniejsz\u0105 analiz\u0119 \u2014 liczba wariacji zaczyna ogromnie rosn\u0105\u0107. Nie b\u0119d\u0119 teraz opisywa\u0142 ka\u017cdego wariantu. My\u015bl\u0119, \u017ce podstawowe opcje s\u0105 znane ka\u017cdemu, kto interesowa\u0142 si\u0119 tematem.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Jurij Buszmeliew \u201eMapa grbe\u0144 na polu zbierania i dostarczania log\u00f3w\u201d \u2014 transkrypcja wyk\u0142adu\" src=\"\/wp-content\/uploads\/2019\/04\/6a0b64c7e58bc59f56aaddd27112ec51.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Poka\u017c\u0119, jak robili\u015bmy to w Lazada i jak w\u0142a\u015bciwie to wszystko si\u0119 zacz\u0119\u0142o. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Jurij Buszmeliew \u201eMapa grbe\u0144 na polu zbierania i dostarczania log\u00f3w\u201d \u2014 transkrypcja wyk\u0142adu\" src=\"\/wp-content\/uploads\/2019\/04\/20f3aa5ceea8b28733ce5399bc30f5b5.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Rok temu do\u0142\u0105czy\u0142em do Lazada i wys\u0142ano mnie do projektu dotycz\u0105cego log\u00f3w. By\u0142o to mniej wi\u0119cej tak. Log z aplikacji by\u0142 zapisywany w stdout i stderr. Zrobili\u015bmy to zgodnie z trendami. Ale nast\u0119pnie programi\u015bci wyrzucili to ze standardowych strumieni, a potem jako\u015b specjali\u015bci od infrastruktury si\u0119 tym zajm\u0105. Mi\u0119dzy specjalistami od infrastruktury a programistami s\u0105 jeszcze wydawcy, kt\u00f3rzy powiedzieli: \u201eeee... no dobrze, zamknijmy je po prostu w pliku przez shell i to wszystko\u201d. A poniewa\u017c wszystko to by\u0142o w kontenerze, to zapakowali\u015bmy to bezpo\u015brednio w samym kontenerze, zamapowali\u015bmy katalog wewn\u0105trz i po\u0142o\u017cyli\u015bmy to tam. My\u015bl\u0119, \u017ce wszystkim jest mniej wi\u0119cej jasne, co z tego wysz\u0142o.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Jurij Buszmeliew \u201eMapa grbe\u0144 na polu zbierania i dostarczania log\u00f3w\u201d \u2014 transkrypcja wyk\u0142adu\" src=\"\/wp-content\/uploads\/2019\/04\/d92e02c18a4c683c9389321e4d5412df.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Zobaczmy teraz nieco dalej. Jak dostarczali\u015bmy te logi. Kto\u015b wybra\u0142 td-agent, kt\u00f3ry tak naprawd\u0119 jest fluentd, ale nie do ko\u0144ca fluentd. Nie do ko\u0144ca zrozumia\u0142em relacje mi\u0119dzy tymi dwoma projektami, ale wydaje si\u0119, \u017ce dotycz\u0105 tego samego. I ten fluentd, napisany w Ruby, czyta\u0142 pliki log\u00f3w, parsowa\u0142 je do JSON przy u\u017cyciu jakich\u015b wyra\u017ce\u0144 regularnych. Nast\u0119pnie wysy\u0142a\u0142 je do Kafki. Przy czym dla ka\u017cdego API mieli\u015bmy 4 oddzielne topiki w Kafce. Dlaczego 4? Poniewa\u017c by\u0142o live, by\u0142o staging, a tak\u017ce stdout i stderr. Programi\u015bci je tworzyli, a in\u017cynierowie infrastruktury musieli je tworzy\u0107 w Kafce. Ponadto, Kafk\u0119 kontrolowa\u0142 inny dzia\u0142. Dlatego trzeba by\u0142o stworzy\u0107 tiket, aby oni stworzyli te 4 topiki dla ka\u017cdego API. Wszyscy o tym zapominali. Og\u00f3lnie rzecz bior\u0105c, by\u0142 to ba\u0142agan i chaos. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Jurij Buszmeliew \u201eMapa grbe\u0144 na polu zbierania i dostarczania log\u00f3w\u201d \u2014 transkrypcja wyk\u0142adu\" src=\"\/wp-content\/uploads\/2019\/04\/3130f9ebfda22713cffacf10db45ca89.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Co dalej z tym robili\u015bmy? Wysy\u0142ali\u015bmy to do Kafki. Nast\u0119pnie po\u0142owa log\u00f3w trafia\u0142a do Logstasha. Druga po\u0142owa log\u00f3w by\u0142a dzielona. Cz\u0119\u015b\u0107 lecia\u0142a do jednego Grayloga, cz\u0119\u015b\u0107 \u2013 do drugiego Grayloga. Ostatecznie wszystko to trafia\u0142o do jednego klastra Elasticsearch. To znaczy, ca\u0142y ten ba\u0142agan ostatecznie trafia\u0142 tam. Tak nie powinno si\u0119 robi\u0107!<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Jurij Buszmeliew \u201eMapa grbe\u0144 na polu zbierania i dostarczania log\u00f3w\u201d \u2014 transkrypcja wyk\u0142adu\" src=\"\/wp-content\/uploads\/2019\/04\/98bf4811c102fc12fcd1114c25886b69.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Tak to wygl\u0105da, je\u015bli spojrzymy na to z dalszej perspektywy. Nie r\u00f3bcie tak! Tutaj cyframi od razu zaznaczone s\u0105 problematyczne miejsca. W rzeczywisto\u015bci jest ich wi\u0119cej, ale 6 to te naprawd\u0119 problematyczne, z kt\u00f3rymi trzeba co\u015b zrobi\u0107. O nich opowiem teraz oddzielnie. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Jurij Buszmeliew \u201eMapa grbe\u0144 na polu zbierania i dostarczania log\u00f3w\u201d \u2014 transkrypcja wyk\u0142adu\" src=\"\/wp-content\/uploads\/2019\/04\/69f7682e6677bdda3068d6dea4db7732.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Tutaj (1,2,3) zapisujemy pliki i, odpowiednio, mamy tutaj od razu trzy pu\u0142apki. <\/p>\n<p><\/p>\n<p>Pierwsza (1) \u2013 musimy je gdzie\u015b zapisa\u0107. Nie zawsze chcieliby\u015bmy dawa\u0107 API mo\u017cliwo\u015b\u0107 zapisywania bezpo\u015brednio do pliku. Po\u017c\u0105dane by\u0142oby, aby API by\u0142o izolowane w kontenerze, a jeszcze lepiej \u2013 aby by\u0142o w trybie tylko do odczytu. Jestem administratorem system\u00f3w, wi\u0119c mam nieco alternatywne spojrzenie na te sprawy.<\/p>\n<p><\/p>\n<p>Druga kwestia (2,3) \u2014 otrzymujemy du\u017co zapyta\u0144 do API. API zapisuje du\u017co danych do pliku. Pliki rosn\u0105. Musimy je rotowa\u0107. Bo inaczej nie zaopatrujemy si\u0119 w \u017cadne dyski. Rotacja jest z\u0142a, poniewa\u017c s\u0105 one przekierowane przez shell do katalogu. Nie mo\u017cemy ich rotowa\u0107. Nie mo\u017cna powiedzie\u0107 aplikacji, aby ponownie otworzy\u0142a deskryptory. Bo deweloperzy spojrz\u0105 na ciebie jak na idiot\u0119: \u201eJakie deskryptory? Napisali\u015bmy w stdout\u201d. Infrastruktury\u015bci zrealizowali copytruncate w logrotate, kt\u00f3re po prostu tworzy kopi\u0119 pliku i truncuje orygina\u0142. W zwi\u0105zku z tym, mi\u0119dzy tymi procesami kopiowania zazwyczaj ko\u0144czy si\u0119 miejsce na dysku.<\/p>\n<p><\/p>\n<p>(4) Mieli\u015bmy r\u00f3\u017cne formaty w r\u00f3\u017cnych API. Nieco si\u0119 r\u00f3\u017cni\u0142y, ale trzeba by\u0142o pisa\u0107 r\u00f3\u017cne regexp. Poniewa\u017c wszystko to by\u0142o zarz\u0105dzane przez Puppet, istnia\u0142a du\u017ca wi\u0105zka klas z w\u0142asnymi problemami. Dodatkowo, td-agent przez wi\u0119kszo\u015b\u0107 czasu m\u00f3g\u0142 zjada\u0107 pami\u0119\u0107, zwalnia\u0107, m\u00f3g\u0142 po prostu udawa\u0107, \u017ce dzia\u0142a i nic nie robi\u0107. Na zewn\u0105trz nie da\u0142o si\u0119 zrozumie\u0107, \u017ce nic nie robi. W najlepszym wypadku m\u00f3g\u0142 si\u0119 zawiesi\u0107, a potem kto\u015b go podniesie. A dok\u0142adniej, przyjdzie alert i kto\u015b r\u0119cznie go podniesie. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Jurij Buszmeliew \u201eMapa grbe\u0144 na polu zbierania i dostarczania log\u00f3w\u201d \u2014 transkrypcja wyk\u0142adu\" src=\"\/wp-content\/uploads\/2019\/04\/424cda2b60e9e5669b7ef2b34ca74e48.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>(6) A najwi\u0119kszym koszmarem by\u0142 elasticsearch. Poniewa\u017c to by\u0142a stara wersja. Nie mieli\u015bmy w\u00f3wczas dedykowanych mistrz\u00f3w. Mieli\u015bmy r\u00f3\u017cnorodne logi, gdzie pola mog\u0142y si\u0119 pokrywa\u0107. R\u00f3\u017cne logi r\u00f3\u017cnych aplikacji mog\u0142y by\u0107 zapisywane z tymi samymi nazwami p\u00f3l, ale wewn\u0105trz mog\u0142y zawiera\u0107 r\u00f3\u017cne dane. To znaczy, jeden log przychodzi z Integer w polu, na przyk\u0142ad, level. Inny log przychodzi z String w polu level. W braku statycznego mapowania otrzymujemy co\u015b niesamowitego. Je\u015bli po rotacji indeksu w elasticsearch pierwsza wiadomo\u015b\u0107 dotrze jako ci\u0105g, to \u017cyjemy normalnie. Ale je\u015bli pierwsza dotrze jako Integer, to wszystkie kolejne wiadomo\u015bci, kt\u00f3re dotar\u0142y jako String, po prostu si\u0119 odrzucaj\u0105. Poniewa\u017c typ pola si\u0119 nie zgadza.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Jurij Buszmeliew \u201eMapa grbe\u0144 na polu zbierania i dostarczania log\u00f3w\u201d \u2014 transkrypcja wyk\u0142adu\" src=\"\/wp-content\/uploads\/2019\/04\/bc869f827bed326792857113191bb028.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Zacz\u0119li\u015bmy zadawa\u0107 sobie te pytania. Postanowili\u015bmy nie szuka\u0107 winnych.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Jurij Buszmeliew \u201eMapa grbe\u0144 na polu zbierania i dostarczania log\u00f3w\u201d \u2014 transkrypcja wyk\u0142adu\" src=\"\/wp-content\/uploads\/2019\/04\/a071a4b38462f249339c988c35463639.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ale co\u015b trzeba zrobi\u0107! Oczywist\u0105 spraw\u0105 jest to, \u017ce nale\u017cy ustanowi\u0107 standardy. Niekt\u00f3re standardy mieli\u015bmy ju\u017c wcze\u015bniej. Niekt\u00f3re wprowadzili\u015bmy nieco p\u00f3\u017aniej. Na szcz\u0119\u015bcie, jednolity format log\u00f3w dla wszystkich API zosta\u0142 zatwierdzony w tamtym czasie. Jest on zapisany w standardach interakcji serwis\u00f3w. W zwi\u0105zku z tym, ci, kt\u00f3rzy chc\u0105 otrzymywa\u0107 logi, musz\u0105 pisa\u0107 je w tym formacie. Je\u015bli kto\u015b nie pisze log\u00f3w w tym formacie, to znaczy, \u017ce niczego nie gwarantujemy. <\/p>\n<p><\/p>\n<p>Nast\u0119pnie, chcia\u0142bym ustali\u0107 jednolity standard dla sposob\u00f3w zapisu, dostarczania i zbierania log\u00f3w. W\u0142a\u015bciwie, gdzie je pisa\u0107 i czym je dostarcza\u0107. Idealna sytuacja to taka, gdzie w projektach u\u017cywa si\u0119 tej samej biblioteki. Istnieje oddzielna biblioteka logowania dla Go, istnieje oddzielna biblioteka dla PHP. Wszyscy, kt\u00f3rzy z nami wsp\u00f3\u0142pracuj\u0105, powinni ich u\u017cywa\u0107. Na chwil\u0119 obecn\u0105 powiedzia\u0142bym, \u017ce jeste\u015bmy na poziomie oko\u0142o 80%. Ale niekt\u00f3rzy nadal jedz\u0105 kaktusy.<\/p>\n<p><\/p>\n<p>I tam (na slajdzie) ledwie zaczyna si\u0119 klarowa\u0107 \"SLA na dostarczanie log\u00f3w\". Na razie go nie ma, ale pracujemy nad tym. Poniewa\u017c to bardzo wygodne, kiedy infrastruktura m\u00f3wi, \u017ce je\u015bli zapisujesz w takim a takim formacie w takie a takie miejsce i nie wi\u0119cej ni\u017c N wiadomo\u015bci na sekund\u0119, to dostarczymy to z jakim\u015b prawdopodobie\u0144stwem tam. To niweluje wiele b\u00f3lu g\u0142owy. Je\u015bli SLA jest, to jest po prostu wspaniale!<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Jurij Buszmeliew \u201eMapa grbe\u0144 na polu zbierania i dostarczania log\u00f3w\u201d \u2014 transkrypcja wyk\u0142adu\" src=\"\/wp-content\/uploads\/2019\/04\/a887aceac13135afe90bb5f5a5ec1d26.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Jak zacz\u0119li\u015bmy rozwi\u0105zywa\u0107 problem? G\u0142\u00f3wna przeszkoda by\u0142a z td-agent. Nie by\u0142o jasne, gdzie si\u0119 podzia\u0142y nasze logi. Czy s\u0105 dostarczane? Czy s\u0105 zbierane? Gdzie one w og\u00f3le s\u0105? Dlatego pierwszym krokiem by\u0142a decyzja o zast\u0105pieniu td-agent. Opcje, czym go zast\u0105pi\u0107, tutaj kr\u00f3tko nakre\u015bli\u0142em.<\/p>\n<p><\/p>\n<p>Fluentd. Po pierwsze, spotka\u0142em si\u0119 z nim w poprzedniej pracy i tam r\u00f3wnie\u017c sporadycznie pada\u0142. Po drugie, to to samo, tylko w profilu. <\/p>\n<p><\/p>\n<p>Filebeat. Czym by\u0142 dla nas wygodny? Tym, \u017ce jest na Go, a my mamy du\u017c\u0105 wiedz\u0119 w Go. W zwi\u0105zku z tym, je\u015bli co\u015b, mogli\u015bmy go jako\u015b przystosowa\u0107 do siebie. Dlatego go nie wzi\u0119li\u015bmy. Aby nawet nie by\u0142o pokusy do przepisania go na sw\u00f3j spos\u00f3b. <\/p>\n<p><\/p>\n<p>Oczywistym rozwi\u0105zaniem dla administratora systemu pozostaj\u0105 r\u00f3\u017cne syslogi w takiej ilo\u015bci (syslog-ng\/rsyslog\/nxlog).<\/p>\n<p><\/p>\n<p>Lub napisa\u0107 co\u015b w\u0142asnego, ale to odrzucili\u015bmy, podobnie jak filebeat. Je\u015bli co\u015b pisa\u0107, to lepiej tworzy\u0107 co\u015b u\u017cytecznego dla biznesu. Do dostarczania log\u00f3w lepiej wzi\u0105\u0107 co\u015b gotowego.<\/p>\n<p><\/p>\n<p>Dlatego wyb\u00f3r sprowadza\u0142 si\u0119 w\u0142a\u015bciwie do decyzji mi\u0119dzy syslog-ng a rsyslog. Skusi\u0142em si\u0119 na rsyslog, poniewa\u017c w Puppet mieli\u015bmy ju\u017c klasy dla rsyslog i nie zauwa\u017cy\u0142em mi\u0119dzy nimi oczywistej r\u00f3\u017cnicy. Tam syslog, tu syslog. Tak, u niekt\u00f3rych dokumentacja jest gorsza, u innych lepsza. Ten robi tak, a tamten \u2014 inaczej.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Jurij Buszmeliew \u201eMapa grbe\u0144 na polu zbierania i dostarczania log\u00f3w\u201d \u2014 transkrypcja wyk\u0142adu\" src=\"\/wp-content\/uploads\/2019\/04\/a88116711b547fa5b2b34daf72cc4220.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>A teraz troch\u0119 o rsyslog. Po pierwsze, jest \u015bwietny, poniewa\u017c ma wiele modu\u0142\u00f3w. Posiada zrozumia\u0142y dla cz\u0142owieka RainerScript (nowoczesny j\u0119zyk konfiguracji). Fantastycznym bonusem jest to, \u017ce mogli\u015bmy za pomoc\u0105 standardowych narz\u0119dzi zasymulowa\u0107 zachowanie td-agent, a dla aplikacji nic si\u0119 nie zmieni\u0142o. To znaczy, zmieniamy td-agent na rsyslog, a wszystko inne na razie zostawiamy. I od razu uzyskujemy dzia\u0142aj\u0105c\u0105 dostaw\u0119. Ponadto mmnormalize to niesamowita rzecz w rsyslog. Pozwala analizowa\u0107 logi, ale nie za pomoc\u0105 Grok i regexp. Tworzy abstrakcyjny drzewo sk\u0142adniowe. Analizuje logi mniej wi\u0119cej tak, jak kompilator analizuje kod \u017ar\u00f3d\u0142owy. Dzi\u0119ki temu dzia\u0142a bardzo szybko, zu\u017cywa ma\u0142o CPU i w og\u00f3le, naprawd\u0119 \u015bwietna rzecz. Jest mn\u00f3stwo innych bonus\u00f3w. Nie b\u0119d\u0119 si\u0119 nad nimi zatrzymywa\u0142.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Jurij Buszmeliew \u201eMapa grbe\u0144 na polu zbierania i dostarczania log\u00f3w\u201d \u2014 transkrypcja wyk\u0142adu\" src=\"\/wp-content\/uploads\/2019\/04\/ca811be9f9ff318fb8c8bbf3dc45a038.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Rsyslog ma jeszcze wiele wad. S\u0105 one mniej wi\u0119cej takie same, jak bonusy. G\u0142\u00f3wne problemy \u2014 trzeba umie\u0107 go skonfigurowa\u0107 i dobra\u0107 odpowiedni\u0105 wersj\u0119.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Jurij Buszmeliew \u201eMapa grbe\u0144 na polu zbierania i dostarczania log\u00f3w\u201d \u2014 transkrypcja wyk\u0142adu\" src=\"\/wp-content\/uploads\/2019\/04\/034f588e0834b1d4e4873d9c3dbd0873.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Zdecydowali\u015bmy, \u017ce b\u0119dziemy pisa\u0107 logi do gniazda unix. I to nie do \/dev\/log, poniewa\u017c tam mamy ba\u0142agan z systemowymi logami, tam journald jest w tym pipeline. Dlatego piszmy do niestandardowego gniazda. Przypniemy je do oddzielnego zestawu regu\u0142. Nie b\u0119dziemy niczego miesza\u0107. Wszystko b\u0119dzie przejrzyste i zrozumia\u0142e. Tak w\u0142a\u015bnie zrobili\u015bmy. Katalog z tymi gniazdami jest standaryzowany i przesy\u0142any do wszystkich kontener\u00f3w. Kontenery mog\u0105 widzie\u0107 potrzebne sobie gniazdo, otwiera\u0107 je i pisa\u0107 do niego. <\/p>\n<p><\/p>\n<p>Dlaczego nie plik? Poniewa\u017c wszyscy czytali <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/badoo\/blog\/280606\/\">artyku\u0142 o Badu\u015bce<\/a><\/noindex>, kt\u00f3ra pr\u00f3bowa\u0142a przekaza\u0107 plik do dockera i odkrywa\u0142a, \u017ce po restarcie rsyslog zmienia descriptor pliku, a docker gubi ten plik. Trzyma otwarty jaki\u015b inny, ale ju\u017c nie to gniazdo, do kt\u00f3rego pisz\u0105. Postanowili\u015bmy, \u017ce obejdziemy ten problem i jednocze\u015bnie obiegnziemy problem blokady.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Jurij Buszmeliew \u201eMapa grbe\u0144 na polu zbierania i dostarczania log\u00f3w\u201d \u2014 transkrypcja wyk\u0142adu\" src=\"\/wp-content\/uploads\/2019\/04\/78db15581a68ce16d11f5ebe7e6fe04e.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Rsyslog wykonuje czynno\u015bci wskazane na slajdzie i wysy\u0142a logi albo do relaya, albo do Kafka. Kafka odpowiada starym sposobom. Relay \u2014 to pr\u00f3bowa\u0142em u\u017cy\u0107 czysto rsyslog do dostarczania log\u00f3w. Bez Message Queue, standardowymi \u015brodkami rsyslog. W zasadzie, to dzia\u0142a.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Jurij Buszmeliew \u201eMapa grbe\u0144 na polu zbierania i dostarczania log\u00f3w\u201d \u2014 transkrypcja wyk\u0142adu\" src=\"\/wp-content\/uploads\/2019\/04\/e61a25005ecbdc86d9de3215ee6fb97e.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>S\u0105 jednak pewne niuanse dotycz\u0105ce tego, jak nast\u0119pnie umieszcza\u0107 je w tej cz\u0119\u015bci (Logstash\/Graylog\/ES). Ta cz\u0119\u015b\u0107 (rsyslog-rsyslog) jest u\u017cywana mi\u0119dzy centrum danych. Tutaj znajduje si\u0119 skompresowane \u0142\u0105cze TCP, kt\u00f3re pozwala zaoszcz\u0119dzi\u0107 pasmo i odpowiednio zwi\u0119ksza prawdopodobie\u0144stwo, \u017ce otrzymamy jakie\u015b logi z innego centrum danych w warunkach, kiedy kana\u0142 jest zablokowany. Poniewa\u017c mamy Indonezj\u0119, gdzie sytuacja jest z\u0142a. Tam ta problematyka wyst\u0119puje na sta\u0142e.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Jurij Buszmeliew \u201eMapa grbe\u0144 na polu zbierania i dostarczania log\u00f3w\u201d \u2014 transkrypcja wyk\u0142adu\" src=\"\/wp-content\/uploads\/2019\/04\/7509ba360be2db4dec0c8679225d285f.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Zastanawiali\u015bmy si\u0119, jak w\u0142a\u015bciwie monitorowa\u0107, z jakim prawdopodobie\u0144stwem logi, kt\u00f3re zapisali\u015bmy z aplikacji, docieraj\u0105 do drugiego ko\u0144ca? Postanowili\u015bmy zebra\u0107 metryki. Rsyslog ma sw\u00f3j modu\u0142 zbierania statystyk, w kt\u00f3rym znajduj\u0105 si\u0119 r\u00f3\u017cne liczniki. Na przyk\u0142ad mo\u017ce pokaza\u0107 ci rozmiar kolejki, lub ile wiadomo\u015bci dotar\u0142o w danej akcji. Mo\u017cna z nich co\u015b wyci\u0105gn\u0105\u0107. Ponadto ma w\u0142asne liczniki, kt\u00f3re mo\u017cna dostosowa\u0107, a on b\u0119dzie ci pokazywa\u0142, na przyk\u0142ad, liczb\u0119 wiadomo\u015bci, kt\u00f3re zapisa\u0142o jakie\u015b API. Nast\u0119pnie napisa\u0142em rsyslog_exporter w Pythonie i wys\u0142ali\u015bmy to wszystko do Prometheus, tworz\u0105c wykresy. Bardzo chcieli\u015bmy metryk Graylog, ale jeszcze nie zd\u0105\u017cyli\u015bmy ich skonfigurowa\u0107.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Jurij Buszmeliew \u201eMapa grbe\u0144 na polu zbierania i dostarczania log\u00f3w\u201d \u2014 transkrypcja wyk\u0142adu\" src=\"\/wp-content\/uploads\/2019\/04\/ef9bd61fc43e056b4a56240c85e7fd20.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Z jakimi problemami si\u0119 zmierzyli\u015bmy? Problemy pojawi\u0142y si\u0119, gdy odkryli\u015bmy (NIESPODZIEWANIE!), \u017ce nasze Live API zapisuj\u0105 50 tys. wiadomo\u015bci na sekund\u0119. To tylko Live API bez stagingu. A Graylog pokazuje nam tylko 12 tysi\u0119cy wiadomo\u015bci na sekund\u0119. I pojawi\u0142o si\u0119 uzasadnione pytanie, gdzie s\u0105 pozosta\u0142e? Z czego wnioskujemy, \u017ce Graylog po prostu nie daje sobie rady. Spojrzeli\u015bmy i rzeczywi\u015bcie, Graylog z Elasticsearch nie radzi\u0142 sobie z tym ruchem.<\/p>\n<p><\/p>\n<p>Dalej, inne odkrycia, kt\u00f3re poczynili\u015bmy w trakcie.<\/p>\n<p><\/p>\n<p>Zapis do gniazda jest blokowany. Jak to si\u0119 sta\u0142o? Kiedy u\u017cywa\u0142em rsyslog do dostarczania, w pewnym momencie zepsu\u0142o si\u0119 po\u0142\u0105czenie mi\u0119dzy centrami danych. W jednym miejscu zatrzyma\u0142a si\u0119 dostawa, inne miejsce r\u00f3wnie\u017c. Wszystko dotar\u0142o do maszyny z API, kt\u00f3re zapisuj\u0105 do gniazda rsyslog. Tam zape\u0142ni\u0142a si\u0119 kolejka. Nast\u0119pnie zape\u0142ni\u0142a si\u0119 kolejka do zapisu w uniksowym gnie\u017adzie, kt\u00f3ra domy\u015blnie wynosi 128 pakiet\u00f3w. A nast\u0119pny write() w aplikacji zostaje zablokowany. Kiedy patrzyli\u015bmy na bibliotek\u0119, kt\u00f3rej u\u017cywamy w aplikacjach na Go, napisano, \u017ce zapis do gniazda odbywa si\u0119 w trybie nieblokuj\u0105cym. Byli\u015bmy pewni, \u017ce nic nie jest blokowane. Poniewa\u017c czytali\u015bmy. <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/badoo\/blog\/280606\/\">artyku\u0142 o Badu\u015bce<\/a><\/noindex>, kt\u00f3ra o tym napisa\u0142a. Ale jest jeden problem. Wok\u00f3\u0142 tego wywo\u0142ania by\u0142a jeszcze niesko\u0144czona p\u0119tla, w kt\u00f3rej nieustannie pr\u00f3bowa\u0142o si\u0119 w\u0142o\u017cy\u0107 wiadomo\u015b\u0107 do gniazda. To umkn\u0119\u0142o naszej uwadze. Musieli\u015bmy przepisali bibliotek\u0119. Od tego czasu zmienia\u0142a si\u0119 ona kilka razy, ale teraz pozbyli\u015bmy si\u0119 blokad we wszystkich podsystemach. Dlatego mo\u017cna zatrzyma\u0107 rsyslog i nic si\u0119 nie stanie.<\/p>\n<p><\/p>\n<p>Nale\u017cy monitorowa\u0107 rozmiar kolejek, co pomaga unikn\u0105\u0107 tych pu\u0142apek. Po pierwsze, mo\u017cemy monitorowa\u0107, kiedy zaczynamy traci\u0107 wiadomo\u015bci. Po drugie, mo\u017cemy monitorowa\u0107, \u017ce mamy w zasadzie problemy z dostarczaniem.<\/p>\n<p><\/p>\n<p>I jeszcze jeden nieprzyjemny aspekt \u2014 amplifikacja 10 razy w architekturze mikroserwisowej \u2014 to bardzo \u0142atwe. Mamy niewiele przychodz\u0105cych zapyta\u0144, ale z powodu grafu, po kt\u00f3rym te wiadomo\u015bci dalej przebiegaj\u0105, z powodu log\u00f3w dost\u0119pu, rzeczywi\u015bcie zwi\u0119kszamy obci\u0105\u017cenie log\u00f3w oko\u0142o dziesi\u0119ciokrotnie. Niestety nie zd\u0105\u017cy\u0142em policzy\u0107 dok\u0142adnych cyfr, ale mikroserwisy \u2014 tak ju\u017c s\u0105. Trzeba to mie\u0107 na uwadze. Mamy wi\u0119c sytuacj\u0119, \u017ce w tej chwili podsystem zbierania log\u00f3w jest najbardziej obci\u0105\u017cony w Lazada. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Jurij Buszmeliew \u201eMapa grbe\u0144 na polu zbierania i dostarczania log\u00f3w\u201d \u2014 transkrypcja wyk\u0142adu\" src=\"\/wp-content\/uploads\/2019\/04\/d76c6d91613ff77c41b8985cee83218f.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Jak rozwi\u0105za\u0107 problem elasticsearch? Je\u015bli musisz szybko uzyska\u0107 logi w jednym miejscu, aby nie biega\u0107 po wszystkich maszynach i nie zbiera\u0107 ich tam, u\u017cyj pami\u0119ci plikowej. To dzia\u0142a niezawodnie. Mo\u017cna to zrobi\u0107 z dowolnego serwera. Wystarczy w\u0142o\u017cy\u0107 tam dyski i zainstalowa\u0107 syslog. Po tym masz gwarancj\u0119, \u017ce wszystkie logi s\u0105 w jednym miejscu. Potem mo\u017cna powoli konfigurowa\u0107 elasticsearch, graylog, lub co\u015b innego. Ale ju\u017c b\u0119dziesz mia\u0142 wszystkie logi, a co wi\u0119cej, mo\u017cesz je przechowywa\u0107 tak d\u0142ugo, jak starczy pami\u0119ci dyskowej.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Jurij Buszmeliew \u201eMapa grbe\u0144 na polu zbierania i dostarczania log\u00f3w\u201d \u2014 transkrypcja wyk\u0142adu\" src=\"\/wp-content\/uploads\/2019\/04\/571297f25de76958769f3a4b9bfbf5b9.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>W momencie mojego wyst\u0105pienia schemat wygl\u0105da\u0142 tak. Praktycznie przestali\u015bmy pisa\u0107 do pliku. Teraz prawdopodobnie wy\u0142\u0105czymy resztki. Na lokalnych maszynach, na kt\u00f3rych uruchomione s\u0105 API, przestaniemy pisa\u0107 do plik\u00f3w. Po pierwsze, istnieje pami\u0119\u0107 plikowa, kt\u00f3ra dzia\u0142a bardzo dobrze. Po drugie, na tych maszynach ci\u0105gle ko\u0144czy si\u0119 miejsce, trzeba je nieustannie monitorowa\u0107.<\/p>\n<p><\/p>\n<p>Ta cz\u0119\u015b\u0107 z Logstash i Graylog rzeczywi\u015bcie przeszkadza. Dlatego trzeba si\u0119 jej pozby\u0107. Trzeba wybra\u0107 co\u015b jednego.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Jurij Buszmeliew \u201eMapa grbe\u0144 na polu zbierania i dostarczania log\u00f3w\u201d \u2014 transkrypcja wyk\u0142adu\" src=\"\/wp-content\/uploads\/2019\/04\/4a285577708aa1c55c16a72364fa8072.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Postanowili\u015bmy zrezygnowa\u0107 z Logstash i Kibana. Mamy dzia\u0142 bezpiecze\u0144stwa. Jaki to ma zwi\u0105zek? Zwi\u0105zek polega na tym, \u017ce Kibana bez X-Pack i Shield nie pozwala na ograniczenie uprawnie\u0144 dost\u0119pu do log\u00f3w. Dlatego wybrali\u015bmy Graylog. Ma to wszystko. Nie bardzo go lubi\u0119, ale dzia\u0142a. Kupili\u015bmy nowy sprz\u0119t, zainstalowali\u015bmy tam \u015bwie\u017cego Grayloga i przenie\u015bli\u015bmy wszystkie logi z rygorystycznymi formatami do oddzielnego Grayloga. Rozwi\u0105zali\u015bmy problem z r\u00f3\u017cnymi typami tych samych p\u00f3l organizacyjnie.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Jurij Buszmeliew \u201eMapa grbe\u0144 na polu zbierania i dostarczania log\u00f3w\u201d \u2014 transkrypcja wyk\u0142adu\" src=\"\/wp-content\/uploads\/2019\/04\/91b9fdada2648ae1caec05169b11926a.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Co dok\u0142adnie wchodzi w nowego Grayloga? Po prostu zapisali\u015bmy wszystko w Dockerze. Wzi\u0119li\u015bmy sporo serwer\u00f3w, uruchomili\u015bmy trzy instancje Kafka, 7 serwer\u00f3w Grayloga w wersji 2.3 (poniewa\u017c chcieli\u015bmy Elasticsearch w wersji 5). Wszystko to dzia\u0142a\u0142o na RAID-zie z HDD. Zobaczyli\u015bmy szybko\u015b\u0107 indeksowania do 100 tysi\u0119cy wiadomo\u015bci na sekund\u0119. Zauwa\u017cyli\u015bmy, \u017ce mamy 140 terabajt\u00f3w danych tygodniowo. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Jurij Buszmeliew \u201eMapa grbe\u0144 na polu zbierania i dostarczania log\u00f3w\u201d \u2014 transkrypcja wyk\u0142adu\" src=\"\/wp-content\/uploads\/2019\/04\/05f9b3c06739548f092bbe271bf8fc54.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>I zn\u00f3w k\u0142opoty! Mamy w planach dwie wyprzeda\u017ce. Przeszli\u015bmy przez 6 milion\u00f3w wiadomo\u015bci. Nasz Graylog nie nad\u0105\u017ca przetwarza\u0107. Musimy jako\u015b przetrwa\u0107. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Jurij Buszmeliew \u201eMapa grbe\u0144 na polu zbierania i dostarczania log\u00f3w\u201d \u2014 transkrypcja wyk\u0142adu\" src=\"\/wp-content\/uploads\/2019\/04\/424aa2febc2fd903aabee4aeabb64010.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Przetrwali\u015bmy w ten spos\u00f3b. Dodali\u015bmy jeszcze kilka serwer\u00f3w i SSD. Obecnie \u017cyjemy w ten spos\u00f3b. Teraz przetwarzamy ju\u017c 160 tysi\u0119cy wiadomo\u015bci na sekund\u0119. Nie osi\u0105gn\u0119li\u015bmy jeszcze limitu, wi\u0119c na razie nie wiadomo, ile tak naprawd\u0119 mo\u017cemy z tego wyci\u0105gn\u0105\u0107. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Jurij Buszmeliew \u201eMapa grbe\u0144 na polu zbierania i dostarczania log\u00f3w\u201d \u2014 transkrypcja wyk\u0142adu\" src=\"\/wp-content\/uploads\/2019\/04\/17d84fa7de5403551e55f42345e62a1a.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Takie mamy plany na przysz\u0142o\u015b\u0107. Z nich, naprawd\u0119, najwa\u017cniejsze to high availability. Na razie go nie mamy. Kilka maszyn jest skonfigurowanych identycznie, ale wszystko przechodzi przez jedn\u0105 maszyn\u0119. Musimy po\u015bwi\u0119ci\u0107 czas na skonfigurowanie failovera mi\u0119dzy nimi.<\/p>\n<p><\/p>\n<p>Zebra\u0107 metryki z Grayloga.<\/p>\n<p><\/p>\n<p>Ustawi\u0107 limit pr\u0119dko\u015bci, aby nasze jedno, szalej\u0105ce API, nie zabi\u0142o nam pasma ani niczego innego.<\/p>\n<p><\/p>\n<p>I na koniec, podpisa\u0107 jaki\u015b SLA z deweloperami, \u017ce mo\u017cemy obs\u0142u\u017cy\u0107 tyle. Je\u015bli piszecie wi\u0119cej, to przepraszam.<\/p>\n<p><\/p>\n<p>I napisa\u0107 dokumentacj\u0119.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Jurij Buszmeliew \u201eMapa grbe\u0144 na polu zbierania i dostarczania log\u00f3w\u201d \u2014 transkrypcja wyk\u0142adu\" src=\"\/wp-content\/uploads\/2019\/04\/4a78e2834d5877f8bf17d77a44000c22.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Kr\u00f3tko m\u00f3wi\u0105c, podsumowanie wszystkiego, co przeszli\u015bmy. Po pierwsze, standardy. Po drugie, syslog \u2014 tort. Po trzecie, rsyslog dzia\u0142a dok\u0142adnie tak, jak jest napisane na slajdzie. A teraz przejd\u017amy do pyta\u0144.<\/p>\n<p><\/p>\n<p><strong>Pytania<\/strong>.<\/p>\n<p><\/p>\n<p><strong>Pytanie<\/strong>: Dlaczego w ko\u0144cu zdecydowali\u015bmy si\u0119 nie bra\u0107\u2026 (filebeat?)<\/p>\n<p><\/p>\n<p><strong>Odpowied\u017a<\/strong>: Trzeba pisa\u0107 do pliku. Bardzo nie chcia\u0142em. Kiedy twoje API wysy\u0142a tysi\u0105ce wiadomo\u015bci na sekund\u0119, nawet je\u015bli co godzin\u0119 b\u0119dziesz rotowa\u0107, to wci\u0105\u017c nie jest opcja. Mo\u017cna pisa\u0107 w pipe. Na co deweloperzy mnie zapytali: \u201eCo si\u0119 stanie, je\u015bli proces, do kt\u00f3rego piszemy, si\u0119 zawiesi\u201d? Po prostu nie znalaz\u0142em, co im odpowiedzie\u0107, i powiedzia\u0142em: \u201eC\u00f3\u017c, ok, nie r\u00f3bmy tak.\u201d<\/p>\n<p><\/p>\n<p><strong>Pytanie<\/strong>: Dlaczego nie zapisujecie log\u00f3w po prostu w HDFS?<\/p>\n<p><\/p>\n<p><strong>Odpowied\u017a<\/strong>: To nast\u0119pny krok. My\u015bleli\u015bmy o tym na pocz\u0105tku, ale obecnie nie mamy zasob\u00f3w, aby si\u0119 tym zaj\u0105\u0107, wi\u0119c pozostaje to jako rozwi\u0105zanie d\u0142ugoterminowe.<\/p>\n<p><\/p>\n<p><strong>Pytanie<\/strong>: Format kolumnowy by\u0142by bardziej odpowiedni.<\/p>\n<p><\/p>\n<p><strong>Odpowied\u017a<\/strong>: Rozumiem wszystko. Jeste\u015bmy \u201eza\u201d obiema r\u0119kami. <\/p>\n<p><\/p>\n<p><strong>Pytanie<\/strong>: Piszecie do rsyslog. Tam mo\u017cna u\u017cywa\u0107 zar\u00f3wno TCP, jak i UDP. Ale je\u015bli u\u017cywacie UDP, to jak zapewniacie dostaw\u0119?<\/p>\n<p><\/p>\n<p><strong>Odpowied\u017a<\/strong>: S\u0105 dwa momenty. Po pierwsze, od razu wszystkim m\u00f3wi\u0119, \u017ce nie gwarantujemy dostawy log\u00f3w. Kiedy programi\u015bci przychodz\u0105 i m\u00f3wi\u0105: \u201eA mo\u017ce zaczniemy tam pisa\u0107 dane finansowe, a wy b\u0119dziecie je gdzie\u015b tam przechowywa\u0107 na wypadek, gdyby co\u015b si\u0119 sta\u0142o\u201d, odpowiadamy \u201e\u015awietnie! Zacznijcie blokowa\u0107 zapis do gniazda i r\u00f3bcie to w transakcjach, aby mie\u0107 pewno\u015b\u0107, \u017ce wrzucicie to do gniazda i upewnicie si\u0119, \u017ce to odebrali\u015bmy.\u201d I w tym momencie wszyscy od razu trac\u0105 zainteresowanie. A skoro nie ma zainteresowania, to po co nam pytania? Je\u015bli nie chcecie gwarantowa\u0107 zapisu do gniazda, to po co mamy gwarantowa\u0107 dostaw\u0119? Dajemy najlepsze starania. Naprawd\u0119 staramy si\u0119 dostarczy\u0107 jak najwi\u0119cej i jak najlepiej, ale nie dajemy 100% gwarancji. Dlatego nie piszcie tam danych finansowych. Do tego s\u0105 bazy danych z transakcjami.<\/p>\n<p><\/p>\n<p><strong>Pytanie<\/strong>: Kiedy API generuje jakie\u015b wiadomo\u015bci w logach i przekazuje kontrol\u0119 mikroserwisom, czy natkn\u0119li\u015bcie si\u0119 na problem, \u017ce wiadomo\u015bci z r\u00f3\u017cnych mikroserwis\u00f3w przychodz\u0105 w niew\u0142a\u015bciwej kolejno\u015bci? To powoduje zamieszanie.<\/p>\n<p><\/p>\n<p><strong>Odpowied\u017a<\/strong>: To normalne, \u017ce przychodz\u0105 w r\u00f3\u017cnej kolejno\u015bci. Trzeba by\u0107 na to przygotowanym. Poniewa\u017c jakakolwiek dostawa w sieci nie gwarantuje porz\u0105dku, lub trzeba na to specjalnie przeznaczy\u0107 zasoby. Je\u015bli we\u017amiemy magazyny plik\u00f3w, to ka\u017cde API zapisuje logi w swoim pliku. W\u0142a\u015bciwie to rsyslog rozk\u0142ada je po katalogach. Ka\u017cde API ma swoje logi, gdzie mo\u017cna zajrze\u0107, a potem w tym logu mo\u017cna je por\u00f3wna\u0107 wed\u0142ug timestamp. Je\u015bli id\u0105 sprawdzi\u0107 w Graylog, to tam posortuj\u0105 je wed\u0142ug timestamp. Wszystko b\u0119dzie w porz\u0105dku.<\/p>\n<p><\/p>\n<p><strong>Pytanie<\/strong>: Timestamp mo\u017ce r\u00f3\u017cni\u0107 si\u0119 o milisekundy.<\/p>\n<p><\/p>\n<p><strong>Odpowied\u017a<\/strong>: Timestamp generuje samo API. W tym tkwi ca\u0142a sztuczka. Mamy NTP. API generuje timestamp ju\u017c w samej wiadomo\u015bci. To nie rsyslog go dodaje.<\/p>\n<p><\/p>\n<p><strong>Pytanie<\/strong>: Nie jest do ko\u0144ca jasne, jak przebiega interakcja pomi\u0119dzy centrami danych. W ramach jednego centrum danych wiadomo, jak zebrano i przetworzono logi. Jak odbywa si\u0119 interakcja mi\u0119dzy centrami danych? Czy ka\u017cde centrum danych funkcjonuje niezale\u017cnie?<\/p>\n<p><\/p>\n<p><strong>Odpowied\u017a<\/strong>: Prawie. Ka\u017cdy kraj znajduje si\u0119 w jednym centrum danych. Na ten moment nie mamy rozproszenia, by jeden kraj by\u0142 rozlokowany w r\u00f3\u017cnych centrach danych. Dlatego nie musimy ich \u0142\u0105czy\u0107. W ka\u017cdym centrum znajduj\u0105 si\u0119 Log Relay. To serwer Rsyslog. Tak naprawd\u0119 s\u0105 dwie maszyny zarz\u0105dzaj\u0105ce. S\u0105 one skonfigurowane identycznie. Na razie ruch przechodzi przez jedn\u0105 z nich. Ta maszyna agreguje wszystkie logi. Ma te\u017c kolejk\u0119 dyskow\u0105 na wszelki wypadek. Kompresuje logi i wysy\u0142a je do centralnego centrum danych (w Singapurze), gdzie s\u0105 nast\u0119pnie przesy\u0142ane do Grayloga. W ka\u017cdym centrum danych znajduje si\u0119 w\u0142asna przestrze\u0144 dyskowa. W przypadku, gdy utracimy \u0142\u0105czno\u015b\u0107, mamy wszystkie logi tam. Pozostan\u0105 tam. Zostan\u0105 zachowane.<\/p>\n<p><\/p>\n<p><strong>Pytanie<\/strong>: Czy w sytuacjach awaryjnych otrzymujecie logi stamt\u0105d?<\/p>\n<p><\/p>\n<p><strong>Odpowied\u017a<\/strong>: Mo\u017cna p\u00f3j\u015b\u0107 tam (do magazynu plik\u00f3w) i sprawdzi\u0107.<\/p>\n<p><\/p>\n<p><strong>Pytanie<\/strong>: Jak monitorujecie, \u017ce nie tracicie log\u00f3w?<\/p>\n<p><\/p>\n<p><strong>Odpowied\u017a<\/strong>: W rzeczywisto\u015bci tracimy je i to monitorujemy. Monitorowanie uruchomili\u015bmy miesi\u0105c temu. W bibliotece u\u017cywanej przez Go API s\u0105 metryki. Zlicza ile razy nie uda\u0142o si\u0119 zapisa\u0107 do socketu. Na ten moment istnieje sprytna heurystyka. Jest bufor. Pr\u00f3buje zapisywa\u0107 z niego wiadomo\u015bci do socketu. Je\u015bli bufor si\u0119 przepe\u0142ni, zaczyna je odrzuca\u0107. I zlicza, ile ich odrzuci\u0142. Je\u015bli zaczynaj\u0105 si\u0119 przepe\u0142nia\u0107 liczniki, dowiadujemy si\u0119 o tym. Obecnie trafiaj\u0105 te\u017c do Prometheusa, a w Grafanie mo\u017cna zobaczy\u0107 wykresy. Mo\u017cna skonfigurowa\u0107 powiadomienia. Ale na razie nie wiadomo, do kogo je wysy\u0142a\u0107.<\/p>\n<p><\/p>\n<p><strong>Pytanie<\/strong>: W Elasticsearch przechowujecie logi z replikacj\u0105. Ile macie replik?<\/p>\n<p><\/p>\n<p><strong>Odpowied\u017a<\/strong>: Jedna replika.<\/p>\n<p><\/p>\n<p><strong>Pytanie<\/strong>: To tylko jedna replika?<\/p>\n<p><\/p>\n<p><strong>Odpowied\u017a<\/strong>: To master i replika. Dane s\u0105 przechowywane w dw\u00f3ch egzemplarzach.<\/p>\n<p><\/p>\n<p><strong>Pytanie<\/strong>: Czy jako\u015b dostosowywali\u015bcie rozmiar bufora rsyslog? <\/p>\n<p><\/p>\n<p><strong>Odpowied\u017a<\/strong>: Pisz\u0119 dane do niestandardowego gniazda unix. Od razu nak\u0142ada to na nas ograniczenie do 128 kilobajt\u00f3w. Nie mo\u017cemy zapisa\u0107 wi\u0119cej. Zosta\u0142o to zapisane w standardzie. Kto chce mie\u0107 dost\u0119p do pami\u0119ci, ten musi pisa\u0107 128 kilobajt\u00f3w. Biblioteki obcinaj\u0105 dane i ustawiaj\u0105 flag\u0119, \u017ce wiadomo\u015b\u0107 zosta\u0142a obci\u0119ta. W naszym standardzie samej wiadomo\u015bci jest specjalne pole, kt\u00f3re pokazuje, czy zosta\u0142o ono obci\u0119te podczas zapisu, czy nie. Mamy wi\u0119c mo\u017cliwo\u015b\u0107 \u015bledzenia tego aspektu.<\/p>\n<p><\/p>\n<p><strong>Pytanie<\/strong>: Czy piszecie uszkodzony JSON? <\/p>\n<p><\/p>\n<p><strong>Odpowied\u017a<\/strong>: Uszkodzony JSON zostanie odrzucony albo podczas relay, bo pakiet jest za du\u017cy. Albo zostanie odrzucony przez Graylog, bo nie b\u0119dzie m\u00f3g\u0142 sparsowa\u0107 JSON. Ale s\u0105 tutaj niuanse, kt\u00f3re musimy naprawi\u0107, a te w wi\u0119kszo\u015bci maj\u0105 zwi\u0105zek z rsyslog. Ju\u017c zg\u0142osi\u0142em tam kilka problem\u00f3w, nad kt\u00f3rymi jeszcze trzeba popracowa\u0107.<\/p>\n<p><\/p>\n<p><strong>Pytanie<\/strong>: Dlaczego Kafka? Czy pr\u00f3bowali\u015bcie RabbitMQ? Graylog nie dzia\u0142a przy takich obci\u0105\u017ceniach?<\/p>\n<p><\/p>\n<p><strong>Odpowied\u017a<\/strong>: U nas nie dzia\u0142a Graylog. A Graylog nie dzia\u0142a u nas. To naprawd\u0119 problematyczny system. W rzeczywisto\u015bci nie jest potrzebny. Wola\u0142bym pisa\u0107 z rsyslog bezpo\u015brednio do elasticsearch i p\u00f3\u017aniej korzysta\u0107 z Kibana. Musimy jednak uzgodni\u0107 to z bezpiecze\u0144stwem. To mo\u017cliwa opcja naszego rozwoju, kiedy pozb\u0119dziemy si\u0119 Graylog i b\u0119dziemy u\u017cywa\u0107 Kibana. Nie ma sensu u\u017cywa\u0107 Logstash. Bo wszystko to mog\u0119 zrobi\u0107 za pomoc\u0105 rsyslog. Ma on modu\u0142 do zapisu w elasticsearch. Staramy si\u0119 jako\u015b \u017cy\u0107 z Graylog. Nawet troch\u0119 go dostosowali\u015bmy. Ale wci\u0105\u017c jest jeszcze miejsce na popraw\u0119.<\/p>\n<p><\/p>\n<p>O Kafka. Tak to historycznie si\u0119 u\u0142o\u017cy\u0142o. Kiedy przyszed\u0142em, ju\u017c istnia\u0142a i ju\u017c by\u0142y tam zapisywane logi. Po prostu uruchomili\u015bmy nasz klaster i przenie\u015bli\u015bmy do niego logi. Zarz\u0105dzamy ni\u0105, wiemy, jak si\u0119 czuje. Co do RabbitMQ... nie dogadujemy si\u0119 z RabbitMQ. Ale RabbitMQ dzia\u0142a u nas. Mamy go w produkcji i by\u0142y z nim problemy. Teraz przed wyprzeda\u017c\u0105 go poprawili\u015bmy i zacz\u0119\u0142o dzia\u0142a\u0107 normalnie. Jednak przed tym nie by\u0142em got\u00f3w wprowadzi\u0107 go do produkcji. Jest jeszcze jeden punkt. Graylog potrafi czyta\u0107 wersj\u0119 AMQP 0.9, a rsyslog potrafi pisa\u0107 wersj\u0119 AMQP 1.0. Nie ma \u017cadnego rozwi\u0105zania, kt\u00f3re potrafi\u0142oby i to, i to. Jest albo to, albo tamto. Dlatego na ten moment tylko Kafka. Ale tam te\u017c s\u0105 swoje niuanse. Poniewa\u017c omkafka tej wersji rsyslog, kt\u00f3rej u\u017cywamy, mo\u017ce straci\u0107 ca\u0142y bufor wiadomo\u015bci, kt\u00f3ry wydoby\u0142a z rsyslog. Narazie si\u0119 z tym godzimy. <\/p>\n<p><\/p>\n<p><strong>Pytanie<\/strong>: U\u017cywacie Kafki tylko dlatego, \u017ce ju\u017c j\u0105 mieli\u015bcie? Nie wykorzystujecie jej do innych cel\u00f3w?<\/p>\n<p><\/p>\n<p><strong>Odpowied\u017a<\/strong>: Kafka, kt\u00f3ra by\u0142a, jest u\u017cywana przez zesp\u00f3\u0142 Data Science. To zupe\u0142nie inny projekt, o kt\u00f3rym, niestety, nie mog\u0119 nic powiedzie\u0107. Nie jestem na bie\u017c\u0105co. By\u0142a pod opiek\u0105 zespo\u0142u Data Science. Kiedy wprowadzali logi, postanowili z niej skorzysta\u0107, \u017ceby nie instalowa\u0107 jeszcze swojej. Teraz zaktualizowali\u015bmy Graylog i utracili\u015bmy kompatybilno\u015b\u0107, poniewa\u017c tam jest stara wersja Kafki. Musieli\u015bmy za\u0142o\u017cy\u0107 w\u0142asn\u0105. Przy okazji pozbyli\u015bmy si\u0119 tych czterech temat\u00f3w na ka\u017cdy API. Zrobili\u015bmy jeden szeroki temat dla wszystkich live, jeden szeroki temat dla wszystkich staging i po prostu wszystko tam wrzucamy. Graylog jednocze\u015bnie to wszystko wydobywa.<\/p>\n<p><\/p>\n<p><strong>Pytanie<\/strong>: Po co to czarowanie z gniazdami? Czy pr\u00f3bowali\u015bcie u\u017cy\u0107 log-driver syslog dla kontener\u00f3w?<\/p>\n<p><\/p>\n<p><strong>Odpowied\u017a<\/strong>: W momencie, kiedy zajmowali\u015bmy si\u0119 tym zagadnieniem, nasze relacje z Dockerem by\u0142y napi\u0119te. To by\u0142a wersja Docker 1.0 lub 0.9. Docker sam w sobie by\u0142 do\u015b\u0107 dziwny. Po drugie, je\u015bli dodamy do niego logi... Mam niepotwierdzone podejrzenie, \u017ce przepuszcza wszystkie logi przez siebie, przez demon Dockera. Je\u015bli jedno API wariuje, pozosta\u0142e API zderzaj\u0105 si\u0119 z tym, \u017ce nie mog\u0105 wys\u0142a\u0107 stdout i stderr. Nie wiem, do czego to prowadzi. M\u00f3j instynkt podpowiada mi, \u017ce w tym miejscu nie nale\u017cy u\u017cywa\u0107 syslog drivera Dockera. Nasz dzia\u0142 testowania funkcjonalnego ma sw\u00f3j w\u0142asny ma\u0142y klaster Graylog z logami. U\u017cywaj\u0105 driver\u00f3w log\u00f3w Dockera i wydaje si\u0119, \u017ce tam wszystko dzia\u0142a dobrze. Ale oni od razu pisz\u0105 GELF do Graylog. W momencie, kiedy wszystko to zaplanowali\u015bmy, potrzebowali\u015bmy, \u017ceby to po prostu dzia\u0142a\u0142o. By\u0107 mo\u017ce p\u00f3\u017aniej, kiedy kto\u015b przyjdzie i powie, \u017ce dzia\u0142a to ju\u017c od lat normalnie, spr\u00f3bujemy.<\/p>\n<p><\/p>\n<p><strong>Pytanie<\/strong>: Realizujecie dostaw\u0119 mi\u0119dzy centrami danych za pomoc\u0105 rsyslog. Dlaczego nie przez Kafka?<\/p>\n<p><\/p>\n<p><strong>Odpowied\u017a<\/strong>: Robimy tak i tak, w rzeczywisto\u015bci. Z dw\u00f3ch powod\u00f3w. Je\u015bli kana\u0142 jest ca\u0142kowicie zablokowany, to nawet nasze skompresowane logi si\u0119 przez niego nie przechodz\u0105. A Kafka pozwala na ich po prostu utrat\u0119 w trakcie przesy\u0142ania. W ten spos\u00f3b pozbywamy si\u0119 zatykania tych log\u00f3w. W takim przypadku wykorzystujemy Kafka bezpo\u015brednio. Je\u015bli mamy dobry kana\u0142 i chcemy go zwolni\u0107, u\u017cywamy rsyslog. Ale tak naprawd\u0119 mo\u017cna go skonfigurowa\u0107 tak, aby sam odrzuca\u0142 to, co nie przesz\u0142o. Na ten moment gdzie\u015b u\u017cywamy dostawy rsyslog bezpo\u015brednio, gdzie\u015b Kafka.<\/p>\n<p>\u0179r\u00f3d\u0142o: <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\/pl\/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=\"pl_PL\" \/>\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\/pl\/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\udd47Jurij Buszmielow \u201eMapa pu\u0142apek na polu zbierania i dostarczania log\u00f3w\u201d \u2014 transkrypcja wyk\u0142adu | ProHoster","description":"Logi to wa\u017cna cz\u0119\u015b\u0107 systemu, pozwalaj\u0105ca zrozumie\u0107, czy dzia\u0142a (lub nie dzia\u0142a) zgodnie z oczekiwaniami. W kontek\u015bcie architektury mikroserwisowej, praca z logami staje si\u0119 odr\u0119bn\u0105 dyscyplin\u0105 specjalnych olimpiad.","canonical_url":"https:\/\/prohoster.info\/pl\/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":"pl_PL","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\/pl\/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\/pl\/wp-json\/wp\/v2\/posts\/32723","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/comments?post=32723"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts\/32723\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/media\/24507"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/media?parent=32723"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/categories?post=32723"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/tags?post=32723"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}