Yuri Bushmelev "KartlĂ€ggning av spikarna pĂ„ fĂ€lten för insamling och transporter av stockar" — en sammanfattning av presentationen

Loggar Àr en viktig del av systemet, vilket gör det möjligt att förstÄ om det fungerar (eller inte fungerar) som förvÀntat. I en mikroservice-arkitektur blir hanteringen av loggar en separat disciplin av specialolympiaden. Vi mÄste lösa en mÀngd frÄgor:

  • hur man skriver loggar frĂ„n applikationen;
  • vart loggar ska skrivas;
  • hur man levererar loggar för lagring och behandling;
  • hur man hanterar och lagrar loggar.

AnvÀndningen av populÀra containrar idag lÀgger till ett extra lager av komplexitet pÄ lösa problem.

Just detta handlar förelÀsningen av Yuriy Bushmelev "Kartan över hinder i insamling och leverans av loggar"

Spela video

Den som Àr intresserad, vÀnligen lÀs vidare.

Jag heter Yuriy Bushmelev. Jag arbetar pÄ Lazada. Idag ska jag berÀtta hur vi har gjort vÄra loggar, hur vi har samlat dem och vad vi skriver i dem.

Yuri Bushmelev "KartlĂ€ggning av spikarna pĂ„ fĂ€lten för insamling och transporter av stockar" — en sammanfattning av presentationen

Vart kommer vi ifrÄn? Vem Àr vi? Lazada Àr den största onlinebutiken i sex lÀnder i Sydöstra Asien. Dessa lÀnder Àr spridda över vÄra datacenter. Totalt har vi nu 4 datacenter. Varför Àr det viktigt? För vissa lösningar berodde pÄ att det finns mycket svaga lÀnkar mellan datacentren. Vi har en mikroservice-arkitektur. Jag blev förvÄnad över att upptÀcka att vi redan har 80 mikroservicer. NÀr jag började med loggfrÄgan fanns det bara 20. Dessutom har vi en ganska stor mÀngd PHP-leverans som vi ocksÄ mÄste leva med. Allt detta genererar för nÀrvarande mer Àn 6 miljoner meddelanden per minut i systemet totalt. NÀsta kommer jag att visa hur vi hanterar detta och varför det Àr sÄ.

Yuri Bushmelev "KartlĂ€ggning av spikarna pĂ„ fĂ€lten för insamling och transporter av stockar" — en sammanfattning av presentationen

Med dessa 6 miljoner meddelanden mÄste vi pÄ nÄgot sÀtt hantera dem. Vad ska vi göra med dem? 6 miljoner meddelanden som mÄste:

  • skickas frĂ„n applikationen
  • mottas för leverans
  • levereras för analys och lagring.
  • analysera
  • pĂ„ nĂ„got sĂ€tt lagra.

Yuri Bushmelev "KartlĂ€ggning av spikarna pĂ„ fĂ€lten för insamling och transporter av stockar" — en sammanfattning av presentationen

NÀr det fanns tre miljoner meddelanden hade jag ungefÀr en sÄdan hÀr uppsyn. Eftersom vi började med smÄ summor. Det Àr klart att apploggar skrivs dit. Till exempel kunde inte ansluta till databasen, kunde ansluta till databasen men kunde inte lÀsa nÄgot. Men förutom detta skriver varje mikrotjÀnst ocksÄ en access-logg. Varje förfrÄgan som kommer till mikrotjÀnsten hamnar i loggen. Varför gör vi detta? Utvecklarna vill ha möjlighet att spÄra. I varje access-logg finns ett fÀlt som heter traceid, vilket gör att ett speciellt grÀnssnitt kan bryta ner hela kedjan och vackert visa spÄret. SpÄret visar hur förfrÄgan har passerat, och det hjÀlper vÄra utvecklare att snabbt hantera alla okÀnda problem.

Yuri Bushmelev "KartlĂ€ggning av spikarna pĂ„ fĂ€lten för insamling och transporter av stockar" — en sammanfattning av presentationen

Hur lever man med detta? Nu ska jag kort gĂ„ igenom alternativen — hur detta problem i allmĂ€nhet löses. Hur man löser uppgiften med insamling, överföring och lagring av loggar.

Yuri Bushmelev "KartlĂ€ggning av spikarna pĂ„ fĂ€lten för insamling och transporter av stockar" — en sammanfattning av presentationen

Hur skriver man frÄn applikationen? Det Àr klart att det finns olika sÀtt. I synnerhet finns det bÀsta praxis, som de trendiga personerna berÀttar för oss. Det finns old school i tvÄ versioner, som farbröderna berÀttade. Det finns andra metoder.

Yuri Bushmelev "KartlĂ€ggning av spikarna pĂ„ fĂ€lten för insamling och transporter av stockar" — en sammanfattning av presentationen

Samma sak gÀller insamling av loggar. Alternativen för att lösa just denna del Àr inte sÄ mÄnga. Det finns lite fler Àn tidigare, men fortfarande inte sÄ mÄnga.

Yuri Bushmelev "KartlĂ€ggning av spikarna pĂ„ fĂ€lten för insamling och transporter av stockar" — en sammanfattning av presentationen

