Yuri Bushmelev "Karta över kratta pÄ fÀltet för att samla in och leverera stockar" - utskrift av rapporten

Loggar Àr en viktig del av systemet, sÄ att du kan förstÄ att det fungerar (eller inte fungerar) som förvÀntat. I en mikrotjÀnstarkitektur blir arbetet med loggar en separat disciplin för en speciell Olympiad. En massa frÄgor mÄste lösas pÄ en gÄng:

  • hur man skriver loggar frĂ„n en applikation;
  • var man skriver loggar;
  • hur man levererar stockar för lagring och bearbetning;
  • hur man bearbetar och lagrar loggar.

AnvÀndningen av för nÀrvarande populÀra containeriseringsteknologier lÀgger till sand ovanpÄ raken till fÀltet av alternativ för att lösa problemet.

Det Àr precis vad utskriften av Yuri Bushmelevs rapport "Karta över krattor inom omrÄdet för insamling och leverans av stockar" handlar om.

För alla intresserade, se katt.

Jag heter Yuri Bushmelev. Jag jobbar pÄ Lazada. Idag ska jag prata om hur vi gjorde vÄra loggar, hur vi samlade in dem och vad vi skriver dÀr.

Yuri Bushmelev "Karta över kratta pÄ fÀltet för att samla in och leverera stockar" - utskrift av rapporten

Var kommer vi ifrÄn? Vilka Àr vi? Lazada Àr den första online-ÄterförsÀljaren i sex lÀnder i Sydostasien. Alla dessa lÀnder Àr fördelade pÄ vÄra datacenter. Det finns för nÀrvarande 1 datacenter totalt. Varför Àr detta viktigt? För vissa beslut berodde pÄ att det Àr en vÀldigt svag lÀnk mellan centra. Vi har en mikroservicearkitektur. Jag blev förvÄnad nÀr jag upptÀckte att vi redan har 4 mikrotjÀnster. NÀr jag började med uppgiften med loggar fanns det bara 80. Plus att det finns ett ganska stort PHP-arv som jag ocksÄ mÄste leva med och stÄ ut med. Allt detta genererar för nÀrvarande mer Àn 20 miljoner meddelanden per minut för systemet som helhet. HÀrnÀst kommer jag att visa hur vi försöker leva med detta, och varför det Àr sÄ.

Yuri Bushmelev "Karta över kratta pÄ fÀltet för att samla in och leverera stockar" - utskrift av rapporten

Du mÄste pÄ nÄgot sÀtt leva med dessa 6 miljoner meddelanden. Vad ska vi göra med dem? 6 miljoner meddelanden du behöver:

  • skicka frĂ„n appen
  • acceptera för leverans
  • leverera för analys och lagring.
  • analysera
  • lagra det pĂ„ nĂ„got sĂ€tt.

Yuri Bushmelev "Karta över kratta pÄ fÀltet för att samla in och leverera stockar" - utskrift av rapporten

NÀr tre miljoner meddelanden dök upp sÄg jag ungefÀr likadan ut. För vi började med bara nÄgra ören. Det Àr tydligt att ansökningsloggar skrivs dÀr. Jag kunde till exempel inte ansluta till databasen, jag kunde ansluta till databasen men jag kunde inte lÀsa nÄgonting. Men förutom detta skriver var och en av vÄra mikrotjÀnster ocksÄ en Ätkomstlogg. Varje begÀran som kommer till mikrotjÀnsten registreras i loggen. Varför gör vi det hÀr? Utvecklare vill kunna spÄra. Varje Ätkomstlogg innehÄller ett spÄrningsfÀlt, med vilket ett speciellt grÀnssnitt sedan avvecklar hela kedjan och visar spÄret vackert. SpÄret visar hur förfrÄgan gick, och detta hjÀlper vÄra utvecklare att snabbt hantera allt oidentifierat skrÀp.

Yuri Bushmelev "Karta över kratta pÄ fÀltet för att samla in och leverera stockar" - utskrift av rapporten

Hur ska man leva med detta? Nu ska jag kort beskriva alternativomrÄdet - hur detta problem i allmÀnhet löses. Hur man löser problemet med att samla in, överföra och lagra loggar.

Yuri Bushmelev "Karta över kratta pÄ fÀltet för att samla in och leverera stockar" - utskrift av rapporten

Hur skriver man frÄn en ansökan? Det Àr klart att det finns olika sÀtt. I synnerhet finns det bÀsta praxis, som vÄra fashionabla kamrater sÀger till oss. Det finns tvÄ typer av old school, som vÄra farfar sa till oss. Det finns andra sÀtt.

Yuri Bushmelev "Karta över kratta pÄ fÀltet för att samla in och leverera stockar" - utskrift av rapporten

Situationen med att samla stockar Àr ungefÀr densamma. Det finns inte mÄnga alternativ för att lösa just den hÀr delen. Det finns redan fler av dem, men inte sÄ mÄnga Ànnu.

Yuri Bushmelev "Karta över kratta pÄ fÀltet för att samla in och leverera stockar" - utskrift av rapporten

