{"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\/cs\/blog\/administrirovanie\/yurij-bushmelev-karta-grablej-na-pole-sbora-i-dostavki-logov-rasshifrovka-doklada","title":{"rendered":"Jurij Bu\u0161melev \u201eMapa hrab\u011bc\u00edho pole pro sb\u011br a dod\u00e1n\u00ed kl\u00e1d\u201c \u2014 dek\u00f3dov\u00e1n\u00ed zpr\u00e1vy","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Logy jsou d\u016fle\u017eitou sou\u010d\u00e1st\u00ed syst\u00e9mu, kter\u00e1 umo\u017e\u0148uje pochopit, zda funguje (nebo nefunguje) podle o\u010dek\u00e1v\u00e1n\u00ed. V podm\u00ednk\u00e1ch mikroslu\u017eeb se pr\u00e1ce s logy st\u00e1v\u00e1 samostatnou discipl\u00ednou speci\u00e1ln\u00ed olympi\u00e1dy. Je t\u0159eba vy\u0159e\u0161it celou \u0159adu ot\u00e1zek:<\/p>\n<p><\/p>\n<ul>\n<li>jak ps\u00e1t logy z aplikace;<\/li>\n<li>kam ps\u00e1t logy;<\/li>\n<li>jak doru\u010dovat logy pro ukl\u00e1d\u00e1n\u00ed a zpracov\u00e1n\u00ed;<\/li>\n<li>jak zpracov\u00e1vat a ukl\u00e1dat logy.<\/li>\n<\/ul>\n<p><\/p>\n<p>Pou\u017eit\u00ed popul\u00e1rn\u00edch technologi\u00ed kontejnerizace p\u0159id\u00e1v\u00e1 na hromadu dal\u0161\u00edch probl\u00e9m\u016f v \u0159e\u0161en\u00ed \u00fakolu.<\/p>\n<p><\/p>\n<p>P\u0159esn\u011b o tom je v\u00fdklad zpr\u00e1vy Jurije Bu\u0161meleva \u201eMapa past\u00ed na poli sb\u011bru a doru\u010dov\u00e1n\u00ed log\u016f\u201c <\/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=\"P\u0159ehr\u00e1t 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>Kdo m\u00e1 z\u00e1jem, pros\u00edm, pokra\u010dujte d\u00e1l.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>Jmenuji se Jurij Bu\u0161melov. Pracuji v Lazad\u011b. Dnes budu vypr\u00e1v\u011bt o tom, jak jsme vytv\u00e1\u0159eli na\u0161e logy, jak jsme je sb\u00edrali a co do nich zapisujeme. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Jurij Bu\u0161melev \u201eMapa hrab\u011bc\u00edho pole pro sb\u011br a dod\u00e1n\u00ed kl\u00e1d\u201c \u2014 dek\u00f3dov\u00e1n\u00ed zpr\u00e1vy\" src=\"\/wp-content\/uploads\/2019\/04\/ece6053b1027ab3681022049ddcd79ea.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Odkud jsme? Kdo jsme? Lazada je internetov\u00fd obchod \u010d. 1 v \u0161esti zem\u00edch jihov\u00fdchodn\u00ed Asie. V\u0161echny tyto zem\u011b m\u00e1me rozd\u011blen\u00e9 mezi datov\u00e1 centra. V sou\u010dasnosti m\u00e1me celkem 4 datov\u00e1 centra. Pro\u010d je to d\u016fle\u017eit\u00e9? Proto\u017ee n\u011bkter\u00e1 rozhodnut\u00ed byla ovlivn\u011bna t\u00edm, \u017ee mezi centry existuje velmi slab\u00e9 spojen\u00ed. M\u00e1me mikroslu\u017eebn\u00ed architekturu. Byl jsem p\u0159ekvapen, kdy\u017e jsem zjistil, \u017ee u\u017e m\u00e1me 80 mikroslu\u017eeb. Kdy\u017e jsem za\u010d\u00ednal s \u00fakolem ohledn\u011b log\u016f, bylo jich pouze 20. K tomu m\u00e1me tak\u00e9 pom\u011brn\u011b velk\u00fd kus PHP legacy, se kter\u00fdm si mus\u00edme porovnat a sm\u00ed\u0159it. To v\u0161echno v sou\u010dasnosti generuje v\u00edce ne\u017e 6 milion\u016f zpr\u00e1v za minutu v cel\u00e9m syst\u00e9mu. D\u00e1le uk\u00e1\u017eu, jak se s t\u00edm sna\u017e\u00edme \u017e\u00edt, a pro\u010d to tak je.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Jurij Bu\u0161melev \u201eMapa hrab\u011bc\u00edho pole pro sb\u011br a dod\u00e1n\u00ed kl\u00e1d\u201c \u2014 dek\u00f3dov\u00e1n\u00ed zpr\u00e1vy\" src=\"\/wp-content\/uploads\/2019\/04\/0ba5fcee5064865e836cefd47c40d246.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>S t\u011bmito 6 miliony zpr\u00e1v je pot\u0159eba n\u011bjak \u017e\u00edt. Co s nimi tedy m\u00e1me ud\u011blat? 6 milion\u016f zpr\u00e1v, kter\u00e9 je pot\u0159eba:<\/p>\n<p><\/p>\n<ul>\n<li>odeslat z aplikace,<\/li>\n<li>p\u0159ijmout k doru\u010den\u00ed,<\/li>\n<li>doru\u010dit k anal\u00fdze a ulo\u017een\u00ed.<\/li>\n<li>analyzovat<\/li>\n<li>n\u011bjak uchov\u00e1vat.<\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Jurij Bu\u0161melev \u201eMapa hrab\u011bc\u00edho pole pro sb\u011br a dod\u00e1n\u00ed kl\u00e1d\u201c \u2014 dek\u00f3dov\u00e1n\u00ed zpr\u00e1vy\" src=\"\/wp-content\/uploads\/2019\/04\/a449062193c4b1757a61f5c92e270a74.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Kdy\u017e se objevily t\u0159i miliony zpr\u00e1v, m\u011bla jsem p\u0159ibli\u017en\u011b takov\u00fd v\u00fdraz. Proto\u017ee jsme za\u010d\u00ednali s n\u011bjak\u00fdmi drobn\u00fdmi. Je jasn\u00e9, \u017ee se tam zapisuj\u00ed logy aplikac\u00ed. Nap\u0159\u00edklad se nepoda\u0159ilo p\u0159ipojit k datab\u00e1zi, poda\u0159ilo se p\u0159ipojit k datab\u00e1zi, ale nepoda\u0159ilo se n\u011bco p\u0159e\u010d\u00edst. Krom\u011b toho ka\u017ed\u00fd n\u00e1\u0161 mikroslu\u017ebov\u00fd syst\u00e9m zapisuje tak\u00e9 access-log. Ka\u017ed\u00fd po\u017eadavek, kter\u00fd dorazil na mikroslu\u017ebu, je zaznamen\u00e1n do logu. Pro\u010d to d\u011bl\u00e1me? V\u00fdvoj\u00e1\u0159i cht\u011bj\u00ed m\u00edt mo\u017enost sledov\u00e1n\u00ed. V ka\u017ed\u00e9m access-logu je pole traceid, podle kter\u00e9ho speci\u00e1ln\u00ed rozhran\u00ed rozv\u00edj\u00ed celou \u0159et\u011bzec a kr\u00e1sn\u011b ukazuje sledov\u00e1n\u00ed. Sledov\u00e1n\u00ed ukazuje, jak prob\u00edhal po\u017eadavek, a to pom\u00e1h\u00e1 na\u0161im v\u00fdvoj\u00e1\u0159\u016fm rychleji se vypo\u0159\u00e1dat s ka\u017ed\u00fdm neidentifikovan\u00fdm probl\u00e9mem.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Jurij Bu\u0161melev \u201eMapa hrab\u011bc\u00edho pole pro sb\u011br a dod\u00e1n\u00ed kl\u00e1d\u201c \u2014 dek\u00f3dov\u00e1n\u00ed zpr\u00e1vy\" src=\"\/wp-content\/uploads\/2019\/04\/e13a2d37ce57e894d023ad405a2b5200.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Jak s t\u00edm \u017e\u00edt? Te\u010f v\u00e1m stru\u010dn\u011b pop\u00ed\u0161u mo\u017enosti \u2014 jak se tato probl\u00e9m v\u016fbec \u0159e\u0161\u00ed. Jak \u0159e\u0161it \u00fakol sb\u011bru, p\u0159enosu a ukl\u00e1d\u00e1n\u00ed log\u016f. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Jurij Bu\u0161melev \u201eMapa hrab\u011bc\u00edho pole pro sb\u011br a dod\u00e1n\u00ed kl\u00e1d\u201c \u2014 dek\u00f3dov\u00e1n\u00ed zpr\u00e1vy\" src=\"\/wp-content\/uploads\/2019\/04\/60af5e5db804770295741995adb37d90.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Jak zapisovat z aplikace? Je jasn\u00e9, \u017ee existuj\u00ed r\u016fzn\u00e9 zp\u016fsoby. Zejm\u00e9na existuj\u00ed osv\u011bd\u010den\u00e9 postupy, jak n\u00e1m \u0159\u00edkaj\u00ed m\u00f3dn\u00ed odborn\u00edci. Existuje star\u00e1 \u0161kola ve dvou variant\u00e1ch, jak \u0159\u00edkali na\u0161i p\u0159edkov\u00e9. Existuj\u00ed i jin\u00e9 zp\u016fsoby. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Jurij Bu\u0161melev \u201eMapa hrab\u011bc\u00edho pole pro sb\u011br a dod\u00e1n\u00ed kl\u00e1d\u201c \u2014 dek\u00f3dov\u00e1n\u00ed zpr\u00e1vy\" src=\"\/wp-content\/uploads\/2019\/04\/deab57e4ac0472a8591c0fad9e9f2910.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Se sb\u011brem log\u016f je to zhruba stejn\u00e9. Mo\u017enost\u00ed \u0159e\u0161en\u00ed t\u00e9to konkr\u00e9tn\u00ed \u010d\u00e1sti nen\u00ed tolik. U\u017e jich je v\u00edce, ale st\u00e1le jich je\u0161t\u011b nen\u00ed tolik. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Jurij Bu\u0161melev \u201eMapa hrab\u011bc\u00edho pole pro sb\u011br a dod\u00e1n\u00ed kl\u00e1d\u201c \u2014 dek\u00f3dov\u00e1n\u00ed zpr\u00e1vy\" src=\"\/wp-content\/uploads\/2019\/04\/8a6004aaeb931332983a975d0fa5c1d6.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Pokud jde o doru\u010dov\u00e1n\u00ed a n\u00e1slednou anal\u00fdzu \u2014 po\u010det variant za\u010d\u00edn\u00e1 explodovat. Nebudu popisovat ka\u017edou variantu nyn\u00ed. Mysl\u00edm, \u017ee hlavn\u00ed varianty jsou zn\u00e1m\u00e9 v\u0161em, kdo se o toto t\u00e9ma zaj\u00edmali.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Jurij Bu\u0161melev \u201eMapa hrab\u011bc\u00edho pole pro sb\u011br a dod\u00e1n\u00ed kl\u00e1d\u201c \u2014 dek\u00f3dov\u00e1n\u00ed zpr\u00e1vy\" src=\"\/wp-content\/uploads\/2019\/04\/6a0b64c7e58bc59f56aaddd27112ec51.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Uk\u00e1\u017eu v\u00e1m, jak jsme to d\u011blali v Lazad\u011b a jak to cel\u00e9 za\u010dalo. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Jurij Bu\u0161melev \u201eMapa hrab\u011bc\u00edho pole pro sb\u011br a dod\u00e1n\u00ed kl\u00e1d\u201c \u2014 dek\u00f3dov\u00e1n\u00ed zpr\u00e1vy\" src=\"\/wp-content\/uploads\/2019\/04\/20f3aa5ceea8b28733ce5399bc30f5b5.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>P\u0159ed rokem jsem p\u0159i\u0161el do Lazady a poslali m\u011b na projekt o logech. Bylo to asi takto. Log z aplikace byl zapisov\u00e1n do stdout a stderr. V\u0161echno to ud\u011blali podle posledn\u00edch trend\u016f. Ale pot\u00e9 to v\u00fdvoj\u00e1\u0159i vyhodili ze standardn\u00edch proud\u016f a pak si s t\u00edm n\u011bjak porad\u00ed specialist\u00e9 na infrastrukturu. Mezi specialisty na infrastrukturu a v\u00fdvoj\u00e1\u0159i jsou tak\u00e9 release\u0159i, kte\u0159\u00ed \u0159ekli: \u201eeee\u2026 no dob\u0159e, zabal\u00edme je do souboru jednodu\u0161e p\u0159es shell, a hotovo\u201c. A proto\u017ee to v\u0161echno bylo v kontejneru, zabalili to p\u0159\u00edmo v kontejneru, namapovali dovnit\u0159 adres\u00e1\u0159 a ulo\u017eili to tam. Mysl\u00edm, \u017ee je ka\u017ed\u00e9mu p\u0159ibli\u017en\u011b jasn\u00e9, co z toho vze\u0161lo.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Jurij Bu\u0161melev \u201eMapa hrab\u011bc\u00edho pole pro sb\u011br a dod\u00e1n\u00ed kl\u00e1d\u201c \u2014 dek\u00f3dov\u00e1n\u00ed zpr\u00e1vy\" src=\"\/wp-content\/uploads\/2019\/04\/d92e02c18a4c683c9389321e4d5412df.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Pod\u00edvejme se te\u010f trochu d\u00e1le. Jak jsme tyto logy doru\u010dovali. N\u011bkdo zvolil td-agent, co\u017e je vlastn\u011b fluentd, ale ne \u00fapln\u011b fluentd. St\u00e1le jsem nech\u00e1pal vztah mezi t\u011bmito dv\u011bma projekty, ale vypadaj\u00ed, \u017ee se t\u00fdkaj\u00ed t\u00e9ho\u017e. A tenhle fluentd, napsan\u00fd v Ruby, \u010detl soubory log\u016f, parsoval je do JSON podle n\u011bjak\u00fdch regul\u00e1rn\u00edch v\u00fdraz\u016f. Pot\u00e9 je pos\u00edlal do Kafky. P\u0159i\u010dem\u017e v Kafce m\u011blo ka\u017ed\u00e9 API 4 samostatn\u00e9 topic. Pro\u010d 4? Proto\u017ee je live, je staging a proto\u017ee existuj\u00ed stdout a stderr. V\u00fdvoj\u00e1\u0159i je vytv\u00e1\u0159ej\u00ed a infrastruktur\u00e1\u0159i je mus\u00ed vytv\u00e1\u0159et v Kafce. P\u0159i\u010dem\u017e, Kafku kontroloval jin\u00fd odd\u011blen\u00ed. Proto bylo nutn\u00e9 vytvo\u0159it ticket, aby tam vytvo\u0159ili 4 topiky pro ka\u017ed\u00e9 API. Na to se v\u0161ichni zapomn\u011bli. Celkov\u011b to byla p\u011bkn\u00e1 chaos. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Jurij Bu\u0161melev \u201eMapa hrab\u011bc\u00edho pole pro sb\u011br a dod\u00e1n\u00ed kl\u00e1d\u201c \u2014 dek\u00f3dov\u00e1n\u00ed zpr\u00e1vy\" src=\"\/wp-content\/uploads\/2019\/04\/3130f9ebfda22713cffacf10db45ca89.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Co jsme s t\u00edm d\u00e1le d\u011blali? Pos\u00edlali jsme to do Kafky. D\u00e1le z Kafky polovina log\u016f let\u011bla do Logstashi. Druh\u00e1 polovina log\u016f se d\u011blila. \u010c\u00e1st let\u011bla do jednoho Graylogu, \u010d\u00e1st \u2013 do jin\u00e9ho Graylogu. Nakonec to v\u0161echno let\u011blo do jednoho clusteru Elasticsearch. To znamen\u00e1, \u017ee cel\u00fd tento nepo\u0159\u00e1dek nakonec padl tam. Tak se to d\u011blat nem\u00e1!<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Jurij Bu\u0161melev \u201eMapa hrab\u011bc\u00edho pole pro sb\u011br a dod\u00e1n\u00ed kl\u00e1d\u201c \u2014 dek\u00f3dov\u00e1n\u00ed zpr\u00e1vy\" src=\"\/wp-content\/uploads\/2019\/04\/98bf4811c102fc12fcd1114c25886b69.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Takto to vypad\u00e1, pokud se na to pod\u00edv\u00e1me z d\u00e1lky. Tak se to d\u011blat nem\u00e1! Zde jsou \u010d\u00edsly hned ozna\u010dena probl\u00e9mov\u00e1 m\u00edsta. Je jich ve skute\u010dnosti v\u00edce, ale 6 je opravdu problematick\u00fdch, se kter\u00fdmi je t\u0159eba n\u011bco d\u011blat. O t\u011bchto m\u00edstech te\u010f pov\u00edm zvl\u00e1\u0161\u0165. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Jurij Bu\u0161melev \u201eMapa hrab\u011bc\u00edho pole pro sb\u011br a dod\u00e1n\u00ed kl\u00e1d\u201c \u2014 dek\u00f3dov\u00e1n\u00ed zpr\u00e1vy\" src=\"\/wp-content\/uploads\/2019\/04\/69f7682e6677bdda3068d6dea4db7732.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Tady (1,2,3) se p\u00ed\u0161\u00ed soubory a tedy zde hned t\u0159i p\u0159ek\u00e1\u017eky. <\/p>\n<p><\/p>\n<p>Za prv\u00e9 (1) \u2013 mus\u00edme je n\u011bkam ps\u00e1t. Ne v\u017edy bych cht\u011bl d\u00e1t API mo\u017enost ps\u00e1t p\u0159\u00edmo do souboru. Bylo by \u017e\u00e1douc\u00ed, aby API bylo izolov\u00e1no v kontejneru, a je\u0161t\u011b l\u00e9pe \u2013 aby bylo read-only. Jsem syst\u00e9mov\u00fd administr\u00e1tor, tak\u017ee m\u00e1m trochu alternativn\u00ed pohled na tyto v\u011bci.<\/p>\n<p><\/p>\n<p>Druh\u00fd bod (2,3) \u2013 m\u00e1me spoustu dotaz\u016f, kter\u00e9 p\u0159ich\u00e1zej\u00ed do API. API zapisuje spoustu dat do souboru. Soubory rostou. Mus\u00edme je rotovat. Jinak si \u017e\u00e1dn\u00e9 disky nepo\u0159\u00edd\u00edme. Rotace je obt\u00ed\u017en\u00e1, proto\u017ee jsou provedeny p\u0159esm\u011brov\u00e1n\u00edm p\u0159es shell do adres\u00e1\u0159e. Nen\u00ed mo\u017en\u00e9 je rotovat. Nelze \u0159\u00edct aplikaci, aby znovu otev\u0159ela deskriptory. Proto\u017ee na v\u00e1s v\u00fdvoj\u00e1\u0159i budou koukat jako na bl\u00e1zna: \u201eJak\u00e9 deskriptory? My v\u016fbec p\u00ed\u0161eme do stdout.\u201c Infrastrukturov\u00e9 t\u00fdmy vytvo\u0159ily copytruncate v logrotate, kter\u00fd prost\u011b ud\u011bl\u00e1 kopii souboru a truncatne origin\u00e1l. Odpov\u00eddaj\u00edc\u00edm zp\u016fsobem se mezi t\u011bmito procesy kop\u00edrov\u00e1n\u00ed obvykle vy\u010derp\u00e1 m\u00edsto na disku.<\/p>\n<p><\/p>\n<p>(4) M\u011bli jsme r\u016fzn\u00e9 form\u00e1ty v r\u016fzn\u00fdch API. Trochu se li\u0161ily, ale bylo t\u0159eba ps\u00e1t r\u016fzn\u00e9 regexp. Vzhledem k tomu, \u017ee cel\u00e9 to spravoval Puppet, byla tam velk\u00e1 hromada t\u0159\u00edd se sv\u00fdmi probl\u00e9my. Krom\u011b toho td-agent v\u011bt\u0161inu \u010dasu mohl j\u00edst pam\u011b\u0165, zpomalovat, mohl prost\u011b d\u011blat, \u017ee pracuje, a nic ned\u011blat. Zven\u010d\u00ed bylo nemo\u017en\u00e9 poznat, \u017ee nic ned\u011bl\u00e1. V tom lep\u0161\u00edm p\u0159\u00edpad\u011b spadne a n\u011bkdo ho pozd\u011bji znovu zvedne. P\u0159esn\u011bji, p\u0159ilet\u00ed alert a n\u011bkdo p\u016fjde a zvedne ho ru\u010dn\u011b. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Jurij Bu\u0161melev \u201eMapa hrab\u011bc\u00edho pole pro sb\u011br a dod\u00e1n\u00ed kl\u00e1d\u201c \u2014 dek\u00f3dov\u00e1n\u00ed zpr\u00e1vy\" src=\"\/wp-content\/uploads\/2019\/04\/424cda2b60e9e5669b7ef2b34ca74e48.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>(6) A to nejhor\u0161\u00ed \u2013 to byl elasticsearch. Proto\u017ee to byla star\u00e1 verze. Proto\u017ee jsme v t\u00e9 dob\u011b nem\u011bli dedikovan\u00e9 master servery. M\u011bli jsme heterogenn\u00ed logy, jejich\u017e pole se mohla p\u0159ekr\u00fdvat. R\u016fzn\u00e9 logy r\u016fzn\u00fdch aplikac\u00ed mohly b\u00fdt zapisov\u00e1ny se stejn\u00fdmi n\u00e1zvy pol\u00ed, ale uvnit\u0159 mohly m\u00edt r\u016fzn\u00e1 data. To znamen\u00e1, \u017ee jeden log p\u0159ich\u00e1z\u00ed s Integer v poli, nap\u0159\u00edklad level. Druh\u00fd log p\u0159ich\u00e1z\u00ed se String v poli level. P\u0159i absenci statick\u00e9ho mapov\u00e1n\u00ed vznik\u00e1 takov\u00e1 podivn\u00e1 situace. Pokud po rotaci indexu v elasticsearch jako prvn\u00ed p\u0159\u00edjde zpr\u00e1va se \u0159et\u011bzcem, \u017eijeme norm\u00e1ln\u011b. A pokud jako prvn\u00ed p\u0159\u00edjde s Integer, v\u0161echny n\u00e1sleduj\u00edc\u00ed zpr\u00e1vy, kter\u00e9 p\u0159\u00edjdou se String, jsou prost\u011b odm\u00edt\u00e1ny. Proto\u017ee typ pole se neshoduje.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Jurij Bu\u0161melev \u201eMapa hrab\u011bc\u00edho pole pro sb\u011br a dod\u00e1n\u00ed kl\u00e1d\u201c \u2014 dek\u00f3dov\u00e1n\u00ed zpr\u00e1vy\" src=\"\/wp-content\/uploads\/2019\/04\/bc869f827bed326792857113191bb028.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Za\u010dali jsme si kl\u00e1st tyto ot\u00e1zky. Rozhodli jsme se nevyhled\u00e1vat vin\u00edky.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Jurij Bu\u0161melev \u201eMapa hrab\u011bc\u00edho pole pro sb\u011br a dod\u00e1n\u00ed kl\u00e1d\u201c \u2014 dek\u00f3dov\u00e1n\u00ed zpr\u00e1vy\" src=\"\/wp-content\/uploads\/2019\/04\/a071a4b38462f249339c988c35463639.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Je t\u0159eba n\u011bco ud\u011blat! Je z\u0159ejm\u00e9, \u017ee mus\u00edme zav\u00e9st standardy. N\u011bkter\u00e9 standardy u\u017e m\u00e1me. N\u011bkter\u00e9 jsme zavedli pozd\u011bji. Na\u0161t\u011bst\u00ed byl v t\u00e9 dob\u011b schv\u00e1len jednotn\u00fd form\u00e1t log\u016f pro v\u0161echny API. Ten je uveden p\u0159\u00edmo ve standardech spolupr\u00e1ce slu\u017eeb. Tak\u017ee ti, kdo cht\u011bj\u00ed p\u0159ij\u00edmat logy, mus\u00ed je ps\u00e1t v tomto form\u00e1tu. Pokud n\u011bkdo nep\u00ed\u0161e logy v tomto form\u00e1tu, pak nic nezaru\u010dujeme. <\/p>\n<p><\/p>\n<p>D\u00e1le bych cht\u011bl zav\u00e9st jednotn\u00fd standard pro zapisov\u00e1n\u00ed, doru\u010dov\u00e1n\u00ed a shroma\u017e\u010fov\u00e1n\u00ed log\u016f. O skute\u010dnosti, kam je ps\u00e1t, a \u010d\u00edm je doru\u010dovat. Ide\u00e1ln\u00ed situace je, kdy\u017e se v projektech pou\u017e\u00edv\u00e1 jedna a ta sam\u00e1 knihovna. M m\u00e1me zvl\u00e1\u0161tn\u00ed knihovnu pro logov\u00e1n\u00ed pro Go, m\u00e1me zvl\u00e1\u0161tn\u00ed knihovnu pro PHP. V\u0161ichni, kdo u n\u00e1s jsou, by m\u011bli tyto knihovny pou\u017e\u00edvat. V sou\u010dasn\u00e9 dob\u011b bych \u0159ekl, \u017ee to m\u00e1me na 80 %. Ale n\u011bkte\u0159\u00ed st\u00e1le jed\u00ed kaktusy.<\/p>\n<p><\/p>\n<p>A tam, na slidu, se pomalu za\u010d\u00edn\u00e1 objevovat \"SLA pro doru\u010dov\u00e1n\u00ed log\u016f\". Zat\u00edm to nem\u00e1me, ale pracujeme na tom. Proto\u017ee je to velmi pohodln\u00e9, kdy\u017e infrastruktura \u0159\u00edk\u00e1, \u017ee pokud p\u00ed\u0161ete v ur\u010dit\u00e9m form\u00e1tu na ur\u010dit\u00e9 m\u00edsto a ne v\u00edce ne\u017e N zpr\u00e1v za sekundu, tak to s ur\u010ditou pravd\u011bpodobnost\u00ed doru\u010d\u00edme tam. To odstra\u0148uje spoustu bolest\u00ed hlavy. Pokud SLA existuje, je to \u00fa\u017easn\u00e9!<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Jurij Bu\u0161melev \u201eMapa hrab\u011bc\u00edho pole pro sb\u011br a dod\u00e1n\u00ed kl\u00e1d\u201c \u2014 dek\u00f3dov\u00e1n\u00ed zpr\u00e1vy\" src=\"\/wp-content\/uploads\/2019\/04\/a887aceac13135afe90bb5f5a5ec1d26.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Jak jsme za\u010dali \u0159e\u0161it probl\u00e9m? Hlavn\u00edm probl\u00e9mem byl td-agent. Nebylo jasn\u00e9, kam logy miz\u00ed. Doru\u010duj\u00ed se? Shroma\u017e\u010fuj\u00ed se? Kde jsou v\u016fbec? Proto bylo prvn\u00edm krokem rozhodnuto nahradit td-agent. Mo\u017enosti, \u010d\u00edm jej nahradit, jsem zde stru\u010dn\u011b na\u010drtl.<\/p>\n<p><\/p>\n<p>Fluentd. Za prv\u00e9, setkal jsem se s n\u00edm v p\u0159edchoz\u00ed pr\u00e1ci a tam tak\u00e9 ob\u010das padal. Za druh\u00e9, je to tot\u00e9\u017e, jen v profilu. <\/p>\n<p><\/p>\n<p>Filebeat. \u010c\u00edm byl pro n\u00e1s v\u00fdhodn\u00fd? T\u00edm, \u017ee je na Go, a my m\u00e1me velkou odbornost v Go. Pokud by bylo t\u0159eba, mohli bychom ho n\u011bjak upravit. Proto jsme ho nevzali. Aby ani nebylo poku\u0161en\u00ed za\u010d\u00edt ho p\u0159episovat. <\/p>\n<p><\/p>\n<p>Z\u0159ejm\u00fdm \u0159e\u0161en\u00edm pro sysadmina z\u016fst\u00e1vaj\u00ed r\u016fzn\u00e9 syslogy v takov\u00e9m mno\u017estv\u00ed (syslog-ng\/rsyslog\/nxlog).<\/p>\n<p><\/p>\n<p>Nebo napsat n\u011bco vlastn\u00edho, ale to jsme odlo\u017eili, stejn\u011b jako filebeat. Pokud bychom m\u011bli n\u011bco ps\u00e1t, je lep\u0161\u00ed napsat n\u011bco u\u017eite\u010dn\u00e9ho pro podnik\u00e1n\u00ed. Pro doru\u010dov\u00e1n\u00ed log\u016f je lep\u0161\u00ed vz\u00edt n\u011bco hotov\u00e9ho.<\/p>\n<p><\/p>\n<p>Proto\u017ee v\u00fdb\u011br se vlastn\u011b z\u00fa\u017eil na volbu mezi syslog-ng a rsyslog. Naklonil jsem se ke rsyslogu jednodu\u0161e proto, \u017ee jsme v Puppet u\u017e m\u011bli t\u0159\u00eddy pro rsyslog a nena\u0161el jsem mezi nimi zjevn\u00fd rozd\u00edl. Co je tam syslog, to je tady syslog. Ano, n\u011bkdo m\u00e1 hor\u0161\u00ed dokumentaci, n\u011bkdo lep\u0161\u00ed. Ten um\u00ed tohle, a ten jinak.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Jurij Bu\u0161melev \u201eMapa hrab\u011bc\u00edho pole pro sb\u011br a dod\u00e1n\u00ed kl\u00e1d\u201c \u2014 dek\u00f3dov\u00e1n\u00ed zpr\u00e1vy\" src=\"\/wp-content\/uploads\/2019\/04\/a88116711b547fa5b2b34daf72cc4220.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>A trochu o rsyslogu. Za prv\u00e9, je skv\u011bl\u00fd, proto\u017ee m\u00e1 spoustu modul\u016f. M\u00e1 \u010dlov\u011bku srozumiteln\u00fd RainerScript (modern\u00ed jazyk konfigurace). Skv\u011bl\u00fd bonus je, \u017ee jsme mohli jeho standardn\u00edmi prost\u0159edky simulovat chov\u00e1n\u00ed td-agent, a pro aplikace se nic nezm\u011bnilo. To znamen\u00e1, \u017ee m\u011bn\u00edme td-agent na rsyslog, a v\u0161e ostatn\u00ed zat\u00edm nevzru\u0161ujeme. A hned dost\u00e1v\u00e1me funk\u010dn\u00ed doru\u010den\u00ed. D\u00e1le, mmnormalize \u2014 to je skv\u011bl\u00e1 v\u011bc v rsyslogu. Umo\u017e\u0148uje parsovat logy, ale ne pomoc\u00ed Grok a regexp. Vytv\u00e1\u0159\u00ed abstraktn\u00ed syntaktick\u00fd strom. Parsuje logy zhruba tak, jak kompil\u00e1tor parsuje zdroj\u00e1ky. To umo\u017e\u0148uje pracovat velmi rychle, spot\u0159ebov\u00e1vat m\u00e1lo CPU, a v\u016fbec je to opravdu skv\u011bl\u00e1 v\u011bc. Je spousta dal\u0161\u00edch bonus\u016f. Na t\u011bch se nezastav\u00edm.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Jurij Bu\u0161melev \u201eMapa hrab\u011bc\u00edho pole pro sb\u011br a dod\u00e1n\u00ed kl\u00e1d\u201c \u2014 dek\u00f3dov\u00e1n\u00ed zpr\u00e1vy\" src=\"\/wp-content\/uploads\/2019\/04\/ca811be9f9ff318fb8c8bbf3dc45a038.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Rsyslog m\u00e1 tak\u00e9 spoustu nedostatk\u016f. Jsou p\u0159ibli\u017en\u011b stejn\u00e9 jako bonusy. Hlavn\u00ed probl\u00e9my \u2014 je pot\u0159eba um\u011bt ho p\u0159ipravit a je t\u0159eba vyb\u00edrat spr\u00e1vnou verzi.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Jurij Bu\u0161melev \u201eMapa hrab\u011bc\u00edho pole pro sb\u011br a dod\u00e1n\u00ed kl\u00e1d\u201c \u2014 dek\u00f3dov\u00e1n\u00ed zpr\u00e1vy\" src=\"\/wp-content\/uploads\/2019\/04\/034f588e0834b1d4e4873d9c3dbd0873.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Rozhodli jsme se, \u017ee budeme ps\u00e1t logy do unix socketu. A to ne do \/dev\/log, proto\u017ee tam m\u00e1me chaos syst\u00e9mov\u00fdch log\u016f, tam je journald v tomto pipeline. Proto poj\u010fme ps\u00e1t do vlastn\u00edho socketu. P\u0159ipoj\u00edme ho k samostatn\u00e9mu pravidlov\u00e9mu setu. Nebudeme nic m\u00edchat. V\u0161echno bude pr\u016fhledn\u00e9 a srozumiteln\u00e9. Tak jsme to vlastn\u011b ud\u011blali. Adres\u00e1\u0159 s t\u011bmito sockety je standardizovan\u00fd a prosazuje se do v\u0161ech kontejner\u016f. Kontejnery mohou vid\u011bt po\u017eadovan\u00fd socket, otev\u0159\u00edt ho a ps\u00e1t do n\u011bj. <\/p>\n<p><\/p>\n<p>Pro\u010d ne soubor? Proto\u017ee v\u0161ichni \u010detli <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/badoo\/blog\/280606\/\">\u010dl\u00e1nek o Badushce<\/a><\/noindex>, kter\u00e1 se pokou\u0161ela propasovat soubor do Dockeru a zjistilo se, \u017ee po restartu rsyslogu se m\u011bn\u00ed deskriptor souboru, a Docker ztr\u00e1c\u00ed tento soubor. Dr\u017e\u00ed otev\u0159eno n\u011bco jin\u00e9ho, ale u\u017e ne ten socket, kam p\u00ed\u0161\u00ed. Rozhodli jsme se, \u017ee tuto probl\u00e9mu obejdeme, a z\u00e1rove\u0148 se vyhneme probl\u00e9m\u016fm s blokov\u00e1n\u00edm.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Jurij Bu\u0161melev \u201eMapa hrab\u011bc\u00edho pole pro sb\u011br a dod\u00e1n\u00ed kl\u00e1d\u201c \u2014 dek\u00f3dov\u00e1n\u00ed zpr\u00e1vy\" src=\"\/wp-content\/uploads\/2019\/04\/78db15581a68ce16d11f5ebe7e6fe04e.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Rsyslog prov\u00e1d\u00ed akce uveden\u00e9 na sn\u00edmku a odes\u00edl\u00e1 logy bu\u010f do relay, nebo do Kafka. Kafka odpov\u00edd\u00e1 star\u00e9mu zp\u016fsobu. Relay \u2014 to jsem se pokusil pou\u017e\u00edt \u010dist\u011b rsyslog pro doru\u010dov\u00e1n\u00ed log\u016f. Bez Message Queue, standardn\u00edmi prost\u0159edky rsyslogu. V z\u00e1sad\u011b to funguje.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Jurij Bu\u0161melev \u201eMapa hrab\u011bc\u00edho pole pro sb\u011br a dod\u00e1n\u00ed kl\u00e1d\u201c \u2014 dek\u00f3dov\u00e1n\u00ed zpr\u00e1vy\" src=\"\/wp-content\/uploads\/2019\/04\/e61a25005ecbdc86d9de3215ee6fb97e.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ale jsou ur\u010dit\u00e9 nuan\u010dn\u00ed ot\u00e1zky ohledn\u011b toho, jak je pozd\u011bji dostat do t\u00e9to \u010d\u00e1sti (Logstash\/Graylog\/ES). Tato \u010d\u00e1st (rsyslog-rsyslog) se pou\u017e\u00edv\u00e1 mezi datov\u00fdmi centry. Zde je komprimovan\u00e1 TCP linka, kter\u00e1 \u0161et\u0159\u00ed \u0161\u00ed\u0159ku p\u00e1sma a t\u00edm zvy\u0161uje pravd\u011bpodobnost, \u017ee z\u00edsk\u00e1me n\u011bjak\u00e9 logy z jin\u00e9ho datacentra v podm\u00ednk\u00e1ch, kdy je linka p\u0159et\u00ed\u017eena. Proto\u017ee m\u00e1me Indon\u00e9sii, kde je situace \u0161patn\u00e1. Tam je to neust\u00e1l\u00fd probl\u00e9m.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Jurij Bu\u0161melev \u201eMapa hrab\u011bc\u00edho pole pro sb\u011br a dod\u00e1n\u00ed kl\u00e1d\u201c \u2014 dek\u00f3dov\u00e1n\u00ed zpr\u00e1vy\" src=\"\/wp-content\/uploads\/2019\/04\/7509ba360be2db4dec0c8679225d285f.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Zamysleli jsme se nad t\u00edm, jak vlastn\u011b monitorovat pravd\u011bpodobnost, \u017ee logy, kter\u00e9 jsme z aplikace zaznamenali, doraz\u00ed na druh\u00fd konec? Rozhodli jsme se zav\u00e9st metriky. Rsyslog m\u00e1 sv\u016fj modul pro sb\u011br statistik, kter\u00fd obsahuje r\u016fzn\u00e9 po\u010d\u00edtadla. Nap\u0159\u00edklad m\u016f\u017ee uk\u00e1zat velikost fronty, nebo kolik zpr\u00e1v p\u0159i\u0161lo v ur\u010dit\u00e9 akci. Z toho u\u017e lze n\u011bco vyvodit. Nav\u00edc m\u00e1 vlastn\u00ed po\u010d\u00edtadla, kter\u00e1 lze nastavit, a on v\u00e1m uk\u00e1\u017ee nap\u0159\u00edklad po\u010det zpr\u00e1v, kter\u00e9 zaznamenalo ur\u010dit\u00e9 API. D\u00e1le jsem napsal rsyslog_exporter na Pythonu a v\u0161echno jsme to poslali do Promethea a vytvo\u0159ili grafy. Na metriky Graylog jsme se velmi t\u011b\u0161ili, ale zat\u00edm jsme je nestihli nastavit.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Jurij Bu\u0161melev \u201eMapa hrab\u011bc\u00edho pole pro sb\u011br a dod\u00e1n\u00ed kl\u00e1d\u201c \u2014 dek\u00f3dov\u00e1n\u00ed zpr\u00e1vy\" src=\"\/wp-content\/uploads\/2019\/04\/ef9bd61fc43e056b4a56240c85e7fd20.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>S \u010d\u00edm jsme m\u011bli probl\u00e9my? Probl\u00e9my nastaly, kdy\u017e jsme zjistili (NE\u010cEKAN\u011a!), \u017ee na\u0161e Live API pos\u00edl\u00e1 50k zpr\u00e1v za sekundu. To je jen Live API bez stagingu. A Graylog n\u00e1m ukazuje jen 12 tis\u00edc zpr\u00e1v za sekundu. A vznikla opr\u00e1vn\u011bn\u00e1 ot\u00e1zka, kde jsou zbytky? Z \u010deho\u017e jsme usoudili, \u017ee Graylog jednodu\u0161e nezvl\u00e1d\u00e1. Pod\u00edvali jsme se a opravdu, Graylog s Elasticsearch neunesli toto zat\u00ed\u017een\u00ed.<\/p>\n<p><\/p>\n<p>D\u00e1le jsme b\u011bhem procesu ud\u011blali dal\u0161\u00ed zji\u0161t\u011bn\u00ed.<\/p>\n<p><\/p>\n<p>Z\u00e1pis do socketu je blokov\u00e1n. Jak k tomu do\u0161lo? Kdy\u017e jsem pou\u017e\u00edval rsyslog pro doru\u010dov\u00e1n\u00ed, v ur\u010dit\u00e9m okam\u017eiku do\u0161lo k poru\u0161e linky mezi datov\u00fdmi centry. Doru\u010dov\u00e1n\u00ed se zastavilo na jednom m\u00edst\u011b a na druh\u00e9m m\u00edst\u011b. V\u0161echny tyto probl\u00e9my se dostaly na stroj s API, kter\u00e9 zapisuj\u00ed do socketu rsyslog. Fronta se naplnila. Pot\u00e9 se naplnila fronta pro z\u00e1pis do unixov\u00e9ho socketu, kter\u00e1 je ve v\u00fdchoz\u00edm nastaven\u00ed 128 paket\u016f. A n\u00e1sleduj\u00edc\u00ed write() v aplikaci je blokov\u00e1no. Kdy\u017e jsme se pod\u00edvali do knihovny, kterou pou\u017e\u00edv\u00e1me v aplikac\u00edch na Go, bylo tam naps\u00e1no, \u017ee z\u00e1pis do socketu prob\u00edh\u00e1 v neblokuj\u00edc\u00edm re\u017eimu. Byli jsme si jisti, \u017ee nic nen\u00ed blokov\u00e1no. Proto\u017ee jsme \u010detli. <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/badoo\/blog\/280606\/\">\u010dl\u00e1nek o Badushce<\/a><\/noindex>, kter\u00e1 o tom napsala. Ale je tady jeden okam\u017eik. Kolem tohoto vol\u00e1n\u00ed byl nekone\u010dn\u00fd cyklus, ve kter\u00e9m se neust\u00e1le pokou\u0161elo vlo\u017eit zpr\u00e1vu do socketu. To jsme si nev\u0161imli. Museli jsme p\u0159epsat knihovnu. Od t\u00e9 doby se n\u011bkolikr\u00e1t zm\u011bnila, ale nyn\u00ed se n\u00e1m poda\u0159ilo zbavit se zablokov\u00e1n\u00ed ve v\u0161ech subsyst\u00e9mech. Tak\u017ee m\u016f\u017eeme zastavit rsyslog a nic nespadne.<\/p>\n<p><\/p>\n<p>Je nutn\u00e9 monitorovat velikost front, co\u017e pom\u00e1h\u00e1 se vyhnout t\u011bmto probl\u00e9m\u016fm. Za prv\u00e9, m\u016f\u017eeme monitorovat, kdy za\u010d\u00edn\u00e1me ztr\u00e1cet zpr\u00e1vy. Za druh\u00e9, m\u016f\u017eeme monitorovat, \u017ee m\u00e1me obecn\u011b probl\u00e9my s dod\u00e1vkou.<\/p>\n<p><\/p>\n<p>A je\u0161t\u011b nep\u0159\u00edjemn\u00fd moment \u2014 amplifikace v 10n\u00e1sobku v mikroservisn\u00ed architektu\u0159e \u2014 je to velmi snadn\u00e9. M\u00e1me relativn\u011b m\u00e1lo p\u0159\u00edchoz\u00edch po\u017eadavk\u016f, ale kv\u016fli grafu, kter\u00fdm zpr\u00e1vy b\u011b\u017e\u00ed d\u00e1l, kv\u016fli access-log\u016fm, skute\u010dn\u011b zvy\u0161ujeme zat\u00ed\u017een\u00ed logy p\u0159ibli\u017en\u011b desetin\u00e1sobn\u011b. Omlouv\u00e1m se, \u017ee jsem nestihl spo\u010d\u00edtat p\u0159esn\u00e1 \u010d\u00edsla, ale mikroservisy takov\u00e9 jsou. To je t\u0159eba m\u00edt na pam\u011bti. Vych\u00e1z\u00ed to tak, \u017ee v sou\u010dasn\u00e9 dob\u011b je subsyst\u00e9m sb\u011bru log\u016f nejv\u00edce zat\u00ed\u017een\u00fd v Lazad\u011b. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Jurij Bu\u0161melev \u201eMapa hrab\u011bc\u00edho pole pro sb\u011br a dod\u00e1n\u00ed kl\u00e1d\u201c \u2014 dek\u00f3dov\u00e1n\u00ed zpr\u00e1vy\" src=\"\/wp-content\/uploads\/2019\/04\/d76c6d91613ff77c41b8985cee83218f.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Jak vy\u0159e\u0161it probl\u00e9m s elasticsearch? Pokud pot\u0159ebujete rychle z\u00edskat logy na jednom m\u00edst\u011b, abyste nemuseli b\u011bhat po v\u0161ech stroj\u00edch a sb\u00edrat je tam, pou\u017eijte souborov\u00e9 \u00falo\u017ei\u0161t\u011b. To funguje zaru\u010den\u011b. M\u016f\u017eete to vytvo\u0159it z jak\u00e9hokoli serveru. Sta\u010d\u00ed jen nainstalovat tam disky a nastavit syslog. Pot\u00e9 budete m\u00edt zaru\u010den\u011b v\u0161echny logy na jednom m\u00edst\u011b. Pak m\u016f\u017eete klidn\u011b postupn\u011b nastavovat elasticsearch, graylog nebo n\u011bco jin\u00e9ho. Ale u\u017e budete m\u00edt v\u0161echny logy a m\u016f\u017eete je ukl\u00e1dat, jak dlouho to disky dovol\u00ed.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Jurij Bu\u0161melev \u201eMapa hrab\u011bc\u00edho pole pro sb\u011br a dod\u00e1n\u00ed kl\u00e1d\u201c \u2014 dek\u00f3dov\u00e1n\u00ed zpr\u00e1vy\" src=\"\/wp-content\/uploads\/2019\/04\/571297f25de76958769f3a4b9bfbf5b9.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>V dob\u011b m\u00e9 p\u0159edn\u00e1\u0161ky vypadala sch\u00e9ma takto. Prakticky jsme p\u0159estali ps\u00e1t do soubor\u016f. Te\u010f, pravd\u011bpodobn\u011b, odpoj\u00edme zbytky. Na lok\u00e1ln\u00edch stroj\u00edch, na kter\u00fdch b\u011b\u017e\u00ed API, p\u0159estaneme ps\u00e1t do soubor\u016f. Za prv\u00e9, existuje souborov\u00e9 \u00falo\u017ei\u0161t\u011b, kter\u00e9 funguje velmi dob\u0159e. Za druh\u00e9, na t\u011bchto stroj\u00edch se neust\u00e1le vy\u010derp\u00e1v\u00e1 m\u00edsto, tak\u017ee je t\u0159eba ho neust\u00e1le monitorovat.<\/p>\n<p><\/p>\n<p>Tato \u010d\u00e1st s Logstash a Graylogem je skute\u010dn\u011b problematick\u00e1. Tak\u017ee se ji pot\u0159ebujeme zbavit. Je t\u0159eba vybrat n\u011bco jednoho.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Jurij Bu\u0161melev \u201eMapa hrab\u011bc\u00edho pole pro sb\u011br a dod\u00e1n\u00ed kl\u00e1d\u201c \u2014 dek\u00f3dov\u00e1n\u00ed zpr\u00e1vy\" src=\"\/wp-content\/uploads\/2019\/04\/4a285577708aa1c55c16a72364fa8072.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Rozhodli jsme se zahodit Logstash a Kibana. Proto\u017ee m\u00e1me bezpe\u010dnostn\u00ed odd\u011blen\u00ed. Jak\u00fd je vztah? Vztah je v tom, \u017ee Kibana bez X-Pack a Shield neumo\u017e\u0148uje rozd\u011blit pr\u00e1va p\u0159\u00edstupu k log\u016fm. Proto jsme vzali Graylog. Ten m\u00e1 v\u0161echno pot\u0159ebn\u00e9. Neum\u00edm si na n\u011bj zvyknout, ale funguje. Koupili jsme novou techniku, nainstalovali tam \u010derstv\u00fd Graylog a p\u0159enesli v\u0161echny logy se striktn\u00edmi form\u00e1ty do samostatn\u00e9ho Graylogu. Vy\u0159e\u0161ili jsme probl\u00e9m s r\u016fzn\u00fdmi typy stejn\u00fdch pol\u00ed organiza\u010dn\u011b.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Jurij Bu\u0161melev \u201eMapa hrab\u011bc\u00edho pole pro sb\u011br a dod\u00e1n\u00ed kl\u00e1d\u201c \u2014 dek\u00f3dov\u00e1n\u00ed zpr\u00e1vy\" src=\"\/wp-content\/uploads\/2019\/04\/91b9fdada2648ae1caec05169b11926a.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Co p\u0159esn\u011b nov\u011b zahrnuje Graylog? V\u0161echno jsme jednodu\u0161e zapsali do Dockeru. Vzali jsme spoustu server\u016f, rozbalili t\u0159i instance Kafka, 7 server\u016f Graylog verze 2.3 (proto\u017ee jsme cht\u011bli Elasticsearch verzi 5). V\u0161echno bylo na RAID z HDD. Vid\u011bli jsme indexa\u010dn\u00ed rychlost a\u017e 100 tis\u00edc zpr\u00e1v za sekundu. Vid\u011bli jsme \u010d\u00edslo, \u017ee m\u00e1me 140 terabajt\u016f dat za t\u00fdden. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Jurij Bu\u0161melev \u201eMapa hrab\u011bc\u00edho pole pro sb\u011br a dod\u00e1n\u00ed kl\u00e1d\u201c \u2014 dek\u00f3dov\u00e1n\u00ed zpr\u00e1vy\" src=\"\/wp-content\/uploads\/2019\/04\/05f9b3c06739548f092bbe271bf8fc54.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>A zase jsme narazili na probl\u00e9my! \u010cekaj\u00ed n\u00e1s dv\u011b v\u00fdprodeje. P\u0159esunuli jsme se k 6 milion\u016fm zpr\u00e1v. N\u00e1\u0161 Graylog nesta\u010d\u00ed zpracov\u00e1vat. Mus\u00edme n\u011bjak p\u0159e\u017e\u00edt. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Jurij Bu\u0161melev \u201eMapa hrab\u011bc\u00edho pole pro sb\u011br a dod\u00e1n\u00ed kl\u00e1d\u201c \u2014 dek\u00f3dov\u00e1n\u00ed zpr\u00e1vy\" src=\"\/wp-content\/uploads\/2019\/04\/424aa2febc2fd903aabee4aeabb64010.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>P\u0159e\u017eili jsme takto. P\u0159idali jsme p\u00e1r server\u016f a SSD. V sou\u010dasnosti \u017eijeme t\u00edmto zp\u016fsobem. Te\u010f zpracov\u00e1v\u00e1me u\u017e 160 tis\u00edc zpr\u00e1v za sekundu. Je\u0161t\u011b jsme nenarazili na limit, tak\u017ee zat\u00edm nen\u00ed jasn\u00e9, kolik skute\u010dn\u011b m\u016f\u017eeme vyt\u00e1hnout z tohoto. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Jurij Bu\u0161melev \u201eMapa hrab\u011bc\u00edho pole pro sb\u011br a dod\u00e1n\u00ed kl\u00e1d\u201c \u2014 dek\u00f3dov\u00e1n\u00ed zpr\u00e1vy\" src=\"\/wp-content\/uploads\/2019\/04\/17d84fa7de5403551e55f42345e62a1a.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Takov\u00e9 m\u00e1me pl\u00e1ny do budoucna. Z nich je opravdu nejd\u016fle\u017eit\u011bj\u0161\u00ed pravd\u011bpodobn\u011b vysok\u00e1 dostupnost. Tu zat\u00edm nem\u00e1me. N\u011bkolik stroj\u016f je nastaveno stejn\u011b, ale v\u0161e zat\u00edm jede p\u0159es jeden stroj. Mus\u00edme si ud\u011blat \u010das, abychom nastavili failover mezi nimi.<\/p>\n<p><\/p>\n<p>Shrom\u00e1\u017edit metriky z Graylogu.<\/p>\n<p><\/p>\n<p>Nastavit omezen\u00ed rychlosti, abychom m\u011bli jedno, \u0161\u00edlen\u00e9 API, kter\u00e9 n\u00e1m nezab\u00edjelo \u0161\u00ed\u0159ku p\u00e1sma a v\u0161echno ostatn\u00ed.<\/p>\n<p><\/p>\n<p>A nakonec podepsat n\u011bjakou SLA s v\u00fdvoj\u00e1\u0159i, \u017ee m\u016f\u017eeme obslou\u017eit tolik. Pokud budete ps\u00e1t v\u00edc, tak promi\u0148te.<\/p>\n<p><\/p>\n<p>A napsat dokumentaci.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Jurij Bu\u0161melev \u201eMapa hrab\u011bc\u00edho pole pro sb\u011br a dod\u00e1n\u00ed kl\u00e1d\u201c \u2014 dek\u00f3dov\u00e1n\u00ed zpr\u00e1vy\" src=\"\/wp-content\/uploads\/2019\/04\/4a78e2834d5877f8bf17d77a44000c22.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Kr\u00e1tce shrnut\u00ed v\u0161eho, co jsme za\u017eili. Za prv\u00e9, standardy. Za druh\u00e9, syslog \u2014 dort. A za t\u0159et\u00ed, rsyslog funguje p\u0159esn\u011b tak, jak je naps\u00e1no na sn\u00edmku. A p\u0159ejd\u011bme k dotaz\u016fm.<\/p>\n<p><\/p>\n<p><strong>Ot\u00e1zky<\/strong>.<\/p>\n<p><\/p>\n<p><strong>Ot\u00e1zka<\/strong>: Pro\u010d jsme se nakonec rozhodli nevz\u00edt\u2026 (filebeat?)<\/p>\n<p><\/p>\n<p><strong>Odpov\u011b\u010f<\/strong>: Mus\u00edme ps\u00e1t do souboru. Moc se mi necht\u011blo. Kdy\u017e m\u00e1\u0161 API, kter\u00e9 zapisuje tis\u00edce zpr\u00e1v za sekundu, i kdy\u017e bude\u0161 rotovat jednou za hodinu, st\u00e1le to nen\u00ed mo\u017enost. M\u016f\u017ee\u0161 ps\u00e1t do pipu. Na co\u017e se m\u011b v\u00fdvoj\u00e1\u0159i zeptali: \u201eCo se stane, kdy\u017e proces, do kter\u00e9ho zapisujeme, spadne\u201c? Jen jsem nena\u0161el, co na to \u0159\u00edct, a \u0159ekl jsem: \u201eNo dob\u0159e, tak to d\u011blat nebudeme\u201c.<\/p>\n<p><\/p>\n<p><strong>Ot\u00e1zka<\/strong>: Pro\u010d nep\u00ed\u0161ete logy p\u0159\u00edmo do HDFS?<\/p>\n<p><\/p>\n<p><strong>Odpov\u011b\u010f<\/strong>: To je dal\u0161\u00ed krok. P\u0159em\u00fd\u0161leli jsme o tom na za\u010d\u00e1tku, ale proto\u017ee moment\u00e1ln\u011b nem\u00e1me zdroje se t\u00edm zab\u00fdvat, z\u016fst\u00e1v\u00e1 to pro n\u00e1s jako dlouhodob\u00e9 \u0159e\u0161en\u00ed.<\/p>\n<p><\/p>\n<p><strong>Ot\u00e1zka<\/strong>: Sloupcov\u00fd form\u00e1t by byl vhodn\u011bj\u0161\u00ed.<\/p>\n<p><\/p>\n<p><strong>Odpov\u011b\u010f<\/strong>: V\u0161emu rozum\u00edm. My jsme \u201epro\u201c ob\u011bma rukama. <\/p>\n<p><\/p>\n<p><strong>Ot\u00e1zka<\/strong>: P\u00ed\u0161ete do rsyslogu. Tam je mo\u017en\u00e9 jak TCP, tak UDP. Ale pokud pou\u017e\u00edv\u00e1te UDP, jak zaru\u010dujete doru\u010den\u00ed?<\/p>\n<p><\/p>\n<p><strong>Odpov\u011b\u010f<\/strong>: Jsou zde dva body. Prvn\u00ed, okam\u017eit\u011b v\u0161em \u0159\u00edk\u00e1m, \u017ee nezaru\u010dujeme doru\u010den\u00ed log\u016f. Proto\u017ee kdy\u017e p\u0159ijdou v\u00fdvoj\u00e1\u0159i a \u0159\u00edkaj\u00ed: \u201eA co kdybychom sem za\u010dali ps\u00e1t finan\u010dn\u00ed data, a vy je n\u011bkde uskladn\u00edte na p\u0159\u00edpad, \u017ee by se n\u011bco stalo\u201c, odpov\u011bd\u00edme jim \u201eSkv\u011bl\u00e9! Poj\u010fte za\u010d\u00edt blokovat z\u00e1pis do soketu a d\u011blat to v transakc\u00edch, abyste n\u00e1m garantovali, \u017ee jste n\u00e1m to do soketu vlo\u017eili a ujistili se, \u017ee jsme to z druh\u00e9 strany dostali.\u201c A v ten moment se v\u0161em okam\u017eit\u011b nechce. A proto\u017ee se nechce, tak jak\u00e9 k n\u00e1m maj\u00ed ot\u00e1zky? Pokud nechcete garantovat z\u00e1pis do soketu, pro\u010d bychom m\u011bli garantovat doru\u010den\u00ed? D\u011bl\u00e1me to nejlep\u0161\u00ed, co m\u016f\u017eeme. Opravu se sna\u017e\u00edme doru\u010dit co nejv\u00edce a co nejl\u00e9pe, ale ned\u00e1v\u00e1me 100% z\u00e1ruku. Proto sem nepi\u0161te finan\u010dn\u00ed data. Na to jsou datab\u00e1ze s transakcemi.<\/p>\n<p><\/p>\n<p><strong>Ot\u00e1zka<\/strong>: Kdy\u017e API generuje n\u011bjakou zpr\u00e1vu do logu a p\u0159ed\u00e1v\u00e1 \u0159\u00edzen\u00ed mikroslu\u017eb\u00e1m, nenarazili jste na probl\u00e9m, \u017ee zpr\u00e1vy z r\u016fzn\u00fdch mikroslu\u017eeb p\u0159ich\u00e1zej\u00ed ve \u0161patn\u00e9m po\u0159ad\u00ed? To zp\u016fsobuje zmatek.<\/p>\n<p><\/p>\n<p><strong>Odpov\u011b\u010f<\/strong>: Je norm\u00e1ln\u00ed, \u017ee p\u0159ich\u00e1zej\u00ed v r\u016fzn\u00e9 po\u0159ad\u00ed. Na to je t\u0159eba b\u00fdt p\u0159ipraven. Proto\u017ee jak\u00e1koliv s\u00ed\u0165ov\u00e1 dod\u00e1vka v\u00e1m nezaru\u010duje po\u0159ad\u00ed, nebo na to je t\u0159eba speci\u00e1ln\u011b vynakl\u00e1dat zdroje. Pokud vezmeme souborov\u00e1 \u00falo\u017ei\u0161t\u011b, ka\u017ed\u00e9 API ukl\u00e1d\u00e1 logy do sv\u00e9ho souboru. Omlouv\u00e1m se, tam rsyslog je rozlo\u017e\u00ed podle adres\u00e1\u0159\u016f. Ka\u017ed\u00e9 API m\u00e1 sv\u00e9 logy, kam se d\u00e1 j\u00edt pod\u00edvat, a pak podle timestampu v tomto logu je lze porovn\u00e1vat. Pokud se pod\u00edvaj\u00ed do Graylogu, tam se to se\u0159ad\u00ed podle timestampu. V\u0161echno bude v po\u0159\u00e1dku.<\/p>\n<p><\/p>\n<p><strong>Ot\u00e1zka<\/strong>: Timestamp se m\u016f\u017ee li\u0161it o milisekundy.<\/p>\n<p><\/p>\n<p><strong>Odpov\u011b\u010f<\/strong>: Timestamp generuje samo API. To je vlastn\u011b cel\u00fd trik. M\u00e1me NTP. API generuje timestamp u\u017e v samotn\u00e9 zpr\u00e1v\u011b. Nen\u00ed to rsyslog, kdo ho p\u0159id\u00e1v\u00e1.<\/p>\n<p><\/p>\n<p><strong>Ot\u00e1zka<\/strong>: Nen\u00ed \u00fapln\u011b jasn\u00e9, jak prob\u00edh\u00e1 interakce mezi datov\u00fdmi centry. V r\u00e1mci datov\u00e9ho centra je jasn\u00e9, jak se logy shroma\u017e\u010fuj\u00ed a zpracov\u00e1vaj\u00ed. Jak prob\u00edh\u00e1 interakce mezi datov\u00fdmi centry? Nebo ka\u017ed\u00e9 datov\u00e9 centrum \u017eije sv\u00fdm vlastn\u00edm \u017eivotem?<\/p>\n<p><\/p>\n<p><strong>Odpov\u011b\u010f<\/strong>: Skoro. Ka\u017ed\u00e1 zem\u011b je um\u00edst\u011bna v jednom konkr\u00e9tn\u00edm datov\u00e9m centru. V sou\u010dasnosti nem\u00e1me rozlo\u017een\u00ed, kde by jedna zem\u011b byla um\u00edst\u011bna v r\u016fzn\u00fdch datov\u00fdch centrech. Nepot\u0159ebujeme je tedy spojovat. Uvnit\u0159 ka\u017ed\u00e9ho centra je Log Relay. To je server Rsyslog. Ve skute\u010dnosti jsou to dva mana\u017eersk\u00e9 stroje. Jsou nastaveny stejn\u011b. V sou\u010dasnosti ale provoz proch\u00e1z\u00ed jedn\u00edm z nich. Ten shroma\u017e\u010fuje v\u0161echny logy. M\u00e1 diskovou frontu pro p\u0159\u00edpad nouze. Komprimuje logy a pos\u00edl\u00e1 je do centr\u00e1ln\u00edho datov\u00e9ho centra (v Singapuru), odkud se d\u00e1le odes\u00edlaj\u00ed do Graylog. A v ka\u017ed\u00e9m datov\u00e9m centru je vlastn\u00ed \u00falo\u017ei\u0161t\u011b soubor\u016f. V p\u0159\u00edpad\u011b, \u017ee ztrat\u00edme spojen\u00ed, m\u00e1me tam v\u0161echny logy. Ty tam z\u016fstanou. Bude tam uchov\u00e1ny.<\/p>\n<p><\/p>\n<p><strong>Ot\u00e1zka<\/strong>: P\u0159i mimo\u0159\u00e1dn\u00fdch situac\u00edch dost\u00e1v\u00e1te logy odtamtud?<\/p>\n<p><\/p>\n<p><strong>Odpov\u011b\u010f<\/strong>: M\u016f\u017eete tam j\u00edt (do \u00falo\u017ei\u0161t\u011b soubor\u016f) a zkontrolovat je.<\/p>\n<p><\/p>\n<p><strong>Ot\u00e1zka<\/strong>: Jak monitorujete, \u017ee neztr\u00e1c\u00edte logy?<\/p>\n<p><\/p>\n<p><strong>Odpov\u011b\u010f<\/strong>: Ve skute\u010dnosti je ztr\u00e1c\u00edme a monitorujeme to. Monitorov\u00e1n\u00ed bylo spu\u0161t\u011bno p\u0159ed m\u011bs\u00edcem. V knihovn\u011b pou\u017e\u00edvan\u00e9 Go API jsou metriky. Um\u00ed po\u010d\u00edtat, kolikr\u00e1t se j\u00ed nepoda\u0159ilo zapsat do socketu. V tuto chv\u00edli je tam chytr\u00e1 heuristika. Je tam buffer. Sna\u017e\u00ed se zapisovat z n\u011bho zpr\u00e1vy do socketu. Pokud se buffer p\u0159epln\u00ed, za\u010dne je odm\u00edtat. A po\u010d\u00edt\u00e1, kolik jich odm\u00edtl. Kdy\u017e za\u010dnou po\u010d\u00edtadla p\u0159ekra\u010dovat ur\u010dit\u00e9 hodnoty, dozv\u00edme se o tom. Aktu\u00e1ln\u011b p\u0159ich\u00e1zej\u00ed tak\u00e9 do Prometheus a v Grafana m\u016f\u017eete vid\u011bt grafy. M\u016f\u017eete nastavit upozorn\u011bn\u00ed. Ale zat\u00edm nen\u00ed jasn\u00e9, komu je pos\u00edlat.<\/p>\n<p><\/p>\n<p><strong>Ot\u00e1zka<\/strong>: V Elasticsearch uchov\u00e1v\u00e1te logy s replikac\u00ed. Kolik m\u00e1te replik?<\/p>\n<p><\/p>\n<p><strong>Odpov\u011b\u010f<\/strong>: Jedna replika.<\/p>\n<p><\/p>\n<p><strong>Ot\u00e1zka<\/strong>: To je pouze jedna replika?<\/p>\n<p><\/p>\n<p><strong>Odpov\u011b\u010f<\/strong>: To je master a replika. Data jsou uchov\u00e1v\u00e1na ve dvou kopi\u00edch.<\/p>\n<p><\/p>\n<p><strong>Ot\u00e1zka<\/strong>: Velikost bufferu rsyslog jste n\u011bjak upravovali? <\/p>\n<p><\/p>\n<p><strong>Odpov\u011b\u010f<\/strong>: P\u00ed\u0161eme datagramy do vlastn\u00edho unixov\u00e9ho socketu. To n\u00e1m okam\u017eit\u011b ukl\u00e1d\u00e1 omezen\u00ed 128 kilobajt\u016f. Nem\u016f\u017eeme do n\u011bj zapsat v\u00edce. Uvedli jsme to ve standardu. Kdo chce m\u00edt p\u0159\u00edstup ke storage, ten p\u00ed\u0161e 128 kilobajt\u016f. Knihovny nav\u00edc o\u0159ez\u00e1vaj\u00ed a nastavuj\u00ed p\u0159\u00edznak, \u017ee zpr\u00e1va byla o\u0159\u00edznuta. V na\u0161em standardu zpr\u00e1vy existuje speci\u00e1ln\u00ed pole, kter\u00e9 ukazuje, zda byla p\u0159i z\u00e1pisu o\u0159\u00edznuta \u010di nikoli. Tak\u017ee m\u00e1me mo\u017enost to sledovat.<\/p>\n<p><\/p>\n<p><strong>Ot\u00e1zka<\/strong>: P\u00ed\u0161ete neplatn\u00fd JSON? <\/p>\n<p><\/p>\n<p><strong>Odpov\u011b\u010f<\/strong>: Neplatn\u00fd JSON bude zam\u00edtnut bu\u010f b\u011bhem relay, proto\u017ee bal\u00ed\u010dek je p\u0159\u00edli\u0161 velk\u00fd. Nebo bude zam\u00edtnut Graylog, proto\u017ee nebude moci JSON zparsovat. Ale zde jsou nuance, kter\u00e9 je pot\u0159eba opravit, a v\u011bt\u0161inou jsou spojeny s rsyslog. U\u017e jsem tam zanesl n\u011bkolik probl\u00e9m\u016f, na kter\u00fdch je je\u0161t\u011b t\u0159eba pracovat.<\/p>\n<p><\/p>\n<p><strong>Ot\u00e1zka<\/strong>: Pro\u010d Kafka? Zkou\u0161eli jste RabbitMQ? Nebo se Graylog nevyrovn\u00e1v\u00e1 s takov\u00fdmi z\u00e1t\u011b\u017eemi?<\/p>\n<p><\/p>\n<p><strong>Odpov\u011b\u010f<\/strong>: S Graylogem se n\u00e1m neda\u0159\u00ed. Ale Graylog s n\u00e1mi vych\u00e1z\u00ed. Je to zvl\u00e1\u0161tn\u00ed v\u011bc. A ve skute\u010dnosti nen\u00ed pot\u0159eba. Rad\u011bji bych psal p\u0159\u00edmo z rsyslog do elasticsearch a pak se pod\u00edval do Kibany. Ale mus\u00edme vy\u0159e\u0161it ot\u00e1zku se zabezpe\u010den\u00edm. To je mo\u017en\u00fd sm\u011br na\u0161eho rozvoje, kdy bychom vyhodili Graylog a pou\u017e\u00edvali Kibanu. Nem\u00e1 smysl pou\u017e\u00edvat Logstash. Proto\u017ee tot\u00e9\u017e mohu ud\u011blat z rsyslog. A m\u00e1 modul pro z\u00e1pis do elasticsearch. S Graylogem se sna\u017e\u00edme n\u011bjak \u017e\u00edt. Dokonce jsme ho trochu vyladili. Ale je tam je\u0161t\u011b prostor pro zlep\u0161en\u00ed.<\/p>\n<p><\/p>\n<p>O Kafka. Tak to historicky vyplynulo. Kdy\u017e jsem p\u0159i\u0161el, ji\u017e existovala a zapisovaly se do n\u00ed logy. Prost\u011b jsme spustili n\u00e1\u0161 cluster a p\u0159est\u011bhovali do n\u011bj logy. Spravujeme ho, v\u00edme, jak se m\u00e1. Co se t\u00fd\u010de RabbitMQ\u2026 s RabbitMQ n\u00e1m to neklape. A s RabbitMQ n\u00e1m to funguje. M\u00e1me ho v produkci a m\u011bly s n\u00edm probl\u00e9my. P\u0159ed touto akc\u00ed jsme ho upravili a za\u010dal norm\u00e1ln\u011b fungovat. Ale p\u0159edt\u00edm jsem nebyl p\u0159ipraven ho pustit do produkce. Je tu je\u0161t\u011b jeden bod. Graylog um\u00ed \u010d\u00edst verzi AMQP 0.9, zat\u00edmco rsyslog um\u00ed zapisovat verzi AMQP 1.0. A nen\u00ed \u017e\u00e1dn\u00e9 \u0159e\u0161en\u00ed, kter\u00e9 by um\u011blo oboj\u00ed. Bu\u010f jedno nebo druh\u00e9. Tak\u017ee prozat\u00edm pouze Kafka. Ale tam tak\u00e9 jsou sv\u00e9 nuance. Proto\u017ee omkafka t\u00e9 verze rsyslog, kterou pou\u017e\u00edv\u00e1me, m\u016f\u017ee ztratit cel\u00fd buffer zpr\u00e1v, kter\u00e9 na\u010detla z rsyslog. Zat\u00edm se s t\u00edm smi\u0159ujeme. <\/p>\n<p><\/p>\n<p><strong>Ot\u00e1zka<\/strong>: Pou\u017e\u00edv\u00e1te Kafku, proto\u017ee u\u017e ji m\u00e1te? Nevyu\u017e\u00edv\u00e1te ji pro \u017e\u00e1dn\u00e9 jin\u00e9 \u00fa\u010dely?<\/p>\n<p><\/p>\n<p><strong>Odpov\u011b\u010f<\/strong>: Kafka, kter\u00e1 byla, se pou\u017e\u00edv\u00e1 t\u00fdmem Data Science. To je zcela samostatn\u00fd projekt, o kter\u00e9m, bohu\u017eel, nemohu nic \u0159\u00edct. Nejsem v obraze. Byla v p\u00e9\u010di t\u00fdmu Data Science. Kdy\u017e za\u010dali zapisovat logy, rozhodli se ji pou\u017e\u00edt, aby nebylo nutn\u00e9 instalovat je\u0161t\u011b svou vlastn\u00ed. Nyn\u00ed jsme aktualizovali Graylog a ztratili jsme kompatibilitu, proto\u017ee tam je star\u00e1 verze Kafky. Museli jsme si vytvo\u0159it vlastn\u00ed. P\u0159i t\u00e9 p\u0159\u00edle\u017eitosti jsme se zbavili t\u011bch \u010dty\u0159 t\u00e9mat pro ka\u017ed\u00e9 API. Ud\u011blali jsme jedno \u0161irok\u00e9 t\u00e9ma pro v\u0161echny live, jedno \u0161irok\u00e9 t\u00e9ma pro v\u0161echny staging a jednodu\u0161e v\u0161echno tam nal\u00e9v\u00e1me. Graylog to v\u0161echno paraleln\u011b zpracov\u00e1v\u00e1.<\/p>\n<p><\/p>\n<p><strong>Ot\u00e1zka<\/strong>: Pro\u010d je pot\u0159eba tohle \"\u0161amanstv\u00ed\" se sockety? Zkou\u0161eli jste pou\u017e\u00edt log-drivers syslog pro kontejnery?<\/p>\n<p><\/p>\n<p><strong>Odpov\u011b\u010f<\/strong>: V dob\u011b, kdy jsme se t\u00edmto probl\u00e9mem zab\u00fdvali, jsme m\u011bli s Dockerem napjat\u00e9 vztahy. Byla to verze docker 1.0 nebo 0.9. Docker s\u00e1m o sob\u011b byl podivn\u00fd. Za druh\u00e9, pokud do n\u011bj je\u0161t\u011b d\u00e1v\u00e1te logy\u2026 M\u00e1m nepodlo\u017een\u00e9 podez\u0159en\u00ed, \u017ee skrze sebe, skrze Docker d\u00e9mon, proch\u00e1zej\u00ed v\u0161echny logy. Pokud jedno API za\u010d\u00edn\u00e1 blbnout, ostatn\u00ed API nar\u00e1\u017eej\u00ed na to, \u017ee nemohou poslat stdout a stderr. Nev\u00edm, kam to povede. M\u00e1m pocit, \u017ee v tomto m\u00edst\u011b bychom nem\u011bli pou\u017e\u00edvat syslog driver Dockeru. Na\u0161e odd\u011blen\u00ed funk\u010dn\u00edho testov\u00e1n\u00ed m\u00e1 sv\u016fj vlastn\u00ed mal\u00fd cluster Graylog s logy. Pou\u017e\u00edvaj\u00ed Docker log drivery a zd\u00e1 se, \u017ee tam maj\u00ed v\u0161e v po\u0159\u00e1dku. Ale GELF pos\u00edlaj\u00ed p\u0159\u00edmo do Graylogu. Kdy\u017e jsme to v\u0161echno pl\u00e1novali, pot\u0159ebovali jsme, aby to prost\u011b fungovalo. Mo\u017en\u00e1 pozd\u011bji, a\u017e n\u011bkdo p\u0159ijde a \u0159ekne, \u017ee to u\u017e d\u00e1vno funguje norm\u00e1ln\u011b, to vyzkou\u0161\u00edme.<\/p>\n<p><\/p>\n<p><strong>Ot\u00e1zka<\/strong>: D\u011bl\u00e1te dod\u00e1vku mezi datov\u00fdmi centry na rsyslog. Pro\u010d ne na Kafka?<\/p>\n<p><\/p>\n<p><strong>Odpov\u011b\u010f<\/strong>: D\u011bl\u00e1me to vlastn\u011b ob\u011bma zp\u016fsoby. Z dvou d\u016fvod\u016f. Pokud je kan\u00e1l \u00fapln\u011b rozbit\u00fd, ani na\u0161e komprimovan\u00e9 logy se tam nevejdou. A Kafka umo\u017e\u0148uje je jednodu\u0161e ztr\u00e1cet v procesu. T\u00edmto zp\u016fsobem se zbavujeme zasek\u00e1v\u00e1n\u00ed t\u011bchto log\u016f. V tomto p\u0159\u00edpad\u011b jednodu\u0161e pou\u017e\u00edv\u00e1me Kafka p\u0159\u00edmo. Pokud m\u00e1me dobr\u00fd kan\u00e1l a chceme ho uvolnit, pou\u017eijeme rsyslog. Ale ve skute\u010dnosti ho lze nastavit tak, aby automaticky odstra\u0148oval obsah, kter\u00fd se nevejde. V sou\u010dasnosti pou\u017e\u00edv\u00e1me n\u011bkde dod\u00e1vku rsyslog p\u0159\u00edmo, n\u011bkde Kafka.<\/p>\n<p>Zdroj: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/450098\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041b\u043e\u0433\u0438 \u2014 \u0432\u0430\u0436\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0441\u0438\u0441\u0442\u0435\u043c\u044b, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0430\u044f \u043f\u043e\u043d\u044f\u0442\u044c, \u0447\u0442\u043e \u043e\u043d\u0430 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 (\u043b\u0438\u0431\u043e \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442), \u043a\u0430\u043a \u043e\u0436\u0438\u0434\u0430\u0435\u0442\u0441\u044f. \u0412 \u0443\u0441\u043b\u043e\u0432\u0438\u044f\u0445 \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u043d\u043e\u0439 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b \u0440\u0430\u0431\u043e\u0442\u0430 \u0441 \u043b\u043e\u0433\u0430\u043c\u0438 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0439 \u0434\u0438\u0441\u0446\u0438\u043f\u043b\u0438\u043d\u043e\u0439 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u043e\u043b\u0438\u043c\u043f\u0438\u0430\u0434\u044b. \u041d\u0443\u0436\u043d\u043e \u0440\u0435\u0448\u0438\u0442\u044c \u0441\u0440\u0430\u0437\u0443 \u043a\u0443\u0447\u0443 \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u0432: \u043a\u0430\u043a \u043f\u0438\u0441\u0430\u0442\u044c \u043b\u043e\u0433\u0438 \u0438\u0437 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f; \u043a\u0443\u0434\u0430 \u043f\u0438\u0441\u0430\u0442\u044c \u043b\u043e\u0433\u0438; \u043a\u0430\u043a \u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u043b\u043e\u0433\u0438 \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438; \u043a\u0430\u043a \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0438 \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043b\u043e\u0433\u0438. \u041f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0445 \u043d\u044b\u043d\u0435 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":24507,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-32723","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.3 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041b\u043e\u0433\u0438 \u2014 \u0432\u0430\u0436\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0441\u0438\u0441\u0442\u0435\u043c\u044b, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0430\u044f \u043f\u043e\u043d\u044f\u0442\u044c, \u0447\u0442\u043e \u043e\u043d\u0430 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 (\u043b\u0438\u0431\u043e \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442), \u043a\u0430\u043a \u043e\u0436\u0438\u0434\u0430\u0435\u0442\u0441\u044f. \u0412 \u0443\u0441\u043b\u043e\u0432\u0438\u044f\u0445 \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u043d\u043e\u0439 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b \u0440\u0430\u0431\u043e\u0442\u0430 \u0441 \u043b\u043e\u0433\u0430\u043c\u0438 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0439 \u0434\u0438\u0441\u0446\u0438\u043f\u043b\u0438\u043d\u043e\u0439 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u043e\u043b\u0438\u043c\u043f\u0438\u0430\u0434\u044b.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/cs\/blog\/administrirovanie\/yurij-bushmelev-karta-grablej-na-pole-sbora-i-dostavki-logov-rasshifrovka-doklada\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"cs_CZ\" \/>\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\/cs\/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 Bu\u0161melev \u201eMapa hr\u00e1b\u00ed na poli sb\u011bru a dod\u00e1vky log\u016f\u201c \u2014 shrnut\u00ed p\u0159edn\u00e1\u0161ky | ProHoster","description":"Logy jsou d\u016fle\u017eitou sou\u010d\u00e1st\u00ed syst\u00e9mu, kter\u00e1 umo\u017e\u0148uje pochopit, zda funguje (nebo nefunguje) podle o\u010dek\u00e1v\u00e1n\u00ed. V podm\u00ednk\u00e1ch mikroservisn\u00ed architektury se pr\u00e1ce s logy st\u00e1v\u00e1 samostatnou discipl\u00ednou speci\u00e1ln\u00ed olympi\u00e1dy.","canonical_url":"https:\/\/prohoster.info\/cs\/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":"cs_CZ","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\/cs\/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\/cs\/wp-json\/wp\/v2\/posts\/32723","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/comments?post=32723"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/posts\/32723\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/media\/24507"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/media?parent=32723"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/categories?post=32723"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/tags?post=32723"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}