Men nĂ€r det kommer till leverans och efterföljande analys — antalet variationer börjar skjuta i höjden. Jag kommer inte att beskriva varje alternativ just nu. Jag tror att de viktigaste alternativen Ă€r kĂ€nda för alla som har intresserat sig för Ă€mnet.

Yuri Bushmelev "KartlĂ€ggning av spikarna pĂ„ fĂ€lten för insamling och transporter av stockar" — en sammanfattning av presentationen

Jag ska visa hur vi gjorde detta pÄ Lazada och hur allt faktiskt började.

Yuri Bushmelev "KartlĂ€ggning av spikarna pĂ„ fĂ€lten för insamling och transporter av stockar" — en sammanfattning av presentationen

För ett Är sedan kom jag till Lazada, och jag blev skickad till ett projekt om loggar. Det var ungefÀr sÄ hÀr. Loggen frÄn applikationen skrevs till stdout och stderr. Alla gjorde det pÄ det trendiga sÀttet. Men senare sköts det ut frÄn standardströmmarna, och sedan skulle infrastruktursspecialisterna lösa det. Mellan infrastruktursspecialister och utvecklare finns det ocksÄ release-specialister som sa: "eh... okej, lÄt oss bara slÄ in dem i en fil med shell, och sÄ Àr det klart". Och eftersom allt detta Àr i en container, sÄ blev det inkapslat direkt i sjÀlva containern, mappades in i katalogen och lades dit. Jag tror att det Àr ganska uppenbart för alla vad som blev resultatet av detta.

Yuri Bushmelev "KartlĂ€ggning av spikarna pĂ„ fĂ€lten för insamling och transporter av stockar" — en sammanfattning av presentationen

LÄt oss titta lite lÀngre fram. Hur vi levererade dessa loggar. NÄgon valde td-agent, som egentligen Àr fluentd, men inte riktigt fluentd. Jag förstod aldrig relationen mellan dessa tvÄ projekt, men de verkar handla om samma sak. Och denna fluentd, skriven i Ruby, lÀste loggfiler, parserade dem till JSON med nÄgon slags regex. Sedan skickade den dem till Kafka. Faktum Àr att vi hade 4 separata Àmnen i Kafka för varje API. Varför 4? För att det finns live, det finns staging, och eftersom det finns stdout och stderr. Utvecklarna skapar dem, och infrastructure-teamen mÄste skapa dem i Kafka. Dessutom kontrollerades Kafka av en annan avdelning. DÀrför behövde vi skapa en ticket för att de skulle skapa 4 Àmnen för varje API. Alla glömde detta. Det var verkligen kaos.

Yuri Bushmelev "KartlĂ€ggning av spikarna pĂ„ fĂ€lten för insamling och transporter av stockar" — en sammanfattning av presentationen

Vad gjorde vi sedan med detta? Vi skickade det till Kafka. Sedan flög hÀlften av loggarna till Logstash. Den andra hÀlften av loggarna delades. En del flög till en Graylog, en del till en annan Graylog. SÄ i slutÀndan flög allt detta till en Elasticsearch-kluster. SÄ hela detta kaos hamnade slutligen dÀr. Man ska inte göra sÄ!

Yuri Bushmelev "KartlĂ€ggning av spikarna pĂ„ fĂ€lten för insamling och transporter av stockar" — en sammanfattning av presentationen

SĂ„ hĂ€r ser det ut om man ser pĂ„ det frĂ„n ovan. Man ska inte göra sĂ„! HĂ€r Ă€r problemen direkt markerade med siffror. Det finns faktiskt fler, men 6 — det Ă€r verkligen problematiska, med vilka man mĂ„ste göra nĂ„got. Jag kommer att berĂ€tta mer om dem separat.

Yuri Bushmelev "KartlĂ€ggning av spikarna pĂ„ fĂ€lten för insamling och transporter av stockar" — en sammanfattning av presentationen

HÀr (1,2,3) skriver vi filer och, dÀrmed, finns det tre fallgropar direkt.

Första (1) — vi mĂ„ste skriva dem nĂ„gonstans. Man skulle inte alltid vilja ge API:et möjligheten att skriva direkt i filen. Det Ă€r önskvĂ€rt att API:et Ă€r isolerat i en container, och Ă€nnu bĂ€ttre – att den Ă€r read-only. Jag Ă€r systemadministratör, sĂ„ jag har en lite alternativ syn pĂ„ dessa saker.

Den andra punkten (2,3) - vi tar emot mÄnga förfrÄgningar i API:et. API:et skriver mycket data till fil. Filerna vÀxer. Vi mÄste rotera dem. För annars kommer vi inte att ha tillrÀckligt med diskutrymme. Att rotera dem Àr dÄligt, eftersom de görs med en omdirigering via shell till en katalog. Vi kan inte rotera det. Vi kan inte sÀga till applikationen att den ska öppna omdeskriptorerna. För utvecklarna skulle se pÄ dig som om du var idiot: "Vilka deskriptorer? Vi skriver överhuvudtaget till stdout." Infrastrukturteknikerna gjorde copytruncate i logrotate, som helt enkelt gör en kopia av filen och trunkerar den ursprungliga. DÀrför brukar det bli brist pÄ diskutrymme mellan dessa kopieringsprocesser.