Men med leverans och efterföljande analys börjar antalet variationer explodera. Jag kommer inte att beskriva varje alternativ nu. Jag tror att de viktigaste alternativen Àr vÀlkÀnda för alla som Àr intresserade av Àmnet.

Yuri Bushmelev "Karta över kratta pÄ fÀltet för att samla in och leverera stockar" - utskrift av rapporten

Jag ska visa dig hur vi gjorde det pÄ Lazada, och hur det hela började.

Yuri Bushmelev "Karta över kratta pÄ fÀltet för att samla in och leverera stockar" - utskrift av rapporten

För ett Är sedan kom jag till Lazada och blev skickad till ett projekt om stockar. Det var nÄgot sÄnt hÀr. Ansökningsloggen skrevs till stdout och stderr. Allt gjordes pÄ ett moderiktigt sÀtt. Men sedan slÀngde utvecklarna ut det frÄn standardflödena, och dÄ kommer pÄ nÄgot sÀtt infrastrukturspecialister att ta reda pÄ det. Mellan infrastrukturspecialister och utvecklare finns det ocksÄ utgivare som sa: "eh... okej, lÄt oss bara slÄ in dem i en fil med ett skal, och det Àr det." Och eftersom allt detta lÄg i en container, lindade de in det direkt i sjÀlva containern, kartlade katalogen inuti och lade den dÀr. Jag tror att det Àr ganska uppenbart för alla vad som kom ur det.

Yuri Bushmelev "Karta över kratta pÄ fÀltet för att samla in och leverera stockar" - utskrift av rapporten

LÄt oss titta lite lÀngre Àn sÄ lÀnge. Hur levererade vi dessa stockar? NÄgon valde td-agent, som egentligen Àr flytande, men inte riktigt flytande. Jag förstÄr fortfarande inte förhÄllandet mellan dessa tvÄ projekt, men de verkar handla om samma sak. Och denna flytande, skriven i Ruby, lÀste loggfiler, analyserade dem till JSON med nÄgon form av regelbundenhet. Sedan skickade jag dem till Kafka. Dessutom hade vi i Kafka fyra separata Àmnen för varje API. Varför 4? För att det finns live, det finns iscensÀttning och för att det finns stdout och stderr. Utvecklare skapar dem, och infrastrukturutvecklare mÄste skapa dem i Kafka. Dessutom kontrollerades Kafka av en annan avdelning. DÀrför var det nödvÀndigt att skapa en biljett sÄ att de skulle skapa 4 Àmnen för varje api. Alla glömde det. I allmÀnhet var det skrÀp och tjafs.

Yuri Bushmelev "Karta över kratta pÄ fÀltet för att samla in och leverera stockar" - utskrift av rapporten

Vad gjorde vi sedan med detta? Vi skickade den till Kafka. Sedan flög hÀlften av stockarna frÄn Kafka till Logstash. Den andra hÀlften av stockarna delades. NÄgra flög till en Graylog, nÄgra till en annan Graylog. Som ett resultat gick allt detta in i ett Elasticsearch-kluster. Det vill sÀga, all denna röra hamnade dÀr. Gör inte det!

Yuri Bushmelev "Karta över kratta pÄ fÀltet för att samla in och leverera stockar" - utskrift av rapporten

SÄ hÀr ser det ut om man ser det uppifrÄn. Gör inte det! HÀr markeras problemomrÄdena omedelbart med siffror. Det finns faktiskt fler av dem, men 6 Àr verkligen problematiska som mÄste göras nÄgot Ät. Jag ska berÀtta om dem separat nu.

Yuri Bushmelev "Karta över kratta pÄ fÀltet för att samla in och leverera stockar" - utskrift av rapporten

HÀr (1,2,3) skriver vi filer och följaktligen finns det tre rakes hÀr samtidigt.

Den första (1) Àr att vi mÄste skriva dem nÄgonstans. Det skulle inte alltid vara önskvÀrt att ge API:et möjlighet att skriva direkt till en fil. Det Àr önskvÀrt att API:t Àr isolerat i en behÄllare, eller Ànnu bÀttre, att det Àr skrivskyddat. Jag Àr systemadministratör, sÄ jag har en lite alternativ syn pÄ dessa saker.

Den andra punkten (2,3) Ă€r att vi har mĂ„nga förfrĂ„gningar som kommer till API:t. API:et skriver mycket data till en fil. Filerna vĂ€xer. Vi mĂ„ste rotera dem. För annars kommer du inte att kunna fylla pĂ„ nĂ„gra diskar dĂ€r. Att rotera dem Ă€r dĂ„ligt eftersom de görs genom att omdirigera genom skalet till katalogen. Det finns inget sĂ€tt vi kan revidera det. Du kan inte sĂ€ga Ă„t programmet att öppna handtagen igen. Eftersom utvecklarna kommer att se pĂ„ dig som om du Ă€r en idiot: "Vilka beskrivningar? Vi skriver vanligtvis till stdout.” Infrastrukturutvecklare gjorde copytruncate till logrotate, vilket helt enkelt gör en kopia av filen och transkriberar originalet. Följaktligen tar vanligtvis diskutrymmet slut mellan dessa kopieringsprocesser.

