{"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\/da\/blog\/administrirovanie\/yurij-bushmelev-karta-grablej-na-pole-sbora-i-dostavki-logov-rasshifrovka-doklada","title":{"rendered":"Juri Bushmelev \"Kort over r\u00e6dsler p\u00e5 omr\u00e5det for indsamling og levering af logs\" \u2014 transkription af foredrag","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Logfiler er en vigtig del af systemet, som g\u00f8r det muligt at forst\u00e5, om det fungerer, som det skal. I en mikroservices-arkitektur bliver arbejdet med logfiler en egen disciplin. Man skal l\u00f8se en r\u00e6kke sp\u00f8rgsm\u00e5l med det samme:<\/p>\n<p><\/p>\n<ul>\n<li>hvordan man skriver logfiler fra applikationen;<\/li>\n<li>hvor man skal skrive logfiler;<\/li>\n<li>hvordan man transporterer logfiler til opbevaring og behandling;<\/li>\n<li>hvordan man behandler og opbevarer logfiler.<\/li>\n<\/ul>\n<p><\/p>\n<p>Anvendelsen af de popul\u00e6re containeriseringsteknologier tilf\u00f8jer ekstra udfordringer til l\u00f8sningen af opgaven.<\/p>\n<p><\/p>\n<p>Det er netop dette, der er essensen af Yuri Bushmelevs rapport \"Kort over faldgruberne i indsamling og levering af logs\". <\/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=\"Afspil 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>Hvis nogen er interesseret, s\u00e5 kom ind under kat.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>Mit navn er Yuri Bushmelev. Jeg arbejder hos Lazada. I dag vil jeg tale om, hvordan vi har lavet vores logfiler, hvordan vi indsamler dem, og hvad vi skriver i dem. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Juri Bushmelev &quot;Kort over r\u00e6dsler p\u00e5 omr\u00e5det for indsamling og levering af logs&quot; \u2014 transkription af foredrag\" src=\"\/wp-content\/uploads\/2019\/04\/ece6053b1027ab3681022049ddcd79ea.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Hvor er vi fra? Hvem er vi? Lazada er den st\u00f8rste online butik i seks lande i Syd\u00f8stasien. Disse lande er fordelt p\u00e5 vores datacentre. I alt har vi nu 4 datacentre. Hvorfor er det vigtigt? Fordi nogle l\u00f8sninger var bestemt af, at der er en svag forbindelse mellem centrene. Vi har en mikroservices-arkitektur. Jeg blev overrasket over at opdage, at vi allerede har 80 mikroservices. Da jeg startede med logfilerne, var der kun 20. Derudover har vi en ganske stor del PHP legacy, som vi ogs\u00e5 m\u00e5 leve med. Alt dette genererer i \u00f8jeblikket mere end 6 millioner beskeder i minuttet i systemet som helhed. Derefter vil jeg vise, hvordan vi pr\u00f8ver at leve med dette, og hvorfor det er s\u00e5dan.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Juri Bushmelev &quot;Kort over r\u00e6dsler p\u00e5 omr\u00e5det for indsamling og levering af logs&quot; \u2014 transkription af foredrag\" src=\"\/wp-content\/uploads\/2019\/04\/0ba5fcee5064865e836cefd47c40d246.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Man skal p\u00e5 en eller anden m\u00e5de leve med disse 6 millioner beskeder. Hvad skal vi g\u00f8re med dem? 6 millioner beskeder, som skal:<\/p>\n<p><\/p>\n<ul>\n<li>sendes fra applikationen<\/li>\n<li>modtages til levering<\/li>\n<li>leveres til analyse og opbevaring.<\/li>\n<li>analyze<\/li>\n<li>opbevares p\u00e5 en eller anden m\u00e5de.<\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Juri Bushmelev &quot;Kort over r\u00e6dsler p\u00e5 omr\u00e5det for indsamling og levering af logs&quot; \u2014 transkription af foredrag\" src=\"\/wp-content\/uploads\/2019\/04\/a449062193c4b1757a61f5c92e270a74.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Da der tredje million beskeder kom, havde jeg cirka det samme udtryk. For vi startede med nogle sm\u00e5penge. Det er klart, at der skrives logfiler for applikationerne. For eksempel kunne ikke forbinde til databasen, kunne forbinde til databasen, men kunne ikke l\u00e6se noget. Men udover dette skriver hver af vores mikroservices ogs\u00e5 en access-log. Hver anmodning, der kommer til mikroservicen, falder ind i loggen. Hvorfor g\u00f8r vi dette? Udviklerne \u00f8nsker at have mulighed for tracing. I hver access-log ligger der et felt traceid, som et specielt interface derefter bruger til at udfolde hele k\u00e6den og smukt viser trace. Trace viser, hvordan anmodningen blev behandlet, og det hj\u00e6lper vores udviklere med at h\u00e5ndtere diverse uidentificerede problemer hurtigere.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Juri Bushmelev &quot;Kort over r\u00e6dsler p\u00e5 omr\u00e5det for indsamling og levering af logs&quot; \u2014 transkription af foredrag\" src=\"\/wp-content\/uploads\/2019\/04\/e13a2d37ce57e894d023ad405a2b5200.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Hvordan lever vi med dette? Nu vil jeg kort fort\u00e6lle om mulighederne \u2014 hvordan denne problemstilling generelt l\u00f8ses. Hvordan man l\u00f8ser opgaven med indsamling, overf\u00f8rsel og opbevaring af logs. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Juri Bushmelev &quot;Kort over r\u00e6dsler p\u00e5 omr\u00e5det for indsamling og levering af logs&quot; \u2014 transkription af foredrag\" src=\"\/wp-content\/uploads\/2019\/04\/60af5e5db804770295741995adb37d90.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Hvordan skriver man fra applikationen? Det er klart, at der er forskellige metoder. Is\u00e6r er der best practices, som de fashionable personer fort\u00e6ller os om. Der er old school i to former, som bedstefor\u00e6ldrene fortalte. Der er andre metoder. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Juri Bushmelev &quot;Kort over r\u00e6dsler p\u00e5 omr\u00e5det for indsamling og levering af logs&quot; \u2014 transkription af foredrag\" src=\"\/wp-content\/uploads\/2019\/04\/deab57e4ac0472a8591c0fad9e9f2910.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Situation med logindsamling er omtrent den samme. Der er ikke s\u00e5 mange l\u00f8sninger p\u00e5 denne specifikke del. De er blevet flere, men der er stadigv\u00e6k ikke s\u00e5 mange. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Juri Bushmelev &quot;Kort over r\u00e6dsler p\u00e5 omr\u00e5det for indsamling og levering af logs&quot; \u2014 transkription af foredrag\" src=\"\/wp-content\/uploads\/2019\/04\/8a6004aaeb931332983a975d0fa5c1d6.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Men hvad ang\u00e5r levering og efterf\u00f8lgende analyse \u2014 antal variationer begynder at eksplodere. Jeg vil ikke beskrive hver enkelt variant nu. Jeg tror, at de grundl\u00e6ggende muligheder er velkendte for alle, der har v\u00e6ret interesseret i emnet.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Juri Bushmelev &quot;Kort over r\u00e6dsler p\u00e5 omr\u00e5det for indsamling og levering af logs&quot; \u2014 transkription af foredrag\" src=\"\/wp-content\/uploads\/2019\/04\/6a0b64c7e58bc59f56aaddd27112ec51.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Jeg vil vise, hvordan vi gjorde det i Lazada, og hvordan det hele begyndte. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Juri Bushmelev &quot;Kort over r\u00e6dsler p\u00e5 omr\u00e5det for indsamling og levering af logs&quot; \u2014 transkription af foredrag\" src=\"\/wp-content\/uploads\/2019\/04\/20f3aa5ceea8b28733ce5399bc30f5b5.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>For et \u00e5r siden kom jeg til Lazada, og jeg blev sendt til projektet om logs. Det s\u00e5 cirka s\u00e5dan her ud. Loggen fra applikationen blev skrevet til stdout og stderr. Alle gjorde det trendy. Men derefter smed udviklerne det ud fra standardstr\u00f8mmene, og s\u00e5 m\u00e5tte specialisterne inden for infrastruktur finde ud af det. Mellem infrastrukturn\u00f8rderne og udviklerne er der ogs\u00e5 releasers, som sagde: \"\u00f8h... okay, lad os bare pakke dem ind i en fil med shell, og s\u00e5 er det det\". Og da alt dette foreg\u00e5r i en container, pakkede vi det direkte i selve containeren, mappede det ind i kataloget og lagde det der. Jeg tror, at det er ret indlysende for alle, hvad der kom ud af det.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Juri Bushmelev &quot;Kort over r\u00e6dsler p\u00e5 omr\u00e5det for indsamling og levering af logs&quot; \u2014 transkription af foredrag\" src=\"\/wp-content\/uploads\/2019\/04\/d92e02c18a4c683c9389321e4d5412df.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Lad os tage et kig lidt l\u00e6ngere frem. Hvordan vi transportede disse logs. Nogen valgte td-agent, som i virkeligheden er fluentd, men ikke helt fluentd. Jeg har stadig ikke helt forst\u00e5et forholdet mellem disse to projekter, men de handler angiveligt om det samme. Og denne fluentd, skrevet i Ruby, l\u00e6ste logfiler, parsede dem til JSON via nogle regul\u00e6re udtryk. Derefter sendte den dem til Kafka. Faktisk havde vi 4 separate emner i Kafka for hver API. Hvorfor 4? Fordi der er live, der er staging, og fordi der findes stdout og stderr. Udviklerne opretter dem, og infrastrukturr\u00e5dgiverne skal oprette dem i Kafka. Desuden blev Kafka styret af en anden afdeling. Derfor skulle man oprette en ticket, s\u00e5 de kunne oprette 4 emner for hver API. Alle glemte det. Det var i bund og grund kaos og ballade. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Juri Bushmelev &quot;Kort over r\u00e6dsler p\u00e5 omr\u00e5det for indsamling og levering af logs&quot; \u2014 transkription af foredrag\" src=\"\/wp-content\/uploads\/2019\/04\/3130f9ebfda22713cffacf10db45ca89.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Hvad gjorde vi s\u00e5 med det? Vi sendte det til Kafka. Derefter fl\u00f8j halvdelen af loggene ind i Logstash. Den anden halvdel af loggene blev delt. Nogen fl\u00f8j ind i \u00e9n Graylog, mens andre fl\u00f8j ind i en anden Graylog. I sidste ende havnede det hele i en Elasticsearch-klynge. Alts\u00e5, alt det kaos landet der til sidst. S\u00e5dan skal man ikke g\u00f8re!<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Juri Bushmelev &quot;Kort over r\u00e6dsler p\u00e5 omr\u00e5det for indsamling og levering af logs&quot; \u2014 transkription af foredrag\" src=\"\/wp-content\/uploads\/2019\/04\/98bf4811c102fc12fcd1114c25886b69.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>S\u00e5dan ser det ud, hvis man kigger lidt ovenfra. Man skal ikke g\u00f8re s\u00e5dan! Her er de problematiske steder straks markeret med tal. Der er faktisk flere, men 6 er de helt kritiske, som vi skal g\u00f8re noget ved. Jeg vil nu tale om dem s\u00e6rskilt. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Juri Bushmelev &quot;Kort over r\u00e6dsler p\u00e5 omr\u00e5det for indsamling og levering af logs&quot; \u2014 transkription af foredrag\" src=\"\/wp-content\/uploads\/2019\/04\/69f7682e6677bdda3068d6dea4db7732.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Her (1,2,3) skrives vores filer, og derfor er der straks tre faldgruber. <\/p>\n<p><\/p>\n<p>Det f\u00f8rste (1) \u2014 vi skal skrive dem et eller andet sted. Man \u00f8nsker ikke altid at give API'et muligheden for at skrive direkte til fil. Det er \u00f8nskeligt, at API'et er isoleret i en container, og endnu bedre \u2013 at det er read-only. Jeg er systemadministrator, s\u00e5 jeg har en lidt alternativ opfattelse af disse ting.<\/p>\n<p><\/p>\n<p>Det andet punkt (2,3) \u2014 vi modtager mange foresp\u00f8rgsler i API'et. API'et skriver mange data til fil. Filene vokser. Vi er n\u00f8dt til at rotere dem. Ellers vil der ikke v\u00e6re nok diskplads. Det er problematisk at rotere dem, fordi de er lavet med en omdirigering gennem shell ind i en katalog. Vi kan ikke rotere den. Man kan ikke sige til applikationen, at den skal gen\u00e5bne deskriptorerne. For udviklerne vil se p\u00e5 dig som om du var sk\u00f8r: \u201eHvilke deskriptorer? Vi skriver overhovedet til stdout.\u201c Infrastrukturfolket lavede copytruncate i logrotate, som simpelthen laver en kopi af filen og trimmer originalen. F\u00f8lgelig er det ofte mellem disse kopieringsprocesser, at der ikke er mere plads p\u00e5 disken.<\/p>\n<p><\/p>\n<p>(4) Vi havde forskellige formater i forskellige API'er. De adskilte sig lidt, men det var n\u00f8dvendigt at skrive forskellige regexp'er. Da alt dette blev styret af Puppet, var der en stor samling klasser med deres egne problemer. Plus at td-agent st\u00f8rste delen af tiden kunne spise hukommelse, v\u00e6re langsom, han kunne simpelthen lade som om han arbejdede, mens han ikke gjorde noget. Udefra var det umuligt at forst\u00e5, at han ikke gjorde noget. I bedste fald ville han falde, og s\u00e5 ville nogen genstarte ham. Mere pr\u00e6cist ville en alert komme, og nogen ville s\u00e5 fysisk genstarte ham. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Juri Bushmelev &quot;Kort over r\u00e6dsler p\u00e5 omr\u00e5det for indsamling og levering af logs&quot; \u2014 transkription af foredrag\" src=\"\/wp-content\/uploads\/2019\/04\/424cda2b60e9e5669b7ef2b34ca74e48.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>(6) Og det mest kaotiske var elasticsearch. Fordi det var en gammel version. Fordi vi ikke havde dedikerede mestre p\u00e5 det tidspunkt. Vi havde heterogene logs, hvor felterne kunne krydse hinanden. Forskellige logs fra forskellige applikationer kunne blive skrevet med de samme feltnavne, men indeni kunne der v\u00e6re forskellige data. Det vil sige, at en log kommer med Integer i feltet, for eksempel level. En anden log kommer med String i feltet level. Uden statisk mapping resulterer det i en fantastisk situation. Hvis den f\u00f8rste meddelelse efter rotationen af indekset i elasticsearch kommer som en streng, s\u00e5 klarer vi os fint. Men hvis den f\u00f8rste der kommer er en Integer, s\u00e5 bliver alle efterf\u00f8lgende meddelelser, der kommer som strenge, simpelthen afvist. Fordi felttypen ikke matcher.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Juri Bushmelev &quot;Kort over r\u00e6dsler p\u00e5 omr\u00e5det for indsamling og levering af logs&quot; \u2014 transkription af foredrag\" src=\"\/wp-content\/uploads\/2019\/04\/bc869f827bed326792857113191bb028.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Vi begyndte at stille os selv disse sp\u00f8rgsm\u00e5l. Vi besluttede ikke at lede efter syndere.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Juri Bushmelev &quot;Kort over r\u00e6dsler p\u00e5 omr\u00e5det for indsamling og levering af logs&quot; \u2014 transkription af foredrag\" src=\"\/wp-content\/uploads\/2019\/04\/a071a4b38462f249339c988c35463639.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Men skal der g\u00f8res noget! Det er en \u00e5benlys ting \u2013 der skal indf\u00f8res standarder. Nogle standarder havde vi allerede. Nogle indf\u00f8rte vi lidt senere. Heldigvis var der allerede godkendt et ensartet logformat for alle API'er p\u00e5 det tidspunkt. Det er skrevet direkte ind i standarderne for samspil mellem tjenesterne. Derfor skal dem, der \u00f8nsker at modtage loggene, skrive dem i dette format. Hvis nogen ikke skriver loggene i dette format, kan vi ikke garantere noget. <\/p>\n<p><\/p>\n<p>Dern\u00e6st \u00f8nsker jeg at indf\u00f8re en f\u00e6lles standard for m\u00e5derne at registrere, levere og samle logs p\u00e5. Egentlig, hvor de skal skrives, og hvordan de skal leveres. Den ideelle situation er, n\u00e5r projekterne bruger det samme bibliotek. Der er et separat logningsbibliotek til Go, og et separat bibliotek til PHP. Alle, vi har \u2013 skal bruge dem. P\u00e5 nuv\u00e6rende tidspunkt vil jeg sige, at vi har det tilf\u00f8rt omkring 80%. Men nogle forts\u00e6tter med at spise kaktuser.<\/p>\n<p><\/p>\n<p>Og der (p\u00e5 sliden) begynder \"SLA for levering af logs\" s\u00e5 sm\u00e5t at fremst\u00e5. Den eksisterer ikke endnu, men vi arbejder p\u00e5 det. Fordi det er meget praktisk, n\u00e5r infrastrukturen siger, at hvis I skriver i et bestemt format p\u00e5 et bestemt sted og ikke mere end N meddelelser per sekund, s\u00e5 vil vi med en bestemt sandsynlighed levere det dertil. Det fjerner en hel del hovedpine. Hvis SLA'en eksisterer, s\u00e5 er det direkte fantastisk!<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Juri Bushmelev &quot;Kort over r\u00e6dsler p\u00e5 omr\u00e5det for indsamling og levering af logs&quot; \u2014 transkription af foredrag\" src=\"\/wp-content\/uploads\/2019\/04\/a887aceac13135afe90bb5f5a5ec1d26.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Hvordan begyndte vi at l\u00f8se problemet? Den st\u00f8rste udfordring var med td-agent. Det var uklart, hvor vores logs blev af. Leveres de? Samles de? Hvor er de overhovedet? Derfor blev det som f\u00f8rste punkt besluttet at erstatte td-agent. Jeg har kort skitseret mulighederne for, hvad man kan erstatte det med.<\/p>\n<p><\/p>\n<p>Fluentd. For det f\u00f8rste har jeg haft erfaring med det fra mit tidligere arbejde, og det faldt ogs\u00e5 der en gang imellem. For det andet er det det samme, bare mere specialiseret. <\/p>\n<p><\/p>\n<p>Filebeat. Hvad gjorde det praktisk for os? Dens fordel var, at den er skrevet i Go, og vi har stor ekspertise i Go. Derfor kunne vi, hvis det var n\u00f8dvendigt, lave nogle tilpasninger til det. Men vi valgte ikke at tage den. For at der ikke skulle v\u00e6re nogen fristelse til at begynde at omskrive det. <\/p>\n<p><\/p>\n<p>Et \u00e5benlyst valg for systemadministratorer forbliver alle mulige syslogs i s\u00e5dan en m\u00e6ngde (syslog-ng\/rsyslog\/nxlog).<\/p>\n<p><\/p>\n<p>Eller skrive noget eget, men det skrinlagde vi, ligesom filebeat. Hvis der skulle skrives noget, s\u00e5 er det bedre at skrive noget nyttigt for forretningen. Til leveringen af logs er det bedre at v\u00e6lge noget f\u00e6rdigt.<\/p>\n<p><\/p>\n<p>Derfor var valget i princippet et valg mellem syslog-ng og rsyslog. Jeg h\u00e6ldede mod rsyslog, simpelthen fordi vi allerede havde klasser til rsyslog i Puppet, og jeg fandt ikke nogen \u00e5benlyse forskelle mellem dem. Der er syslog der, og der er syslog her. Ja, nogen har d\u00e5rligere dokumentation, mens andre har bedre. Den ene kan det, og den anden kan noget andet.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Juri Bushmelev &quot;Kort over r\u00e6dsler p\u00e5 omr\u00e5det for indsamling og levering af logs&quot; \u2014 transkription af foredrag\" src=\"\/wp-content\/uploads\/2019\/04\/a88116711b547fa5b2b34daf72cc4220.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Og lidt om rsyslog. For det f\u00f8rste er det fantastisk, fordi det har mange moduler. Det har et menneskevenligt RainerScript (et moderne konfigurationssprog). En fantastisk bonus er, at vi kunne simulere adf\u00e6rden af td-agent ved hj\u00e6lp af standardv\u00e6rkt\u00f8jer, s\u00e5 for applikationerne \u00e6ndrede intet sig. S\u00e5 vi skifter td-agent ud med rsyslog, mens alt det andre forbliver u\u00e6ndret. Og vi f\u00e5r straks en fungerende levering. Desuden er mmnormalize en fantastisk funktion i rsyslog. Den tillader parsning af logs, men ikke ved hj\u00e6lp af Grok og regexp. Den laver et abstract syntax tree. Den behandler logs p\u00e5 en m\u00e5de, som en compiler behandler kildekode. Det g\u00f8r det muligt at arbejde meget hurtigt, bruge lidt CPU og generelt er det virkelig en fremragende ting. Der er en masse andre fordele. Jeg vil ikke stoppe ved dem.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Juri Bushmelev &quot;Kort over r\u00e6dsler p\u00e5 omr\u00e5det for indsamling og levering af logs&quot; \u2014 transkription af foredrag\" src=\"\/wp-content\/uploads\/2019\/04\/ca811be9f9ff318fb8c8bbf3dc45a038.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Rsyslog har ogs\u00e5 mange ulemper. De er cirka de samme som fordelene. De prim\u00e6re problemer er, at man skal vide, hvordan man konfigurerer det, og man skal finde den rigtige version.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Juri Bushmelev &quot;Kort over r\u00e6dsler p\u00e5 omr\u00e5det for indsamling og levering af logs&quot; \u2014 transkription af foredrag\" src=\"\/wp-content\/uploads\/2019\/04\/034f588e0834b1d4e4873d9c3dbd0873.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Vi besluttede, at vi ville skrive logs i en unix socket. Og ikke i \/dev\/log, fordi der har vi en blanding af systemlogs, der journald i denne pipeline. S\u00e5 lad os skrive til en tilpasset socket. Vi vil tilknytte den til et separat ruleset. Vi vil ikke blande noget. Alt vil v\u00e6re gennemsigtigt og forst\u00e5eligt. Det er pr\u00e6cis det, vi gjorde. Kataloget med disse sockets er standardiseret og g\u00f8res tilg\u00e6ngeligt for alle containere. Containerne kan se den socket, de har brug for, \u00e5bne den og skrive til den. <\/p>\n<p><\/p>\n<p>Hvorfor ikke en fil? Fordi alle l\u00e6ste <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/badoo\/blog\/280606\/\">artikkelen om Badushechka<\/a><\/noindex>, der fors\u00f8gte at videregive en fil i docker, og det blev opdaget, at efter en genstart af rsyslog \u00e6ndrede file descriptor, og docker mistede denne fil. Den holder noget andet \u00e5bent, men ikke l\u00e6ngere den socket, som der skrives til. Vi besluttede, at vi ville omg\u00e5 dette problem, og samtidig omg\u00e5 problemet med blokering.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Juri Bushmelev &quot;Kort over r\u00e6dsler p\u00e5 omr\u00e5det for indsamling og levering af logs&quot; \u2014 transkription af foredrag\" src=\"\/wp-content\/uploads\/2019\/04\/78db15581a68ce16d11f5ebe7e6fe04e.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Rsyslog udf\u00f8rer handlingerne angivet p\u00e5 slide og sender logs enten til relay eller til Kafka. Kafka svarer til den gamle metode. Relay er, at jeg fors\u00f8gte at bruge rent rsyslog til loglevering. Uden Message Queue, med standard v\u00e6rkt\u00f8jer fra rsyslog. I princippet fungerer det.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Juri Bushmelev &quot;Kort over r\u00e6dsler p\u00e5 omr\u00e5det for indsamling og levering af logs&quot; \u2014 transkription af foredrag\" src=\"\/wp-content\/uploads\/2019\/04\/e61a25005ecbdc86d9de3215ee6fb97e.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Men der er nuancer i forhold til, hvordan man senere presser dem ind i denne del (Logstash\/Graylog\/ES). Denne del (rsyslog-rsyslog) bruges mellem datacentre. Her er en komprimeret TCP-forbindelse, der g\u00f8r det muligt at spare b\u00e5ndbredde og dermed \u00f8ge sandsynligheden for, at vi modtager nogle logs fra et andet datacenter, n\u00e5r forbindelsen er overbelastet. Fordi vi har Indonesien, hvor alt er skidt. Der er dette konstant problem.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Juri Bushmelev &quot;Kort over r\u00e6dsler p\u00e5 omr\u00e5det for indsamling og levering af logs&quot; \u2014 transkription af foredrag\" src=\"\/wp-content\/uploads\/2019\/04\/7509ba360be2db4dec0c8679225d285f.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Vi har t\u00e6nkt over, hvordan vi konkret kan overv\u00e5ge, med hvilken sandsynlighed logs, som vi har registreret fra applikationen, n\u00e5r frem til den anden ende? Vi besluttede at oprette metrics. rsyslog har sin egen statistikopsamlingsmodul, som indeholder nogle t\u00e6llere. For eksempel kan det vise dig st\u00f8rrelsen p\u00e5 k\u00f8en, eller hvor mange beskeder der er kommet i en bestemt handling. Derfra kan vi tage noget. Desuden har det brugerdefinerede t\u00e6llere, som kan konfigureres, og det vil vise dig, for eksempel, hvor mange beskeder en bestemt API har registreret. Derefter skrev jeg rsyslog_exporter i Python, og vi sendte det hele til Prometheus og byggede grafer. Vi ville meget gerne have Graylog-metrics, men vi n\u00e5ede ikke at konfigurere dem endnu.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Juri Bushmelev &quot;Kort over r\u00e6dsler p\u00e5 omr\u00e5det for indsamling og levering af logs&quot; \u2014 transkription af foredrag\" src=\"\/wp-content\/uploads\/2019\/04\/ef9bd61fc43e056b4a56240c85e7fd20.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Hvilke problemer opstod? Problemerne opstod, da vi pludselig opdagede, at vores Live API'er sender 50.000 beskeder i sekundet. Dette er kun Live API'er uden staging. Og Graylog viser os kun 12.000 beskeder i sekundet. Og det rejste et rimeligt sp\u00f8rgsm\u00e5l: hvor er resterne? Heraf konkluderede vi, at Graylog simpelthen ikke kan f\u00f8lge med. Vi kiggede, og ja, Graylog og Elasticsearch kunne ikke h\u00e5ndtere denne str\u00f8m.<\/p>\n<p><\/p>\n<p>Dern\u00e6st gjorde vi andre opdagelser i processen.<\/p>\n<p><\/p>\n<p>Skrivning til soklen bliver blokeret. Hvordan skete det? Da jeg brugte rsyslog til levering, \u00f8delagde vi p\u00e5 et tidspunkt forbindelsen mellem datacentrene. Leveringen stoppede p\u00e5 \u00e9t sted, og s\u00e5 stoppede den p\u00e5 et andet sted. Alt dette n\u00e5ede frem til maskinen med API'er, der skriver til rsyslog-soklen. Der blev k\u00f8en fyldt. S\u00e5 blev k\u00f8en til skrivning til unix-soklen fyldt, som som standard har 128 pakker. Og den n\u00e6ste write() i applikationen blokeres. Da vi kiggede i det bibliotek, vi bruger i vores Go-applikationer, stod der, at skrivning til soklen sker i ikke-blokerende tilstand. Vi var sikre p\u00e5, at intet blev blokeret. Fordi vi l\u00e6ste. <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/badoo\/blog\/280606\/\">artikkelen om Badushechka<\/a><\/noindex>, som skrev om dette. Men der er et punkt. Rundt om denne opkald var der ogs\u00e5 en uendelig l\u00f8kke, hvor der konstant blev fors\u00f8gt at putte en besked i socketen. Det var det, vi ikke tog m\u00e6rke til. Vi m\u00e5tte omskrive biblioteket. Siden da har det \u00e6ndret sig flere gange, men nu har vi elimineret l\u00e5sninger i alle undersystemer. Derfor kan vi stoppe rsyslog, og intet vil falde.<\/p>\n<p><\/p>\n<p>Vi skal overv\u00e5ge st\u00f8rrelsen p\u00e5 k\u00f8erne, hvilket hj\u00e6lper med at undg\u00e5 disse faldgruber. For det f\u00f8rste kan vi overv\u00e5ge, hvorn\u00e5r vi begynder at miste beskeder. For det andet kan vi overv\u00e5ge, at vi overhovedet har problemer med levering.<\/p>\n<p><\/p>\n<p>Og endnu en uheldig ting \u2014 amplification i 10 gange i mikrotjenesterarkitekturen \u2014 det er meget nemt. Vi har ikke s\u00e5 mange indg\u00e5ende anmodninger, men p\u00e5 grund af grafen, som disse beskeder l\u00f8ber videre p\u00e5, p\u00e5 grund af adgangsloggene, \u00f8ger vi virkelig belastningen p\u00e5 loggene med cirka ti gange. Jeg har desv\u00e6rre ikke f\u00e5et tid til at beregne de pr\u00e6cise tal, men mikrotjenester \u2014 de er s\u00e5dan. Det skal man have i mente. Det viser sig, at i \u00f8jeblikket er logindsamlingssystemet det mest belastede i Lazada. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Juri Bushmelev &quot;Kort over r\u00e6dsler p\u00e5 omr\u00e5det for indsamling og levering af logs&quot; \u2014 transkription af foredrag\" src=\"\/wp-content\/uploads\/2019\/04\/d76c6d91613ff77c41b8985cee83218f.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Hvordan l\u00f8ser man problemet med elasticsearch? Hvis du hurtigt har brug for at f\u00e5 loggene et sted, s\u00e5 du ikke skal l\u00f8be rundt p\u00e5 alle maskinerne og samle dem, s\u00e5 brug et filstorage. Det fungerer garanteret. Det laves fra enhver server. Du skal bare stikke nogle diske derhen og s\u00e6tte syslog op. Derefter har du garanteret alle loggene et sted. Derefter kan du stille og roligt begynde at konfigurere elasticsearch, graylog, eller noget andet. Men du har allerede alle loggene, og du kan opbevare dem, s\u00e5 l\u00e6nge diskomr\u00e5derne r\u00e6kker.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Juri Bushmelev &quot;Kort over r\u00e6dsler p\u00e5 omr\u00e5det for indsamling og levering af logs&quot; \u2014 transkription af foredrag\" src=\"\/wp-content\/uploads\/2019\/04\/571297f25de76958769f3a4b9bfbf5b9.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>P\u00e5 tidspunktet for mit foredrag s\u00e5 skemaet s\u00e5dan ud. Vi er stort set blevet stoppet med at skrive til filer. Nu slukker vi sandsynligvis for resten. P\u00e5 de lokale maskiner, hvor API'erne k\u00f8rer, stopper vi med at skrive til filer. For det f\u00f8rste er der et filstorage, som fungerer rigtig godt. For det andet l\u00f8ber der konstant pladsmangel p\u00e5 disse maskiner, og det skal overv\u00e5ges kontinuerligt.<\/p>\n<p><\/p>\n<p>Denne del med Logstash og Graylog, den er virkelig frustrerende. Derfor skal vi slippe af med den. Vi skal v\u00e6lge et enkelt system.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Juri Bushmelev &quot;Kort over r\u00e6dsler p\u00e5 omr\u00e5det for indsamling og levering af logs&quot; \u2014 transkription af foredrag\" src=\"\/wp-content\/uploads\/2019\/04\/4a285577708aa1c55c16a72364fa8072.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Vi har besluttet at skrotte Logstash og Kibana. Fordi vi har et sikkerhedsafdeling. Hvad er forbindelsen? Forbindelsen er, at Kibana uden X-Pack og uden Shield ikke giver mulighed for at adskille adgangen til logfilerne. Derfor valgte vi Graylog. Det er ikke mit favoritv\u00e6rkt\u00f8j, men det fungerer. Vi k\u00f8bte nyt hardware, installerede den nyeste Graylog p\u00e5 det og flyttede alle logs med strenge formater til en s\u00e6rskilt Graylog. Vi har l\u00f8st problemet med forskellige typer af identiske felter organisatorisk.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Juri Bushmelev &quot;Kort over r\u00e6dsler p\u00e5 omr\u00e5det for indsamling og levering af logs&quot; \u2014 transkription af foredrag\" src=\"\/wp-content\/uploads\/2019\/04\/91b9fdada2648ae1caec05169b11926a.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Hvad der faktisk er inkluderet i den nye Graylog. Vi har blot skrevet alt ned i Docker. Vi tog en masse servere, satte tre instanser af Kafka op og syv Graylog-servere version 2.3 (fordi vi \u00f8nskede Elasticsearch version 5). Alt dette blev k\u00f8rt p\u00e5 RAID med HDD. Vi s\u00e5 en indekseringshastighed p\u00e5 op til 100.000 beskeder i sekundet. Vi s\u00e5 tallet 140 terabyte data om ugen. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Juri Bushmelev &quot;Kort over r\u00e6dsler p\u00e5 omr\u00e5det for indsamling og levering af logs&quot; \u2014 transkription af foredrag\" src=\"\/wp-content\/uploads\/2019\/04\/05f9b3c06739548f092bbe271bf8fc54.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Og igen bump! Vi st\u00e5r over for to udsalg. Vi er flyttet over 6 millioner beskeder. Vores Graylog kan ikke f\u00f8lge med. Vi m\u00e5 finde en m\u00e5de at overleve igen. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Juri Bushmelev &quot;Kort over r\u00e6dsler p\u00e5 omr\u00e5det for indsamling og levering af logs&quot; \u2014 transkription af foredrag\" src=\"\/wp-content\/uploads\/2019\/04\/424aa2febc2fd903aabee4aeabb64010.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>S\u00e5dan overlevede vi. Vi tilf\u00f8jede et par ekstra servere og SSD'er. P\u00e5 nuv\u00e6rende tidspunkt lever vi p\u00e5 denne m\u00e5de. Nu behandler vi allerede 160.000 beskeder i sekundet. Vi er endnu ikke n\u00e5et op til gr\u00e6nsen, s\u00e5 det er ikke klart, hvor meget vi reelt kan tr\u00e6kke ud af dette. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Juri Bushmelev &quot;Kort over r\u00e6dsler p\u00e5 omr\u00e5det for indsamling og levering af logs&quot; \u2014 transkription af foredrag\" src=\"\/wp-content\/uploads\/2019\/04\/17d84fa7de5403551e55f42345e62a1a.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>S\u00e5dan ser vores fremtidsplaner ud. Af dem er det sandsynligvis det vigtigste h\u00f8j tilg\u00e6ngelighed. Vi har det ikke endnu. Flere maskiner er konfigureret ens, men alt g\u00e5r stadig gennem \u00e9n maskine. Vi skal bruge tid p\u00e5 at konfigurere failover mellem dem.<\/p>\n<p><\/p>\n<p>Indsamle metrikker fra Graylog.<\/p>\n<p><\/p>\n<p>Implementere rate limiting, s\u00e5 vores \u00e9n, der er blevet sindssyg API, ikke dr\u00e6ber vores b\u00e5ndbredde og alt andet.<\/p>\n<p><\/p>\n<p>Og endelig skrive en SLA med udviklerne om, at vi kan h\u00e5ndtere s\u00e5 meget. Hvis I skriver mere, s\u00e5 beklager vi.<\/p>\n<p><\/p>\n<p>Og skrive dokumentation.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Juri Bushmelev &quot;Kort over r\u00e6dsler p\u00e5 omr\u00e5det for indsamling og levering af logs&quot; \u2014 transkription af foredrag\" src=\"\/wp-content\/uploads\/2019\/04\/4a78e2834d5877f8bf17d77a44000c22.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Kort opsummering af alt, hvad vi har gennemg\u00e5et. For det f\u00f8rste standarder. For det andet, syslog \u2014 kagen. For det tredje fungerer rsyslog pr\u00e6cis s\u00e5dan, som det st\u00e5r p\u00e5 sliden. Lad os g\u00e5 videre til sp\u00f8rgsm\u00e5l.<\/p>\n<p><\/p>\n<p><strong>Sp\u00f8rgsm\u00e5l<\/strong>.<\/p>\n<p><\/p>\n<p><strong>Sp\u00f8rgsm\u00e5l<\/strong>: Hvorfor besluttede I s\u00e5 ikke at bruge\u2026 (filebeat?)<\/p>\n<p><\/p>\n<p><strong>Svar<\/strong>: Man skal skrive til fil. Det var vi meget skeptiske overfor. N\u00e5r din API skriver tusindvis af beskeder i sekundet, er det stadig ikke en l\u00f8sning, selv hvis du roterer en gang i timen. Man kan skrive til en pipe. Til det spurgte udviklerne: \"Hvad sker der, hvis processen, som vi skriver til, crasher?\" Jeg fandt faktisk ikke et svar til dem og sagde: \"N\u00e5, okay, lad os lade v\u00e6re med at g\u00f8re det.\"<\/p>\n<p><\/p>\n<p><strong>Sp\u00f8rgsm\u00e5l<\/strong>: Hvorfor skriver du ikke logs direkte til HDFS?<\/p>\n<p><\/p>\n<p><strong>Svar<\/strong>: Det er det n\u00e6ste skridt. Vi t\u00e6nkte p\u00e5 det i starten, men da vi ikke har ressourcer til at arbejde p\u00e5 det i \u00f8jeblikket, h\u00e6nger det som en langsigtet l\u00f8sning.<\/p>\n<p><\/p>\n<p><strong>Sp\u00f8rgsm\u00e5l<\/strong>: Kolonneformatet ville v\u00e6re mere passende.<\/p>\n<p><\/p>\n<p><strong>Svar<\/strong>: Jeg forst\u00e5r det hele. Vi er \"for\" det med begge h\u00e6nder. <\/p>\n<p><\/p>\n<p><strong>Sp\u00f8rgsm\u00e5l<\/strong>: Du skriver til rsyslog. Der kan man bruge b\u00e5de TCP og UDP. Men hvis man bruger UDP, hvordan garanterer du s\u00e5 leveringen?<\/p>\n<p><\/p>\n<p><strong>Svar<\/strong>: Der er to aspekter. For det f\u00f8rste informerer jeg straks alle om, at vi ikke garanterer leveringen af logs. Fordi n\u00e5r udviklerne kommer og siger: 'Lad os begynde at skrive finansielle data der, og s\u00e5 kan I gemme dem til senere, hvis noget g\u00e5r galt', svarer vi 'Fantastisk! Lad os sige, at I begynder at blokere for skrivningen til socket og laver det i transaktioner, s\u00e5 I garanterer, at I sender det til os, og at I er sikre p\u00e5, at vi har modtaget det fra den anden side.' Og i det \u00f8jeblik bliver alle straks tilbageholdende. Og da de ikke \u00f8nsker det, hvad sp\u00f8rgsm\u00e5l har vi s\u00e5? Hvis I ikke \u00f8nsker at garantere skrivning til socket, hvorfor skal vi s\u00e5 garantere leveringen? Vi g\u00f8r vores bedste. Vi fors\u00f8ger virkelig at levere s\u00e5 meget som muligt og s\u00e5 godt som muligt, men vi giver ikke 100% garanti. Derfor skal der ikke skrives finansielle data der. Der er databaser med transaktioner til det.<\/p>\n<p><\/p>\n<p><strong>Sp\u00f8rgsm\u00e5l<\/strong>: N\u00e5r API'en genererer en logbesked og videregiver kontrollen til mikrotjenesterne, har I s\u00e5 ikke oplevet problemer med, at beskeder fra forskellige mikrotjenester ankommer i forkert r\u00e6kkef\u00f8lge? Det kan skabe forvirring.<\/p>\n<p><\/p>\n<p><strong>Svar<\/strong>: Det er normalt, at de ankommer i forskellig r\u00e6kkef\u00f8lge. Man skal v\u00e6re forberedt p\u00e5 det. For enhver netv\u00e6rkslevering garanterer ikke r\u00e6kkef\u00f8lgen, eller man skal bruge specielle ressourcer til det. Hvis vi tager filsystemer, gemmer hver API logs i sin egen fil. Eller rettere sagt, rsyslog opdeler dem i mapper. Hver API har sine egne logs, som du kan g\u00e5 ind og se, og derefter kan du matche dem ved hj\u00e6lp af timestamp i loggen. Hvis de g\u00e5r ind og ser i Graylog, s\u00e5 bliver de sorteret efter timestamp. Der vil alt v\u00e6re i orden.<\/p>\n<p><\/p>\n<p><strong>Sp\u00f8rgsm\u00e5l<\/strong>: Timestamp kan variere med millisekunder.<\/p>\n<p><\/p>\n<p><strong>Svar<\/strong>: Timestamp genereres af selve API'en. Det er i grunden hele pointen. Vi har NTP. API'en genererer timestamp allerede i selve beskeden. Det tilf\u00f8jes ikke af rsyslog.<\/p>\n<p><\/p>\n<p><strong>Sp\u00f8rgsm\u00e5l<\/strong>: Det er ikke helt klart, hvordan interaktionen mellem datacenterne fungerer. Inden for datacentret er det klart, hvordan loggene blev indsamlet og behandlet. Hvordan foreg\u00e5r interaktionen mellem datacenterne? Eller lever hvert datacenter sit eget liv?<\/p>\n<p><\/p>\n<p><strong>Svar<\/strong>: N\u00e6sten. Hvert land er placeret i et bestemt datacenter. Vi har i \u00f8jeblikket ikke spredning, hvor et land er placeret i flere datacentre. Derfor beh\u00f8ver vi ikke at samle dem. Inden for hvert center er der en Log Relay. Det er en Rsyslog-server. Faktisk er der to administrationsmaskiner. De er indstillet ens. Men indtil videre g\u00e5r trafikken kun gennem den ene. Den aggregerer alle loggene. Den har en diskqueue i tilf\u00e6lde af noget. Den komprimerer logs og sender dem til det centrale datacenter (i Singapore), hvor de derefter sendes til Graylog. Og hvert datacenter har sin egen filopbevaring. I tilf\u00e6lde af, at vi mister forbindelsen, har vi alle loggene der. De vil forblive der. De vil blive gemt.<\/p>\n<p><\/p>\n<p><strong>Sp\u00f8rgsm\u00e5l<\/strong>: F\u00e5r I logs derfra i n\u00f8dsituationer?<\/p>\n<p><\/p>\n<p><strong>Svar<\/strong>: Man kan g\u00e5 derhen (til filopbevaringen) og se.<\/p>\n<p><\/p>\n<p><strong>Sp\u00f8rgsm\u00e5l<\/strong>: Hvordan overv\u00e5ger I, at I ikke mister logs?<\/p>\n<p><\/p>\n<p><strong>Svar<\/strong>: Vi mister dem faktisk, og vi overv\u00e5ger det. Overv\u00e5gningen blev startet for en m\u00e5ned siden. I biblioteket, der bruges af Go API, er der m\u00e5linger. Den kan t\u00e6lle, hvor mange gange den ikke kunne skrive til socket. Der er i \u00f8jeblikket en smart heuristik. Der er en buffer. Den fors\u00f8ger at skrive beskeder fra den til socket. Hvis bufferen fyldes op, begynder den at droppe dem. Og t\u00e6ller hvor mange den har droppet. Hvis t\u00e6llerne begynder at fylde op, f\u00e5r vi besked om det. De g\u00e5r ogs\u00e5 til Prometheus, og i Grafana kan man se grafer. Man kan indstille advarsler. Men det er stadig uklart, hvem de skal sendes til.<\/p>\n<p><\/p>\n<p><strong>Sp\u00f8rgsm\u00e5l<\/strong>: I Elasticsearch opbevarer I logs med backup. Hvor mange replikaer har I?<\/p>\n<p><\/p>\n<p><strong>Svar<\/strong>: \u00c9n replika.<\/p>\n<p><\/p>\n<p><strong>Sp\u00f8rgsm\u00e5l<\/strong>: Er det kun \u00e9n replika?<\/p>\n<p><\/p>\n<p><strong>Svar<\/strong>: Det er master og replika. Dataene opbevares i to eksemplarer.<\/p>\n<p><\/p>\n<p><strong>Sp\u00f8rgsm\u00e5l<\/strong>: Har I justeret st\u00f8rrelsen p\u00e5 rsyslog-bufferen p\u00e5 nogen m\u00e5de? <\/p>\n<p><\/p>\n<p><strong>Svar<\/strong>: Vi skriver datagrammer til en tilpasset unix socket. Dette p\u00e5l\u00e6gger os straks en begr\u00e6nsning p\u00e5 128 kilobyte. Vi kan ikke skrive mere til det. Vi har angivet dette i standarden. De, der \u00f8nsker at komme ind i lagrene, skriver 128 kilobyte. Bibliotekerne sk\u00e6rer faktisk ned og s\u00e6tter et flag, der signalerer, at meddelelsen er blevet forkortet. I vores standard for selve meddelelsen er der et s\u00e6rligt felt, der viser, om det blev forkortet ved skrivning eller ej. S\u00e5 vi har mulighed for at spore dette aspekt.<\/p>\n<p><\/p>\n<p><strong>Sp\u00f8rgsm\u00e5l<\/strong>: Skriver du korrupt JSON? <\/p>\n<p><\/p>\n<p><strong>Svar<\/strong>: Korrupt JSON vil blive afvist enten under relay, fordi pakken er for stor. Eller det vil blive afvist af Graylog, fordi det ikke kan parse JSON. Men her er der nuancer, som skal rettes, og de er for det meste knyttet til rsyslog. Jeg har allerede indsendt et par issues der, som der stadig skal arbejdes p\u00e5.<\/p>\n<p><\/p>\n<p><strong>Sp\u00f8rgsm\u00e5l<\/strong>: Hvorfor Kafka? Har du pr\u00f8vet RabbitMQ? Kan Graylog ikke klare s\u00e5danne belastninger?<\/p>\n<p><\/p>\n<p><strong>Svar<\/strong>: Vi kan ikke f\u00e5 det til at fungere med Graylog. Men Graylog fungerer for os. Det er en besv\u00e6rlig st\u00f8rrelse. Og faktisk er det ikke n\u00f8dvendigt. Jeg ville foretr\u00e6kke at skrive direkte fra rsyslog til Elasticsearch og derefter se i Kibana. Men vi skal afklare sp\u00f8rgsm\u00e5lene med sikkerhedsfolkene. Dette er en mulig udviklingsvej for os, n\u00e5r vi fjerner Graylog og bruger Kibana. Det vil ikke give mening at bruge Logstash. Fordi jeg kan g\u00f8re alt dette med rsyslog. Og det har en modul til at skrive til Elasticsearch. Vi fors\u00f8ger at leve med Graylog. Vi har endda tweaket det lidt. Men der er stadig plads til forbedringer.<\/p>\n<p><\/p>\n<p>Om Kafka. Det er, som historien har udviklet sig. Da jeg kom, var det allerede der, og logfiler blev allerede skrevet til det. Vi rejste bare vores klynge op og flyttede loggene til den. Vi styrer det, vi ved, hvordan det har det. Om RabbitMQ... vi f\u00e5r det ikke til at fungere med RabbitMQ. Men vi f\u00e5r det til at fungere med RabbitMQ. Det er i produktionen, og der har v\u00e6ret problemer med det. Lige nu, f\u00f8r udsalget, fik vi det til at fungere, og det begyndte at fungere normalt. Men f\u00f8r det var jeg ikke parat til at udgive det i produktion. Der er ogs\u00e5 et andet punkt. Graylog kan l\u00e6se AMQP 0.9-versionen, mens rsyslog kan skrive AMQP 1.0-versionen. Der er ikke nogen l\u00f8sning, der kan g\u00f8re begge dele. Det er enten det ene eller det andet. Derfor er der kun Kafka lige nu. Men der er ogs\u00e5 sine nuancer der. Fordi omkafka af den version af rsyslog, vi bruger, kan miste hele bufferet af beskeder, som den har hentet fra rsyslog. Indtil videre m\u00e5 vi leve med det. <\/p>\n<p><\/p>\n<p><strong>Sp\u00f8rgsm\u00e5l<\/strong>: Bruger du Kafka, fordi det allerede var der? Til ingen andre form\u00e5l?<\/p>\n<p><\/p>\n<p><strong>Svar<\/strong>: Den Kafka, der var, bruges af Data Science-teamet. Det er et helt separat projekt, som jeg desv\u00e6rre ikke kan sige noget om. Jeg er ikke opdateret. Det var under ledelse af Data Science-teamet. Da loggene blev oprettet, besluttede de at bruge det, s\u00e5 de ikke skulle installere deres egen. Nu har vi opdateret Graylog, og vi har mistet kompatibiliteten, fordi der var en gammel version af Kafka. Vi var n\u00f8dt til at oprette vores egen. Samtidig blev vi fri for de fire emner for hver API. Vi lavede et bredt emne til alt live, et bredt emne til alt staging, og s\u00e5 sender vi bare alt derind. Graylog henter alt dette parallelt.<\/p>\n<p><\/p>\n<p><strong>Sp\u00f8rgsm\u00e5l<\/strong>: Hvad er det der behov for det her magi med sockets? Har I pr\u00f8vet at bruge log-driver syslog til containerne.<\/p>\n<p><\/p>\n<p><strong>Svar<\/strong>: P\u00e5 det tidspunkt, hvor vi stillede os selv dette sp\u00f8rgsm\u00e5l, var vores forhold til Docker sp\u00e6ndt. Det var Docker 1.0 eller 0.9. Docker i sig selv var m\u00e6rkelig. For det andet, hvis man ogs\u00e5 skal stoppe logs i det\u2026 Jeg har en ubevist mistanke om, at den lader alle logs passere igennem sig, gennem Docker-d\u00e6monen. Hvis vores API bliver sk\u00f8rt, s\u00e5 stopper de andre API\u2019er op, fordi de ikke kan sende stdout og stderr. Jeg ved ikke, hvad det vil f\u00f8re til. Jeg har en fornemmelse af, at man ikke burde bruge Docker's syslog-driver her. Vores afdeling for funktionel test har sin egen lille Graylog-klynge med logs. De bruger Docker-logdrivere, og det ser ud til at fungere fint. Men de skriver direkte GELF til Graylog. P\u00e5 det tidspunkt, da vi startede det hele, havde vi bare brug for, at det fungerede. M\u00e5ske senere, n\u00e5r nogen siger, at det har fungeret fint i lang tid, vil vi pr\u00f8ve det.<\/p>\n<p><\/p>\n<p><strong>Sp\u00f8rgsm\u00e5l<\/strong>: I g\u00f8r leveringen mellem datacentrer med rsyslog. Hvorfor ikke med Kafka?<\/p>\n<p><\/p>\n<p><strong>Svar<\/strong>: Vi g\u00f8r faktisk begge dele. Af to grunde. Hvis kanalen er helt nede, s\u00e5 kan vores logs, selv i komprimeret format, ikke komme igennem. Og Kafka tillader os simpelthen at miste dem undervejs. P\u00e5 den m\u00e5de slipper vi for, at logs sidder fast. I dette tilf\u00e6lde bruger vi Kafka direkte. Hvis vores kanal er god, og vi \u00f8nsker at frig\u00f8re den, s\u00e5 bruger vi rsyslog. Men man kan faktisk indstille rsyslog til at droppe det, der ikke kan komme igennem. I \u00f8jeblikket bruger vi s\u00e5 nogle steder rsyslog direkte, og andre steder Kafka.<\/p>\n<p>Kilde: <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\/da\/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=\"da_DK\" \/>\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\/da\/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\udd47Juri Bushmelev \"Kort over faldgruber p\u00e5 feltet for indsamling og levering af logs\" \u2014 transskription af pr\u00e6sentationen | ProHoster","description":"Logs er en vigtig del af systemet, der g\u00f8r det muligt at forst\u00e5, om det fungerer (eller ikke fungerer) som forventet. I en mikrotjenestearkitektur bliver arbejdet med logs en separat disciplin ved en s\u00e6rlig olympiade.","canonical_url":"https:\/\/prohoster.info\/da\/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":"da_DK","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\/da\/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\/da\/wp-json\/wp\/v2\/posts\/32723","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/comments?post=32723"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/posts\/32723\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/media\/24507"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/media?parent=32723"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/categories?post=32723"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/tags?post=32723"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}