(4) Vi hade olika format i olika API:er. De skiljde sig lite Ät, men vi behövde skriva olika regexp. Eftersom allt kontrollerades av Puppet, fanns det en stor bunt klasser med sina egna problem. Dessutom kunde td-agent Àta mycket minne ibland, hÀnga sig, och han kunde helt enkelt lÄtsas som om han arbetade, utan att göra nÄgot. UtifrÄn var det omöjligt att förstÄ att han inte gjorde nÄgot. I bÀsta fall skulle han krascha, och nÄgon skulle senare starta om honom. Mer exakt, ett larm skulle dyka upp, och nÄgon skulle gÄ och starta om det manuellt.

Yuri Bushmelev "KartlĂ€ggning av spikarna pĂ„ fĂ€lten för insamling och transporter av stockar" — en sammanfattning av presentationen

(6) Och den mest kaotiska delen var elasticsearch. För det var en gammal version. För vi hade inte dedikerade masters vid den tiden. Vi hade heterogena loggar, vars fÀlt kunde överlappa. Olika loggar frÄn olika applikationer kunde skrivas med samma fÀltnamn, men innehÄllet kunde vara olika. Det vill sÀga, en logg kommer med ett Integer i fÀltet, till exempel, level. En annan logg kommer med en String i fÀltet level. I avsaknad av statisk mapping fÄr vi nÄgot fantastiskt. Om ett meddelande som Àr en strÀng kommer först efter indexrotationen i elasticsearch, dÄ fungerar allt normalt. Men om det först kommer med ett Integer, sÄ kommer alla efterföljande meddelanden som kommer med en String helt enkelt att avvisas. För att fÀlttypen stÀmmer inte överens.

Yuri Bushmelev "KartlĂ€ggning av spikarna pĂ„ fĂ€lten för insamling och transporter av stockar" — en sammanfattning av presentationen

Vi började stÀlla oss dessa frÄgor. Vi bestÀmde oss för att inte leta efter skulden.

Yuri Bushmelev "KartlĂ€ggning av spikarna pĂ„ fĂ€lten för insamling och transporter av stockar" — en sammanfattning av presentationen

Men vi mÄste göra nÄgot! En uppenbar sak Àr att vi behöver upprÀtta standarder. Vi hade redan vissa standarder. Vissa införde vi lite senare. Lyckligtvis hade vi redan godkÀnt ett gemensamt loggformat för alla API:er vid det tillfÀllet. Det Àr specificerat direkt i standarderna för tjÀnsternas interaktion. DÀrför, de som vill ta emot loggar mÄste skriva dem i detta format. Om nÄgon inte skriver loggar i detta format, kan vi inte ge nÄgra garantier.

Vidare skulle vi vilja införa en enhetlig standard för sĂ€tt att skriva, leverera och samla loggar. Det handlar om vart man ska skriva dem och hur man ska leverera dem. Den idealiska situationen Ă€r nĂ€r samma bibliotek anvĂ€nds i projekten. HĂ€r finns ett separat loggningsbibliotek för Go, ett annat för PHP. Alla vi har — de mĂ„ste anvĂ€nda dem. För nĂ€rvarande skulle jag sĂ€ga att vi nĂ„r cirka 80 % av detta. Men vissa fortsĂ€tter att Ă€ta kaktusar.

Och just dÀr (pÄ bilden) börjar 'SLA för leverans av loggar' knappt att framtrÀda. Det finns Ànnu inte, men vi jobbar pÄ det. För det Àr mycket praktiskt nÀr infrastrukturen sÀger att om ni skriver i ett visst format pÄ en viss plats och inte mer Àn N meddelanden per sekund, sÄ kommer vi med viss sannolikhet att leverera det dit. Det tar bort mycket huvudvÀrk. Om SLA finns, Àr det helt fantastiskt!

Yuri Bushmelev "KartlĂ€ggning av spikarna pĂ„ fĂ€lten för insamling och transporter av stockar" — en sammanfattning av presentationen

Hur började vi lösa problemet? Den största fallgropen var med td-agent. Det var oklart vart vÄra loggar försvann. Levereras de? Samlas de? Var Àr de ens? DÀrför beslutades det i första hand att byta ut td-agent. Jag har sammanstÀllt nÄgra alternativ till vad vi kan byta ut det mot.

Fluentd. För det första, jag har stött pÄ det pÄ mitt tidigare jobb, och det föll ocksÄ periodiskt dÀr. För det andra, det Àr samma sak, men bÀttre anpassat.

Filebeat. Vad gjorde det bekvÀmt för oss? Eftersom det Àr gjort i Go, och vi har stor expertis i Go. SÄledes, om det behövs, kunde vi anpassa det till vÄra behov. DÀrför valde vi inte det. För att det inte ens skulle finnas frestelse att börja skriva om det.

Ett uppenbart beslut för systemadministratören Àr olika systemloggar i sÄdan mÀngd (syslog-ng/rsyslog/nxlog).

Eller skriva nÄgot eget, men det avfÀrdade vi, liksom filebeat. Om man ska skriva nÄgot, Àr det bÀttre att skriva nÄgot anvÀndbart för verksamheten. För att leverera loggar Àr det bÀttre att vÀlja nÄgot fÀrdigt.