(4) Vi hade olika format i olika API:er. De var lite olika, men regexp mÄste skrivas annorlunda. Eftersom allt detta styrdes av Puppet fanns det ett stort gÀng klasser med sina egna kackerlackor. Plus, för det mesta kunde td-agent Àta minne, vara dum, den kunde bara lÄtsas att den fungerade och inte göra nÄgonting. FrÄn utsidan var det omöjligt att förstÄ att han inte gjorde nÄgonting. I bÀsta fall kommer han att ramla och nÄgon tar upp honom senare. NÀrmare bestÀmt kommer en varning, och nÄgon kommer att gÄ och höja den med sina hÀnder.

Yuri Bushmelev "Karta över kratta pÄ fÀltet för att samla in och leverera stockar" - utskrift av rapporten

(6) Och mest skrÀp och avfall var elasticsearch. För det var en gammal version. För vi hade inte dedikerade mÀstare pÄ den tiden. Vi hade heterogena stockar vars fÀlt kunde överlappa varandra. Olika loggar frÄn olika applikationer kan skrivas med samma fÀltnamn, men det kan finnas olika data inuti. Dvs en logg kommer med heltal i fÀltet, till exempel nivÄ. En annan logg kommer med String i nivÄfÀltet. I avsaknad av statisk kartlÀggning Àr detta en sÄ underbar sak. Om, efter att ha roterat indexet i elasticsearch, kommer meddelandet med strÀngen först, dÄ lever vi normalt. Men om det första kom frÄn Integer, sÄ kasseras helt enkelt alla efterföljande meddelanden som kom frÄn String. Eftersom fÀlttypen inte matchar.

Yuri Bushmelev "Karta över kratta pÄ fÀltet för att samla in och leverera stockar" - utskrift av rapporten

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

Yuri Bushmelev "Karta över kratta pÄ fÀltet för att samla in och leverera stockar" - utskrift av rapporten

Men nÄgot mÄste göras! Det uppenbara Àr att vi mÄste faststÀlla standarder. Vi hade redan nÄgra standarder. Vi började lite senare. Lyckligtvis hade ett enda loggformat för alla API:er redan godkÀnts vid den tiden. Den skrivs direkt in i standarderna för interaktion mellan tjÀnster. Följaktligen mÄste de som vill ta emot loggar skriva dem i detta format. Om nÄgon inte skriver loggar i detta format sÄ garanterar vi ingenting.

DÀrefter skulle jag vilja skapa en enhetlig standard för metoderna för inspelning, leverans och insamling av loggar. Egentligen, var man ska skriva dem och hur man levererar dem. Den idealiska situationen Àr nÀr projekt anvÀnder samma bibliotek. Det finns ett separat loggningsbibliotek för Go och ett separat bibliotek för PHP. Alla vi har borde anvÀnda dem. I nulÀget skulle jag sÀga att vi Àr 80 procent framgÄngsrika i detta. Men vissa mÀnniskor fortsÀtter att Àta kaktusar.

Och dÀr (pÄ bilden) börjar knappt "SLA för leverans av stockar" dyka upp. Det finns inte Àn, men vi jobbar pÄ det. För det Àr vÀldigt bekvÀmt nÀr infrastrukturen sÀger att om man skriver i ett och annat format till ett och ett stÀlle och inte mer Àn N meddelanden per sekund sÄ kommer vi med största sannolikhet att leverera det till ett och annat stÀlle. Detta lindrar mycket huvudvÀrk. Om det finns en SLA sÄ Àr detta helt underbart!

Yuri Bushmelev "Karta över kratta pÄ fÀltet för att samla in och leverera stockar" - utskrift av rapporten

Hur började vi lösa problemet? Det största problemet var med td-agent. Det var inte klart vart vÄra stockar tog vÀgen. Levereras de? GÄr de? Var Àr de förresten? DÀrför beslutades den första punkten att ersÀtta td-agent. Jag har kort beskrivit alternativen för vad den ska ersÀttas med hÀr.

Flytande. För det första stötte jag pÄ honom pÄ ett tidigare jobb, och han ramlade ocksÄ dÄ och dÄ. För det andra Àr detta samma sak, bara i profil.

Filebeat. Hur var det bekvÀmt för oss? För det Àr i Go, och vi har mycket expertis inom Go. Följaktligen, om nÄgot hÀnde, kan vi pÄ nÄgot sÀtt lÀgga till det för oss sjÀlva. Det var dÀrför vi inte tog det. SÄ att det inte ens Àr nÄgon frestelse att börja skriva om det sjÀlv.

Den sjÀlvklara lösningen för systemadministratören Àr alla typer av syslogs i denna mÀngd (syslog-ng/rsyslog/nxlog).

Eller skriv nÄgot eget, men vi kasserade detta, sÄvÀl som filebeat. Om du skriver nÄgot Àr det bÀttre att skriva nÄgot anvÀndbart för affÀrer. För att leverera stockar Àr det bÀttre att ta nÄgot fÀrdigt.

DÀrför kom valet faktiskt ner pÄ valet 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. Vad Àr syslog, vad Àr syslog. Ja, vissa har sÀmre dokumentation, andra har bÀttre. Den hÀr kan göra det pÄ det hÀr sÀttet, och den andra kan göra det annorlunda.