SÄ valet kom i praktiken att stÄ mellan syslog-ng och rsyslog. Jag lutade mig mot rsyslog helt enkelt för att vi redan hade klasser för rsyslog i Puppet, och jag hittade ingen uppenbar skillnad mellan dem. Det Àr syslog hÀr ocksÄ. Ja, nÄgon har sÀmre dokumentation, nÄgon annan har bÀttre. Den ena kan sÄ, den andra pÄ ett annat sÀtt.

Yuri Bushmelev "KartlĂ€ggning av spikarna pĂ„ fĂ€lten för insamling och transporter av stockar" — en sammanfattning av presentationen

Lite om rsyslog. För det första Ă€r det superbra eftersom den har mĂ„nga moduler. Den har ett mĂ€nniskovĂ€nligt RainerScript (ett modernt konfigurationssprĂ„k). En fantastisk bonus Ă€r att vi kunde simulera beteendet hos td-agent med inbyggda medel, och inget förĂ€ndrades för applikationerna. Det vill sĂ€ga att vi byter ut td-agent mot rsyslog, utan att röra resten. Och fĂ„r omedelbart fungerande leverans. Dessutom, mmnormalize — det Ă€r en fantastisk grej i rsyslog. Den tillĂ„ter att parsa loggar, men inte med Grok och regexp. Den gör en abstrakt syntaxtrĂ€d. Den parserar loggar ungefĂ€r som en kompilator parserar kĂ€llkoden. Detta gör att det gĂ„r vĂ€ldigt snabbt, anvĂ€nder lite CPU, och Ă€r helt enkelt en riktigt cool grej. Det finns massor av andra fördelar. Jag kommer inte att stanna vid dem.

Yuri Bushmelev "KartlĂ€ggning av spikarna pĂ„ fĂ€lten för insamling och transporter av stockar" — en sammanfattning av presentationen

Rsyslog har ocksÄ en massa nackdelar. De Àr ungefÀr desamma som fördelarna. De största problemen Àr att man mÄste veta hur man konfigurerar det, och man mÄste vÀlja version.

Yuri Bushmelev "KartlĂ€ggning av spikarna pĂ„ fĂ€lten för insamling och transporter av stockar" — en sammanfattning av presentationen

Vi bestÀmde oss för att skriva loggar i en unix-socket. Och inte i /dev/log, för dÀr har vi en röra av systemloggar, dÀr journald Àr med i denna pipeline. SÄ lÄt oss skriva till en anpassad socket. Vi kopplar den till ett separat ruleset. Vi ska inte blanda ihop nÄgot. Allt blir transparent och tydligt. SÄ gjorde vi. Katalogen med dessa sockets Àr standardiserad och passeras till alla containrar. Containrarna kan se den socket de behöver, öppna och skriva till den.

Varför inte en fil? För att alla har lÀst artikeln om Badushchka, som försökte passera en fil till docker, och upptÀckte att efter en omstart av rsyslog förÀndras filbeskrivaren, och docker förlorar den filen. Den hÄller nÄgot annat öppet, men inte den socket dit vi skriver. Vi bestÀmde oss för att vi skulle lösa detta problem, och samtidigt Äka runt blockeringen.

Yuri Bushmelev "KartlĂ€ggning av spikarna pĂ„ fĂ€lten för insamling och transporter av stockar" — en sammanfattning av presentationen

Rsyslog utför Ă„tgĂ€rderna som anges pĂ„ sliden och skickar loggarna antingen till relay eller till Kafka. Kafka motsvarar det gamla sĂ€ttet. Relay — jag försökte anvĂ€nda ren rsyslog för loggleverans. Utan meddelandekö, med vanliga medel frĂ„n rsyslog. I princip fungerar det.

Yuri Bushmelev "KartlĂ€ggning av spikarna pĂ„ fĂ€lten för insamling och transporter av stockar" — en sammanfattning av presentationen

Men det finns nyanser med hur man sedan stoppar dem i denna del (Logstash/Graylog/ES). Denna del (rsyslog-rsyslog) anvÀnds mellan datacenter. HÀr Àr en komprimerad tcp-lÀnk som sparar bandbredd och ökar sannolikheten att vi fÄr loggar frÄn ett annat datacenter under förhÄllanden nÀr kanalen Àr överbelastad. För vi har Indonesien, dÀr allt Àr dÄligt. DÀr Àr detta ett stÀndigt problem.

Yuri Bushmelev "KartlĂ€ggning av spikarna pĂ„ fĂ€lten för insamling och transporter av stockar" — en sammanfattning av presentationen

Vi funderade pÄ hur vi faktiskt kan övervaka med vilken sannolikhet loggarna vi skrivit frÄn applikationen nÄr fram till slutet. Vi beslöt oss för att införa metrik. Rsyslog har sin egen statistikinsamlingsmodul som har olika rÀknare. Till exempel kan den visa storleken pÄ kön, eller hur mÄnga meddelanden som kommit in vid en viss ÄtgÀrd. Av dessa kan man fÄ fram nÄgot. Dessutom har den anpassade rÀknare som kan konfigureras, och den kommer att visa exempelvis antalet meddelanden som ett visst API skrivit. Vidare skrev jag rsyslog_exporter i Python, och vi skickade allt detta till Prometheus och byggde grafer. Vi hade gÀrna velat ha Graylog-metrik, men vi har inte hunnit konfigurera dem Ànnu.