Yuri Bushmelev "Karta över kratta pÄ fÀltet för att samla in och leverera stockar" - utskrift av rapporten

Och lite om rsyslog. Först och frÀmst Àr det coolt eftersom det har mÄnga moduler. Det har mÀnskligt lÀsbart RainerScript (ett modernt konfigurationssprÄk). Det Àr en fantastisk bonus att vi kunde efterlikna beteendet hos td-agent med standardverktyg, och ingenting förÀndrades för applikationer. Det vill sÀga, vi byter td-agent till rsyslog och lÄter allt annat vara ifred tills vidare. Och vi fÄr omedelbart fungerande leverans. DÀrefter Àr mmnormalize en fantastisk sak i rsyslog. Det lÄter dig analysera loggar, men inte med Grok och regexp. Det gör ett abstrakt syntaxtrÀd. Den analyserar loggar pÄ ungefÀr samma sÀtt som en kompilator analyserar kÀllor. Detta gör att du kan arbeta mycket snabbt, förbruka lite CPU, och i allmÀnhet Àr det en riktigt cool sak. Det finns en massa andra bonusar. Jag tÀnker inte uppehÄlla mig vid dem.

Yuri Bushmelev "Karta över kratta pÄ fÀltet för att samla in och leverera stockar" - utskrift av rapporten

rsyslog har mÄnga andra nackdelar. De Àr ungefÀr samma som bonusar. De största problemen Àr att du mÄste veta hur man lagar den, och du mÄste vÀlja version.

Yuri Bushmelev "Karta över kratta pÄ fÀltet för att samla in och leverera stockar" - utskrift av rapporten

Vi bestÀmde att vi skulle skriva loggar till ett unix-uttag. Och inte i /dev/log, för dÀr har vi en röra av systemloggar, journald Àr i denna pipeline. SÄ lÄt oss skriva till ett anpassat uttag. Vi kommer att bifoga det till en separat regeluppsÀttning. LÄt oss inte blanda oss i nÄgonting. Allt kommer att vara transparent och begripligt. Det var precis vad vi gjorde. Katalogen med dessa uttag Àr standardiserad och vidarebefordras till alla containrar. BehÄllare kan se uttaget de behöver, öppna och skriva till det.

Varför inte en fil? För alla lÀser det artikel om Badushechka, som försökte vidarebefordra en fil till docker, och det upptÀcktes att efter omstart av rsyslog Àndrades filbeskrivningen och docker förlorade den hÀr filen. Det hÄller nÄgot annat öppet, men inte uttaget dÀr de skriver. Vi bestÀmde oss för att vi skulle lösa det hÀr problemet, och samtidigt skulle vi komma runt blockeringsproblemet.

Yuri Bushmelev "Karta över kratta pÄ fÀltet för att samla in och leverera stockar" - utskrift av rapporten

Rsyslog utför de ÄtgÀrder som anges pÄ bilden och skickar loggar till antingen relÀ eller Kafka. Kafka följer det gamla sÀttet. RelÀ - Jag försökte anvÀnda ren rsyslog för att leverera loggar. Utan Message Queue, med standardverktyg för rsyslog. I grund och botten fungerar det.

Yuri Bushmelev "Karta över kratta pÄ fÀltet för att samla in och leverera stockar" - utskrift av rapporten

Men det finns nyanser med hur man trycker in dem i den hÀr delen (Logstash/Graylog/ES). Den hÀr delen (rsyslog-rsyslog) anvÀnds mellan datacenter. HÀr Àr en komprimerad tcp-lÀnk, som gör att vi kan spara bandbredd och följaktligen pÄ nÄgot sÀtt öka sannolikheten för att vi kommer att fÄ nÄgra loggar frÄn ett annat datacenter nÀr kanalen Àr igensatt. För vi har Indonesien, dÀr allt Àr dÄligt. Det Àr hÀr det stÀndiga problemet ligger.

Yuri Bushmelev "Karta över kratta pÄ fÀltet för att samla in och leverera stockar" - utskrift av rapporten

Vi funderade pÄ hur vi faktiskt kan övervaka hur troligt det Àr att loggarna vi spelade in frÄn applikationen nÄr slutet? Vi bestÀmde oss för att skapa mÀtvÀrden. rsyslog har en egen statistikinsamlingsmodul, som innehÄller nÄgon form av rÀknare. Den kan till exempel visa dig storleken pÄ kön, eller hur mÄnga meddelanden som har kommit i en sÄdan och en sÄdan ÄtgÀrd. Du kan redan ta nÄgot frÄn dem. Dessutom har den anpassade rÀknare som kan konfigureras, och den visar dig till exempel antalet meddelanden som vissa API registrerade. DÀrefter skrev jag rsyslog_exporter i Python, och vi skickade allt till Prometheus och byggde grafer. Vi ville verkligen ha Graylog-statistik, men vi har inte hunnit stÀlla in dem Àn.

Yuri Bushmelev "Karta över kratta pÄ fÀltet för att samla in och leverera stockar" - utskrift av rapporten

Vilka var problemen? Problem uppstod nĂ€r vi upptĂ€ckte (PLÖTSLIGT!) att vĂ„ra Live API:er skrev 50 12 meddelanden per sekund. Detta Ă€r bara ett Live API utan iscensĂ€ttning. Och Graylog visar oss bara XNUMX tusen meddelanden per sekund. Och en rimlig frĂ„ga uppstod: var finns kvarlevorna? Av vilken vi drog slutsatsen att Graylog helt enkelt inte kan klara sig. Vi tittade, och faktiskt, Graylog och Elasticsearch kunde inte hantera detta flöde.

DÀrefter andra upptÀckter vi gjorde pÄ vÀgen.

Skriver till uttaget Àr blockerade. Hur hÀnde det? NÀr jag anvÀnde rsyslog för leverans gick kanalen mellan datacentren sönder vid nÄgot tillfÀlle. Leverans stoppades pÄ ett stÀlle, leverans stoppades pÄ ett annat stÀlle. Allt detta har nÄtt maskinen med API:er som skriver till rsyslog-socketen. DÀr var det kö. Sedan fylldes kön för att skriva till unix-socket, som som standard Àr 128 paket. Och nÀsta write() i applikationen Àr blockerad. NÀr vi tittade pÄ biblioteket som vi anvÀnder i Go-applikationer skrevs det dÀr att skrivning till socket sker i icke-blockerande lÀge. Vi var sÀkra pÄ att ingenting var blockerat. För vi lÀser artikel om Badushechkasom skrev om det. Men det finns ett ögonblick. Det fanns ocksÄ en oÀndlig loop runt detta samtal, dÀr det var ett stÀndigt försök att trycka in ett meddelande i uttaget. Vi mÀrkte honom inte. Jag var tvungen att skriva om biblioteket. Sedan dess har det Àndrats flera gÄnger, men nu har vi blivit av med blockering i alla delsystem. DÀrför kan du stoppa rsyslog, och ingenting kommer att krascha.

Det Àr nödvÀndigt att övervaka storleken pÄ köerna, vilket hjÀlper till att undvika att trampa pÄ denna rake. Först kan vi övervaka nÀr vi börjar tappa meddelanden. För det andra kan vi övervaka att vi har problem med leveransen.

Och ett annat obehagligt ögonblick - förstÀrkning med 10 gÄnger i en mikrotjÀnstarkitektur Àr mycket lÀtt. Vi har inte mÄnga inkommande förfrÄgningar, men pÄ grund av grafen lÀngs vilken dessa meddelanden fÀrdas lÀngre, pÄ grund av Ätkomstloggarna, ökar vi faktiskt loggbelastningen med cirka tio gÄnger. TyvÀrr hade jag inte tid att berÀkna de exakta siffrorna, men mikrotjÀnster Àr vad de Àr. Detta mÄste hÄllas i Ätanke. Det visar sig att för tillfÀllet Àr delsystemet för insamling av stockar det mest laddade i Lazada.

Yuri Bushmelev "Karta över kratta pÄ fÀltet för att samla in och leverera stockar" - utskrift av rapporten

Hur löser man ett elastiskt sökproblem? Om du snabbt behöver fÄ tag i loggar pÄ ett stÀlle, för att inte springa runt till alla maskiner och samla dem dÀr, anvÀnd fillagring. Detta kommer garanterat att fungera. Det kan göras frÄn vilken server som helst. Du behöver bara fÀsta diskar dÀr och installera syslog. Efter detta har du garanterat alla stockar pÄ ett stÀlle. Sedan kan du lÄngsamt konfigurera elasticsearch, graylog och nÄgot annat. Men du kommer redan att ha alla loggar, och dessutom kan du lagra dem sÄ lÄngt det finns tillrÀckligt med diskarrayer.

Yuri Bushmelev "Karta över kratta pÄ fÀltet för att samla in och leverera stockar" - utskrift av rapporten

Vid tidpunkten för min rapport började upplÀgget se ut sÄ hÀr. Vi slutade praktiskt taget skriva till filen. Nu kommer vi troligen att stÀnga av resten. PÄ lokala maskiner som kör API:et kommer vi att sluta skriva till filer. För det första finns det fillagring, vilket fungerar mycket bra. För det andra, dessa maskiner fÄr stÀndigt ont om utrymme, det mÄste övervakas stÀndigt.

Den hÀr delen med Logstash och Graylog, det tar verkligen fart. DÀrför mÄste vi bli av med det. Du mÄste vÀlja en sak.

Yuri Bushmelev "Karta över kratta pÄ fÀltet för att samla in och leverera stockar" - utskrift av rapporten

Vi bestÀmde oss för att kasta ut Logstash och Kibana. För vi har en sÀkerhetsavdelning. Vilken koppling? Kopplingen Àr att Kibana utan X-Pack och utan Shield inte tillÄter dig att skilja ÄtkomstrÀttigheter till loggar. Det var dÀrför vi tog Graylog. Den har allt. Jag gillar det inte, men det fungerar. Vi köpte ny hÄrdvara, installerade fÀrsk Graylog dÀr och överförde alla loggar med strikta format till en separat Graylog. Vi löste problemet med olika typer av identiska fÀlt organisatoriskt.