Yuri Bushmelev "KartlĂ€ggning av spikarna pĂ„ fĂ€lten för insamling och transporter av stockar" — en sammanfattning av presentationen

Vilka problem uppstod? Problem uppstod dÄ vi ovÀntat upptÀckte att vÄra Live API skickade 50 000 meddelanden per sekund. Det Àr bara Live API utan staging. Och Graylog visar oss bara 12 000 meddelanden per sekund. Och dÄ uppstod den rimliga frÄgan, var Àr resten? FrÄn detta drog vi slutsatsen att Graylog helt enkelt inte klarade av det. Vi kollade, och faktiskt, Graylog med Elasticsearch hanterade inte denna belastning.

Vidare, andra insikter som vi gjorde under processen.

InlÀgg i socket blockeras. Hur hÀnde detta? NÀr jag anvÀnde rsyslog för leverans, sÄ brast kanalen mellan datacentren vid ett tillfÀlle. Leveransen stannade pÄ ett stÀlle, leveransen stannade pÄ ett annat stÀlle. Allt detta nÄdde maskinen med API:erna, som skriver i rsyslog-socket. DÀr fylldes kön. Sedan fylldes kön för skrivning till unix socket, som som standard har 128 paket. Och nÀsta write() i applikationen blockeras. NÀr vi tittade i biblioteket som vi anvÀnder i vÄra Go-applikationer stod det att skrivning till socket sker i icke-blockerande lÀge. Vi var övertygade om att ingenting blockeras. Eftersom vi lÀste. artikeln om Badushchka, som skrev om detta. Men det finns en punkt. Rundt detta anrop var det ocksÄ en oÀndlig slinga dÀr vi stÀndigt försökte trycka meddelandet i socketen. Det mÀrkte vi inte. Vi fick skriva om biblioteket. Sedan dess har det förÀndrats flera gÄnger, men nu har vi blivit av med lÄsningar i alla delsystem. DÀrför kan vi stoppa rsyslog utan att nÄgot kommer att falla.

Vi mÄste övervaka storleken pÄ köerna, vilket hjÀlper oss att undvika dessa problem. För det första kan vi övervaka nÀr vi börjar förlora meddelanden. För det andra kan vi övervaka att vi har problem med leveransen i allmÀnhet.

Och ytterligare ett obehagligt problem – förstĂ€rkning med 10 gĂ„nger i mikrotjĂ€narkitekturen – det Ă€r extremt enkelt. Vi har inte sĂ„ mĂ„nga inkommande förfrĂ„gningar, men pĂ„ grund av grafen som dessa meddelanden senare löper pĂ„, pĂ„ grund av access-loggar, ökar vi verkligen belastningen pĂ„ loggarna med ungefĂ€r tio gĂ„nger. Jag har tyvĂ€rr inte haft tid att rĂ€kna ut de exakta siffrorna, men mikrotjĂ€nster Ă€r sĂ„. Det Ă€r nĂ„got man mĂ„ste ha i Ă„tanke. Just nu Ă€r loggsamlingssystemet det mest belastade i Lazada.

Yuri Bushmelev "KartlĂ€ggning av spikarna pĂ„ fĂ€lten för insamling och transporter av stockar" — en sammanfattning av presentationen

Hur löser man problemet med elasticsearch? Om man snabbt behöver fÄ loggar pÄ ett stÀlle, sÄ att man inte behöver springa runt pÄ alla maskiner och samla dem dÀr, anvÀnd en filbaserad lagring. Det fungerar garanterat. Det görs frÄn vilken server som helst. Man behöver bara stoppa dit diskar och sÀtta upp syslog. Efter det har ni garanterat alla loggar pÄ ett stÀlle. Sedan kan man i lugn och ro konfigurera elasticsearch, graylog eller nÄgot annat. Men ni kommer redan att ha alla loggar, och dessutom kan ni lagra dem sÄ lÀnge lagringskapaciteten rÀcker.

Yuri Bushmelev "KartlĂ€ggning av spikarna pĂ„ fĂ€lten för insamling och transporter av stockar" — en sammanfattning av presentationen

Vid tiden för min presentation sÄg schemat ut sÄ hÀr. Vi har praktiskt taget slutat skriva till fil. Nu kommer vi förmodligen att stÀnga av de sista resterna. PÄ de lokala maskiner dÀr API:erna körs kommer vi att sluta skriva till filer. För det första finns det en filbaserad lagringslösning som fungerar mycket bra. För det andra tar det slut pÄ utrymme pÄ dessa maskiner stÀndigt, och vi behöver övervaka det hela tiden.

Den hÀr delen med Logstash och Graylog Àr verkligen besvÀrlig. DÀrför mÄste vi bli av med den. Vi mÄste vÀlja nÄgot av det.

Yuri Bushmelev "KartlĂ€ggning av spikarna pĂ„ fĂ€lten för insamling och transporter av stockar" — en sammanfattning av presentationen