Yuri Bushmelev "Karta över kratta pÄ fÀltet för att samla in och leverera stockar" - utskrift av rapporten

Vad exakt ingÄr i den nya Graylog. Vi skrev precis allt i docker. Vi tog ett gÀng servrar, rullade ut tre Kafka-instanser, 7 Graylog-servrar version 2.3 (eftersom vi ville ha Elasticsearch version 5). Allt detta plockades upp under razzior frÄn hÄrddisken. Vi sÄg en indexeringshastighet pÄ upp till 100 tusen meddelanden per sekund. Vi sÄg siffran att 140 terabyte data per vecka.

Yuri Bushmelev "Karta över kratta pÄ fÀltet för att samla in och leverera stockar" - utskrift av rapporten

Och Äterigen krattan! Vi har tvÄ försÀljningar pÄ gÄng. Vi gick över 6 miljoner meddelanden. Graylog har inte tid att tugga. PÄ nÄgot sÀtt mÄste vi överleva igen.

Yuri Bushmelev "Karta över kratta pÄ fÀltet för att samla in och leverera stockar" - utskrift av rapporten

SÄ hÀr överlevde vi. Vi har lagt till nÄgra fler servrar och SSD:er. Just nu lever vi pÄ det hÀr sÀttet. Nu tuggar vi redan 160 XNUMX meddelanden per sekund. Vi har inte nÄtt grÀnsen Àn, sÄ det Àr oklart hur mycket vi faktiskt kan fÄ ut av det hÀr.

Yuri Bushmelev "Karta över kratta pÄ fÀltet för att samla in och leverera stockar" - utskrift av rapporten

Det hÀr Àr vÄra planer för framtiden. Av dessa Àr nog den viktigaste hög tillgÀnglighet. Vi har det inte Àn. Flera bilar Àr konfigurerade pÄ samma sÀtt, men Àn sÄ lÀnge gÄr allt genom en bil. Det tar tid att stÀlla in failover mellan dem.

Samla mÀtvÀrden frÄn Graylog.

Gör en hastighetsgrÀns sÄ att vi har ett galet API som inte dödar vÄr bandbredd och allt annat.

Och slutligen, teckna nÄgon form av SLA med utvecklarna sÄ att vi kan tjÀna sÄ mycket. Om du skriver mer sÄ Àr jag ledsen.

Och skriva dokumentation.

Yuri Bushmelev "Karta över kratta pÄ fÀltet för att samla in och leverera stockar" - utskrift av rapporten

Kortfattat, resultatet av allt vi upplevt. Först, standarder. För det andra Àr syslog tÄrta. För det tredje fungerar rsyslog precis som det Àr skrivet pÄ bilden. Och lÄt oss gÄ vidare till frÄgorna.

frÄgor.

FrÄga: Varför valde du att inte ta... (filebeat?)

Svar: Vi mÄste skriva till en fil. Jag ville verkligen inte. NÀr ditt API skriver tusentals meddelanden per sekund, Àven om du roterar det en gÄng i timmen, Àr detta fortfarande inte ett alternativ. Du kan skriva i pipe. Till vilket utvecklarna frÄgade mig: "Vad kommer att hÀnda om processen vi skriver till kraschar?" Jag hittade bara inte vad jag skulle svara dem och sa: "Okej, lÄt oss inte göra det."

FrÄga: Varför skriver du inte bara loggar till HDFS?

Svar: Detta Àr nÀsta steg. Vi funderade pÄ det i början, men eftersom det i nulÀget inte finns nÄgra resurser för att göra detta sÄ hÀnger det i vÄr lÄngsiktiga lösning.

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

Svar: Jag förstÄr. Vi Àr för det med bÄda hÀnderna.

FrÄga: Du skriver till rsyslog. DÀr kan du anvÀnda bÄde TCP och UDP. Men om UDP, hur garanterar du leverans?

Svar: Det finns tvÄ punkter. Först sÀger jag till alla direkt att vi inte garanterar leverans av stockar. För nÀr utvecklare kommer och sÀger: "LÄt oss börja skriva ekonomisk data dÀr, och du kommer att lÀgga den nÄgonstans Ät oss ifall nÄgot hÀnder," svarar vi dem, "Bra! LÄt oss börja blockera att skriva till uttaget och göra detta i transaktioner, sÄ att du garanterat kan lÀgga det pÄ uttaget Ät oss och se till att vi tar emot det frÄn andra sidan." Och i det hÀr ögonblicket behöver alla det omedelbart inte lÀngre. Om det inte Àr nödvÀndigt, vilka frÄgor ska vi dÄ stÀlla? Om du inte vill garantera att du skriver till ett uttag, varför mÄste vi dÄ garantera leverans? Vi gör vÄrt bÀsta. Vi försöker verkligen leverera sÄ mycket som möjligt och pÄ bÀsta möjliga sÀtt, men vi ger ingen 100% garanti. DÀrför finns det inget behov av att skriva ekonomisk data dÀr. Det finns databaser med transaktioner för detta.

FrÄga: NÀr API:et genererar nÄgot meddelande i loggen och överför kontrollen till mikrotjÀnster, har du stött pÄ problemet att meddelanden frÄn olika mikrotjÀnster kommer i fel ordning? Detta orsakar förvirring.

Svar: Det Ă€r normalt att de kommer i olika ordningsföljder. Du mĂ„ste vara beredd pĂ„ detta. Eftersom nĂ„gon nĂ€tverksleverans inte garanterar ordning, eller sĂ„ mĂ„ste du spendera speciella resurser pĂ„ detta. Om vi ​​tar fillagringar sparar varje API loggar till sin egen fil. Eller rĂ€ttare sagt, dĂ€r sorterar rsyslog dem i kataloger. Varje API har sina egna loggar, dĂ€r du kan gĂ„ och titta, och sedan kan du jĂ€mföra dem med hjĂ€lp av tidsstĂ€mpeln i den hĂ€r loggen. Om de gĂ„r och letar i Graylog, sĂ„ sorteras de dĂ€r efter tidsstĂ€mpel. Allt kommer att bli bra dĂ€r.

FrÄga: TidsstÀmpeln kan variera med millisekunder.

Svar: TidsstÀmpel genereras av sjÀlva API:et. Detta Àr faktiskt hela poÀngen. Vi har NTP. API:et genererar en tidsstÀmpel i sjÀlva meddelandet. rsyslog lÀgger inte till det.

FrÄga: Interaktionen mellan datacenter Àr inte sÀrskilt tydlig. Inom datacentret Àr det tydligt hur loggarna samlades in och bearbetades. Hur sker interaktionen mellan datacenter? Eller lever varje datacenter sitt eget liv?

Svar: NÀstan. I vÄrt land finns varje land i ett datacenter. För tillfÀllet har vi ingen spridning sÄ att ett land ligger i olika datacenter. DÀrför finns det inget behov av att kombinera dem. Varje center har ett logrelÀ inuti. Detta Àr en Rsyslog-server. Egentligen tvÄ hanteringsmaskiner. De har samma instÀllning. Men för tillfÀllet gÄr trafiken bara genom en av dem. Den samlar alla loggar. Hon har en diskkö för sÀkerhets skull. Den laddar ner loggarna och skickar dem till det centrala datacentret (Singapore), dÀr de sedan skickas till Graylog. Och varje datacenter har sin egen fillagring. Om vÄr anslutning försvinner har vi alla loggar dÀr. De kommer att vara kvar dÀr. De kommer att förvaras dÀr.

FrÄga: Vid onormala situationer, fÄr du loggar dÀrifrÄn?

Svar: Du kan gÄ dit (till fillagringen) och titta.

FrÄga: Hur övervakar du att du inte tappar loggar?

Svar: Vi tappar faktiskt dem, och vi övervakar det. Övervakning lanserades för en mĂ„nad sedan. Biblioteket som Go API:er anvĂ€nder har mĂ€tvĂ€rden. Hon kan rĂ€kna hur mĂ„nga gĂ„nger hon inte kunde skriva till ett uttag. Det finns för nĂ€rvarande en smart heuristik dĂ€r. Det finns en buffert dĂ€r. Den försöker skriva ett meddelande frĂ„n den till uttaget. Om bufferten svĂ€mmar över börjar den tappa dem. Och han rĂ€knar hur mĂ„nga av dem han tappade. Om mĂ€tarna börjar svĂ€mma över dĂ€r sĂ„ fĂ„r vi veta det. De kommer nu ocksĂ„ till prometheus, och du kan se graferna i Grafana. Du kan stĂ€lla in varningar. Men det Ă€r Ă€nnu inte klart till vem man ska skicka dem.

FrÄga: I elasticsearch lagrar du stockar med redundans. Hur mÄnga kopior har du?

Svar: En linje.

FrĂ„ga: Är detta bara en rad?

Svar: Det hÀr Àr mÀstaren och repliken. Uppgifterna lagras i tvÄ exemplar.

FrÄga: Justerade du rsyslog-buffertstorleken pÄ nÄgot sÀtt?

Svar: Vi skriver datagram till en anpassad unix-socket. Detta sÀtter omedelbart en grÀns pÄ 128 kilobyte för oss. Vi kan inte skriva mer till den. Vi har skrivit in detta i standarden. De som vill komma in i lager skriver 128 kilobyte. Bibliotek skÀrs dessutom av, och en flagga placeras om att meddelandet skÀrs bort. VÄr standard för sjÀlva meddelandet har ett specialfÀlt som visar om det klipptes av under inspelningen eller inte. SÄ vi har möjlighet att spÄra detta ögonblick ocksÄ.

FrÄga: Skriver du trasig JSON?

Svar: Trasig JSON kommer att kasseras antingen under relÀ eftersom paketet Àr för stort. Eller sÄ kommer Graylog att kasseras eftersom den inte kan analysera JSON. Men det finns nyanser som mÄste fixas, och de Àr mestadels knutna till rsyslog. Jag har redan fyllt i flera frÄgor dÀr, som fortfarande mÄste bearbetas.

FrÄga: Varför Kafka? Har du testat RabbitMQ? Misslyckas Graylog under sÄdana belastningar?