Vi har bestÀmt oss för att avveckla Logstash och Kibana. För vi har en sÀkerhetsavdelning. Vad har det med saken att göra? Sambandet Àr att Kibana utan X-Pack och utan Shield inte tillÄter Ätkomstkontroll för loggar. DÀrför valde vi Graylog. Det Àr inte min favorit, men det fungerar. Vi köpte ny hÄrdvara, installerade en ny version av Graylog och flyttade alla loggar med strikta format till en separat Graylog. Vi har löst problemet med olika typer av identiska fÀlt organisatoriskt.

Yuri Bushmelev "KartlĂ€ggning av spikarna pĂ„ fĂ€lten för insamling och transporter av stockar" — en sammanfattning av presentationen

Vad ingÄr egentligen i den nya Graylog? Vi skrev helt enkelt allt i Docker. Vi tog en massa servrar, distribuerade tre instanser av Kafka, 7 servrar av Graylog version 2.3 (eftersom vi ville ha Elasticsearch version 5). Allt detta kördes pÄ RAID med HDD. Vi sÄg en indexeringshastighet pÄ upp till 100 000 meddelanden per sekund. Vi sÄg siffran att 140 terabyte data per vecka.

Yuri Bushmelev "KartlĂ€ggning av spikarna pĂ„ fĂ€lten för insamling och transporter av stockar" — en sammanfattning av presentationen

Och sÄ kom motgÄngarna igen! Vi har tvÄ utförsÀljningar pÄ gÄng. Vi har flyttat över 6 miljoner meddelanden. VÄr Graylog hinner inte med. Vi mÄste pÄ nÄgot sÀtt överleva igen.

Yuri Bushmelev "KartlĂ€ggning av spikarna pĂ„ fĂ€lten för insamling och transporter av stockar" — en sammanfattning av presentationen

Vi överlevde pÄ följande sÀtt. Vi lade till nÄgra fler servrar och SSD. För tillfÀllet lever vi pÄ det hÀr sÀttet. Nu bearbetar vi redan 160 000 meddelanden per sekund. Vi har inte nÄtt grÀnsen Àn, sÄ det Àr oklart hur mycket vi verkligen kan dra frÄn detta.

Yuri Bushmelev "KartlĂ€ggning av spikarna pĂ„ fĂ€lten för insamling och transporter av stockar" — en sammanfattning av presentationen

SÄ hÀr ser vÄra framtidsplaner ut. Av dem Àr det sannolikt mest viktiga, hög tillgÀnglighet. Vi har inte det Ànnu. NÄgra maskiner Àr konfigurerade lika, men allt gÄr fortfarande via en maskin. Vi mÄste ta oss tid att stÀlla in failover mellan dem.

Samla in metrik frÄn Graylog.

SÀtta upp en rate limit sÄ att en överbelastad API inte dödar vÄr bandbredd och allt annat.

Och slutligen, skriva ett SLA med utvecklarna som anger hur mycket vi kan hantera. Om ni skriver mer, sÄ beklagar jag.

Och skriva dokumentation.

Yuri Bushmelev "KartlĂ€ggning av spikarna pĂ„ fĂ€lten för insamling och transporter av stockar" — en sammanfattning av presentationen

Sammanfattningsvis, resultaten av allt vi har gÄtt igenom. För det första, standarder. För det andra, syslog - en tÄrta. För det tredje, rsyslog fungerar precis sÄ hÀr som det stÄr pÄ sliden. LÄt oss gÄ vidare till frÄgorna.

FrÄgor.

FrĂ„ga: Varför beslutade ni att inte anvĂ€nda
 (filebeat?)

Svar: Vi mÄste skriva till en fil. Det ville jag verkligen undvika. NÀr du har en API som skriver tusentals meddelanden per sekund, Àven om du roterar varje timme, Àr det fortfarande inte en lösning. Du kan skriva till en pipe. PÄ vilket utvecklarna frÄgade: "Vad hÀnder om processen vi skriver till kraschar"? Jag kunde helt enkelt inte hitta ett svar och sa: "Okej, lÄt oss inte göra sÄ."

FrÄga: Varför skriver ni inte loggar direkt i HDFS?

Svar: Det Àr nÀsta steg. Vi tÀnkte pÄ det i början, men eftersom vi för nÀrvarande inte har resurser att arbeta med det sÄ ligger det som en lÄngsiktig lösning.

FrÄga: Kolumnformatet skulle vara mer lÀmpligt.

Svar: Jag förstÄr allt. Vi Àr helt för det.

FrÄga: Ni skriver i rsyslog. DÀr kan man anvÀnda bÄde TCP och UDP. Men om ni anvÀnder UDP, hur garanterar ni dÄ leveransen?

Svar: Det finns tvÄ aspekter. För det första, jag sÀger alltid till alla att vi inte garanterar loggar levereras. För nÀr utvecklarna kommer och sÀger: 'LÄt oss börja skriva finansiella data dit, och ni kommer att lagra dem nÄgonstans i fall nÄgot hÀnder', svarar vi: 'UtmÀrkt! LÄt oss blockera skrivningen till socket och göra detta i transaktioner sÄ att ni garanterat skriver till vÄr socket och ser till att vi fÄr det frÄn er sida.' Just i det ögonblicket blir det plötsligt mindre intressant för dem. Och eftersom det inte Àr intressant, varför skulle vi dÄ ha nÄgra frÄgor? Om ni inte vill garantera skrivning i socket, varför ska vi garantera leverans? Vi gör vÄrt bÀsta. Vi försöker verkligen leverera sÄ mycket som möjligt och sÄ bra som möjligt, men vi ger inte 100% garanti. SÄ för detta, skriv inte finansiella data dÀr. För det finns databaser med transaktioner.