Svar: Det fungerar inte för oss med Graylog. Och Graylog tar form för oss. Han Àr verkligen problematisk. Han Àr en mÀrklig sak. Och det behövs faktiskt inte. Jag skulle föredra att skriva frÄn rsyslog direkt till elasticsearch och sedan titta pÄ Kibana. Men vi mÄste lösa problemet med sÀkerhetsvakterna. Detta Àr ett möjligt alternativ för vÄr utveckling, nÀr vi kastar ut Graylog och anvÀnder Kibana. Det Àr ingen idé att anvÀnda Logstash. För jag kan göra samma sak med rsyslog. Och den har en modul för att skriva till elasticsearch. Vi försöker pÄ nÄgot sÀtt leva med Graylog. Vi justerade till och med lite. Men det finns fortfarande utrymme för förbÀttringar.

Om Kafka. SÄ hÀr gick det till historiskt. NÀr jag kom fram var den redan dÀr och loggar skrevs redan till den. Vi höjde helt enkelt vÄrt kluster och flyttade in stockar i det. Vi Àr hans ledning, vi vet hur han kÀnner. NÀr det gÀller RabbitMQ... det fungerar inte för oss med RabbitMQ. Och RabbitMQ tar form för oss. Vi har den i produktion, och det var problem med den. Nu, innan försÀljningen, skulle de charma honom, och han skulle börja arbeta normalt. Men innan dess var jag inte redo att slÀppa den i produktion. Det finns ytterligare en poÀng. Graylog kan lÀsa version AMQP 0.9 och rsyslog kan skriva version AMQP 1.0. Och det finns inte en enda lösning i mitten som kan göra bÄde och. Det Àr antingen det ena eller det andra. DÀrför för tillfÀllet bara Kafka. Men det har ocksÄ sina egna nyanser. Eftersom omkafka av versionen av rsyslog som vi anvÀnder kan förlora hela meddelandebufferten som den rakade ut frÄn rsyslog. För nu stÄr vi ut med det.

FrÄga: AnvÀnder du Kafka för att du redan hade det? AnvÀnds inte lÀngre för nÄgot syfte?

Svar: Kafka, som var, anvÀnds av Data Science-teamet. Detta Àr ett helt separat projekt, som jag tyvÀrr inte kan sÀga nÄgot om. Jag vet inte. Det drevs av Data Science-teamet. NÀr loggarna skapades bestÀmde vi oss för att anvÀnda dem för att inte installera vÄra egna. Nu har vi uppdaterat Graylog, och vi har tappat kompatibiliteten eftersom den har en gammal version av Kafka. Vi var tvungna att starta eget. Samtidigt blev vi av med dessa fyra Àmnen för varje API. Vi skapade ett brett Àmne för alla live, ett brett Àmne för alla iscensÀttningar och satte bara allt dÀr. Graylog skrapar ut allt detta parallellt.

FrÄga: Varför behöver vi denna shamanism med uttag? Har du testat att anvÀnda syslog-loggdrivrutinen för behÄllare?

Svar: NÀr vi stÀllde den hÀr frÄgan var vÄrt förhÄllande till hamnarbetaren spÀnd. Det var docker 1.0 eller 0.9. Docker sjÀlv var konstigt. För det andra, om du ocksÄ trycker in loggar i den... Jag har en obekrÀftad misstanke om att den skickar alla loggar genom sig sjÀlv, genom docker-demonen. Om ett API blir galet, sÄ har resten av API:erna fastnat i det faktum att de inte kan skicka stdout och stderr. Jag vet inte vart detta kommer att leda. Jag har en misstanke pÄ nivÄn att jag kÀnner att det inte finns nÄgot behov av att anvÀnda Docker syslog-drivrutinen pÄ det hÀr stÀllet. VÄr funktionstestavdelning har ett eget Graylog-kluster med loggar. De anvÀnder Docker log-drivrutiner och allt verkar vara bra dÀr. Men de skriver genast GELF till Graylog. NÀr vi började med allt detta behövde vi bara att det skulle fungera. Kanske senare, nÀr nÄgon kommer och sÀger att det har fungerat bra i hundra Är, sÄ ska vi försöka.

FrÄga: Du gör leverans mellan datacenter med rsyslog. Varför inte Kafka?

Svar: Vi gör bĂ„da faktiskt. Av tvĂ„ anledningar. Om kanalen Ă€r helt död, kommer inte alla vĂ„ra loggar, Ă€ven i komprimerad form, att krypa igenom den. Och Kafka lĂ„ter dig helt enkelt tappa dem i processen. Det Ă€r sĂ„ vi blir av med att dessa stockar fastnar. Vi anvĂ€nder bara Kafka direkt i det hĂ€r fallet. Om vi ​​har en bra kanal och vill frigöra den sĂ„ anvĂ€nder vi deras rsyslog. Men i sjĂ€lva verket kan du konfigurera den sĂ„ att den sjĂ€lv tappar det som inte passade igenom. För nĂ€rvarande anvĂ€nder vi bara rsyslog-leverans direkt nĂ„gonstans, och Kafka nĂ„gonstans.

KĂ€lla: will.com

LĂ€gg en kommentar