FrÄga: NÀr API:t genererar ett meddelande i loggen och överlÀmnar kontrollen till mikrotjÀnsterna, har ni dÄ stött pÄ problem med att meddelanden frÄn olika mikrotjÀnster kommer i fel ordning? Detta kan leda till förvirring.

Svar: Det Àr normalt att de kommer i olika ordningar. Man mÄste vara beredd pÄ det. Eftersom vilken nÀtverksleverans som helst garanterar inte ordningen, eller sÄ mÄste man avsÀtta speciella resurser för det. Om vi tar filsystem, sÄ sparar varje API loggar i sin egen fil. RÀttare sagt, rsyslog sorterar dem i mappar. Varje API har sina egna loggar, som man kan gÄ till och se, och sedan kan man matcha dem efter tidsstÀmpel i den loggen. Om de tittar i Graylog, sÄ sorteras det dÀr efter tidsstÀmpel. Allt kommer att se bra ut dÀr.

FrÄga: TidsstÀmpeln kan skilja sig med millisekunder.

Svar: TidsstÀmpeln genereras av API:t sjÀlvt. Det Àr egentligen hela grejen. Vi har NTP. API:t genererar tidsstÀmpeln redan i meddelandet. Det Àr inte rsyslog som lÀgger till den.

FrÄga: Det Àr inte helt klart hur interaktionen mellan datacentren fungerar. Inom datacentret Àr det klart hur loggarna samlades och bearbetades. Hur gÄr interaktionen mellan datacentren till? Eller lever varje datacenter sitt eget liv?

Svar: NÀstan. Vi har varje land i ett specifikt datacenter. Just nu har vi inget utspritt system, sÄ ett land Àr inte placerat i olika datacenter. SÄ det behöver inte kombineras. Inom varje center finns det en Log Relay. Det Àr en Rsyslog-server. Faktiskt finns det tvÄ hanteringsmaskiner. De Àr konfigurerade pÄ samma sÀtt. Men just nu gÄr bara trafiken genom en av dem. Den aggregaterar alla loggar. Den har en disk-kö för sÀkerhets skull. Den komprimerar loggarna och skickar dem till det centrala datacentret (i Singapore), dÀr de sedan skickas till Graylog. Och i varje datacenter finns sin egen fil-lagring. Om vi förlorar kontakten har vi alla loggar dÀr. De stannar dÀr. De kommer att sparas.

FrÄga: FÄr du loggar dÀrifrÄn vid onormala situationer?

Svar: Man kan gÄ dit (till fil-lagringen) och kolla.

FrÄga: Hur övervakar ni att ni inte förlorar loggar?

Svar: Vi förlorar dem faktiskt, och vi övervakar det. Övervakningen startade för en mĂ„nad sedan. I biblioteket som anvĂ€nds av Go API finns det mĂ€tvĂ€rden. Den kan rĂ€kna hur mĂ„nga gĂ„nger den inte kunde skriva till socketen. Just nu finns det en smart heuristik. Det finns en buffert. Den försöker skriva meddelandet frĂ„n den till socketen. Om bufferten blir full börjar den droppa dem. Och rĂ€knar hur mĂ„nga den har droppat. Om rĂ€knarna börjar bli fulla fĂ„r vi veta det. De Ă„ker nu ocksĂ„ till Prometheus, och i Grafana kan man se grafer. Man kan stĂ€lla in aviseringar. Men Ă€n sĂ„ lĂ€nge Ă€r det oklart vem man ska skicka dem till.

FrÄga: I Elasticsearch lagrar ni loggar med replikering. Hur mÄnga repliker har ni?

Svar: En replik.

FrÄga: Det Àr endast en replik?

Svar: Det Àr en master och en replik. Data lagras i tvÄ exemplar.

FrÄga: Har ni justerat storleken pÄ rsyslog-bufferten pÄ nÄgot sÀtt?

Svar: Vi skriver datagram till en anpassad unix socket. Detta begrÀnsar oss till 128 kilobyte. Vi kan inte skriva mer Àn sÄ. Vi har specificerat detta i standarden. Den som vill lagra data skriver 128 kilobyte. Biblioteken klipper faktiskt och sÀtter en flagga för att ange att meddelandet har klippts. I vÄr standard för meddelandet finns det ett speciellt fÀlt som visar om det har klippts vid skrivning eller inte. SÄ vi har möjlighet att spÄra den aspekten ocksÄ.

FrÄga: Skriver du trasig JSON?

Svar: Trasig JSON kommer att kasseras antingen under relay, eftersom paketet Àr för stort. Eller sÄ kommer Graylog att kassera det eftersom den inte kan parsa JSON. Men det finns nyanser som behöver ÄtgÀrdas, och de Àr mestadels kopplade till rsyslog. Jag har redan fyllt i nÄgra problem dÀr som fortfarande behöver arbete.

FrÄga: Varför Kafka? Har du provat RabbitMQ? Fungerar inte Graylog under sÄdana belastningar?

Svar: Vi fÄr inte det att fungera med Graylog. Men Graylog fungerar för oss. Det Àr verkligen problematiskt. Det Àr en speciell typ av sak. Och i sjÀlva verket behövs den inte. Jag skulle föredra att skriva direkt frÄn rsyslog till elasticsearch och sedan titta pÄ Kibana. Men vi behöver klara upp frÄgan med sÀkerhetsansvariga. Det Àr ett möjligt utvecklingsalternativ för oss, nÀr vi kastar bort Graylog och börjar anvÀnda Kibana. Det finns ingen mening med att anvÀnda Logstash. För jag kan göra allt detsamma med rsyslog. Och den har en modul för att skriva till elasticsearch. Med Graylog försöker vi pÄ nÄgot sÀtt klara oss. Vi har till och med optimerat den lite. Men det finns fortfarande utrymme för förbÀttringar dÀr.

Om Kafka. Det har historiskt sett blivit sĂ„. NĂ€r jag kom, fanns den redan, och loggar skrevs redan till den. Vi installerade bara vĂ„r kluster och flyttade loggarna dit. Vi hanterar den, vi vet hur den mĂ„r. NĂ€r det gĂ€ller RabbitMQ
 det fungerar inte riktigt för oss. Men RabbitMQ fungerar för oss. Vi har det i produktion och hade problem med det. Nu skulle vi ha fixat det innan försĂ€ljningen, och det började fungera ordentligt. Men innan det var jag inte redo att lansera det i produktion. Det finns ytterligare en punkt. Graylog kan lĂ€sa version AMQP 0.9, medan rsyslog kan skriva version AMQP 1.0. Det finns inget lösning som kan bĂ„de och. Antingen det ena eller det andra. SĂ„ just nu Ă€r det bara Kafka. Men dĂ€r finns ocksĂ„ sina nuanser. För omkafka av den versionen av rsyslog som vi anvĂ€nder kan förlora hela meddelandebufferten som den har fĂ„tt frĂ„n rsyslog. För tillfĂ€llet fĂ„r vi leva med det.

FrÄga: AnvÀnder ni Kafka för att den redan fanns hos er? AnvÀnds den inte till nÄgra andra syften?

Svar: Kafka som fanns, anvÀnds av Data Science-teamet. Det Àr ett helt eget projekt som jag tyvÀrr inte kan sÀga nÄgot om. Jag Àr inte insatt. Den var under Data Science-teamets ansvar. NÀr loggarna startades sÄ beslutades det att anvÀnda den för att inte behöva installera en egen. Nu har vi uppdaterat Graylog, och vi har förlorat kompatibiliteten eftersom det Àr en gammal version av Kafka. Vi var tvungna att skapa vÄr egen. Samtidigt blev vi av med de fyra Àmnena för varje API. Vi gjorde ett brett Àmne för alla live, ett brett Àmne för alla staging och skickade allt dit. Graylog extraherar allt detta parallellt.

FrÄga: Varför behövs detta trixande med sockets? Har ni försökt anvÀnda syslog-loggdrivrutinen för containrar?

Svar: Vid den tidpunkten nÀr vi stÀllde oss frÄgan var vÄr relation till Docker anstrÀngd. Det var Docker 1.0 eller 0.9. Docker var i sig sjÀlv mÀrkligt. För det andra, om man dessutom skulle fÄ in loggar... Jag har en obekrÀftad misstanke om att den slÀpper igenom alla loggar via Docker-demonen. Om ett API fÄr problem stötter de andra API:erna pÄ att de inte kan skicka stdout och stderr. Jag vet inte vart detta leder. Jag har en kÀnslomÀssig misstanke om att vi inte borde anvÀnda Docker-syslog-drivrutinen just hÀr. VÄr avdelning för funktionell testning har sin egna lille Graylog-kluster med loggar. De anvÀnder Docker-loggdrivrutiner och de verkar ha det ganska bra. Men de skriver direkt till Graylog i GELF-format. Vid den tidpunkten nÀr vi startade allt detta behövde vi att det helt enkelt skulle fungera. Kanske senare, nÀr nÄgon kommer och sÀger att det har fungerat bra i hundra Är, kommer vi att prova.

FrÄga: Gör ni leverans mellan datacentren med rsyslog? Varför inte med Kafka?

Svar: Vi gör faktiskt bÄde och. Av tvÄ skÀl. Om kanalen Àr helt förstörd gÄr inte ens alla loggar i komprimerad form igenom den. Och Kafka tillÄter oss att förlora dem under processen. PÄ sÄ sÀtt slipper vi fastna i dessa loggar. I det hÀr fallet anvÀnder vi Kafka direkt. Om vi har en bra kanal och vill frigöra den anvÀnder vi rsyslog. Men man kan faktiskt konfigurera det sÄ att det sjÀlv slÀpper det som inte gÄr igenom. För tillfÀllet anvÀnder vi pÄ vissa stÀllen leverans med rsyslog direkt och pÄ andra stÀllen Kafka.

KĂ€lla: habr.com

Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar đŸ”„ Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster