Elasticsearch-kluster 200 TB+

Elasticsearch-kluster 200 TB+

MÄnga mÀnniskor kÀmpar med Elasticsearch. Men vad hÀnder nÀr du vill anvÀnda den för att lagra loggar "i en sÀrskilt stor volym"? Och Àr det ocksÄ smÀrtfritt att uppleva fel pÄ nÄgot av flera datacenter? Vilken typ av arkitektur ska du göra, och vilka fallgropar kommer du att stöta pÄ?

Vi pÄ Odnoklassniki bestÀmde oss för att anvÀnda elasticsearch för att lösa problemet med stockhantering, och nu delar vi vÄr erfarenhet med Habr: bÄde om arkitektur och om fallgropar.

Jag Àr Pyotr Zaitsev, jag arbetar som systemadministratör pÄ Odnoklassniki. Innan dess var jag Àven admin, arbetade med Manticore Search, Sphinx search, Elasticsearch. Kanske, om en annan ...sökning dyker upp, kommer jag förmodligen att arbeta med den ocksÄ. Jag deltar Àven i ett antal open source-projekt pÄ frivillig basis.

NÀr jag kom till Odnoklassniki sa jag hÀnsynslöst vid intervjun att jag kunde arbeta med Elasticsearch. Efter att jag fÄtt klÀm pÄ det och gjort nÄgra enkla uppgifter fick jag den stora uppgiften att reformera det logghanteringssystem som fanns pÄ den tiden.

Krav

Systemkraven formulerades enligt följande:

  • Graylog skulle anvĂ€ndas som frontend. Eftersom företaget redan hade erfarenhet av att anvĂ€nda den hĂ€r produkten visste programmerare och testare det, det var bekant och bekvĂ€mt för dem.
  • Datavolym: i genomsnitt 50-80 tusen meddelanden per sekund, men om nĂ„got gĂ„r sönder, begrĂ€nsas inte trafiken av nĂ„gonting, det kan vara 2-3 miljoner rader per sekund
  • Efter att ha diskuterat med kunderna kraven pĂ„ hastigheten för att bearbeta sökfrĂ„gor, insĂ„g vi att det typiska mönstret för att anvĂ€nda ett sĂ„dant system Ă€r detta: mĂ€nniskor letar efter loggar för sin ansökan under de senaste tvĂ„ dagarna och vill inte vĂ€nta mer Ă€n en andra för resultatet av en formulerad frĂ„ga.
  • Administratörerna insisterade pĂ„ att systemet skulle vara lĂ€tt skalbart om det skulle behövas, utan att krĂ€va att de fördjupade sig i hur det fungerar.
  • SĂ„ att den enda underhĂ„llsuppgiften som dessa system krĂ€ver regelbundet Ă€r att byta hĂ„rdvara.
  • Dessutom har Odnoklassniki en utmĂ€rkt teknisk tradition: alla tjĂ€nster som vi lanserar mĂ„ste överleva ett datacenterfel (plötsligt, oplanerat och absolut nĂ€r som helst).

Det sista kravet i genomförandet av detta projekt kostade oss mest, vilket jag kommer att prata om mer i detalj.

onsdag

Vi arbetar i fyra datacenter, medan Elasticsearch-datanoder endast kan placeras i tre (av ett antal icke-tekniska skÀl).

Dessa fyra datacenter innehÄller cirka 18 tusen olika loggkÀllor - hÄrdvara, behÄllare, virtuella maskiner.

Viktig funktion: klustret startar i behÄllare poddman inte pÄ fysiska maskiner, utan pÄ egen molnprodukt one-cloud. BehÄllare Àr garanterade 2 kÀrnor, liknande 2.0Ghz v4, med möjlighet att Ätervinna de ÄterstÄende kÀrnorna om de Àr inaktiva.

Med andra ord:

Elasticsearch-kluster 200 TB+

Topologi

Jag sÄg först den allmÀnna formen av lösningen som följer:

  • 3-4 VIP:s ligger bakom A-posten för Graylog-domĂ€nen, detta Ă€r adressen som loggarna skickas till.
  • varje VIP Ă€r en LVS-balanserare.
  • Efter det gĂ„r loggarna till Graylog-batteriet, en del av datan Ă€r i GELF-format, en del i syslog-format.
  • Sedan skrivs allt detta i stora omgĂ„ngar till ett batteri av Elasticsearch-koordinatorer.
  • Och de skickar i sin tur skriv- och lĂ€sbegĂ€randen till de relevanta datanoderna.

Elasticsearch-kluster 200 TB+

terminologi

Kanske inte alla förstÄr terminologin i detalj, sÄ jag skulle vilja uppehÄlla mig lite vid den.

Elasticsearch har flera typer av noder - master, koordinator, datanod. Det finns tvÄ andra typer för olika loggtransformationer och kommunikation mellan olika kluster, men vi anvÀnde bara de listade.

MĂ€stare
Den pingar alla noder som finns i klustret, upprÀtthÄller en uppdaterad klusterkarta och distribuerar den mellan noder, bearbetar hÀndelselogik och utför olika typer av klusteromfattande hushÄllning.

Samordnare
Utför en enda uppgift: accepterar lÀs- eller skrivförfrÄgningar frÄn klienter och dirigerar denna trafik. Om det finns en skrivbegÀran kommer den troligtvis att frÄga master vilken bit av det relevanta indexet den ska lÀgga in den i, och kommer att omdirigera begÀran vidare.

Datanod
Lagrar data, utför sökfrÄgor som kommer utifrÄn och utför operationer pÄ skÀrvor som finns pÄ den.

grÄlogg
Det hÀr Àr ungefÀr en fusion av Kibana med Logstash i en ELK-stack. Graylog kombinerar bÄde ett anvÀndargrÀnssnitt och en loggbearbetningspipeline. Under huven driver Graylog Kafka och Zookeeper, som ger anslutning till Graylog som ett kluster. Graylog kan cacheloggar (Kafka) om Elasticsearch inte Àr tillgÀngligt och upprepa misslyckade lÀs- och skrivförfrÄgningar, gruppera och markera loggar enligt specificerade regler. Precis som Logstash har Graylog funktionalitet för att modifiera rader innan du skriver dem till Elasticsearch.

Dessutom har Graylog en inbyggd tjÀnsteupptÀckt som gör det möjligt att, baserat pÄ en tillgÀnglig Elasticsearch-nod, hÀmta hela klusterkartan och filtrera den efter en specifik tagg, vilket gör det möjligt att rikta förfrÄgningar till specifika behÄllare.

Visuellt ser det ut ungefÀr sÄ hÀr:

Elasticsearch-kluster 200 TB+

Detta Àr en skÀrmdump frÄn en specifik instans. HÀr bygger vi ett histogram baserat pÄ sökfrÄgan och visar relevanta rader.

Index

För att ÄtergÄ till systemarkitekturen skulle jag vilja uppehÄlla mig mer i detalj vid hur vi byggde upp indexmodellen sÄ att det hela fungerade korrekt.

I diagrammet ovan Àr detta den lÀgsta nivÄn: Elasticsearch-datanoder.

Ett index Àr en stor virtuell enhet som bestÄr av Elasticsearch-skÀrvor. I sig Àr var och en av skÀrvorna inget annat Àn ett Lucene-index. Och varje Lucene-index bestÄr i sin tur av ett eller flera segment.

Elasticsearch-kluster 200 TB+

NÀr vi designade tÀnkte vi att för att uppfylla kravet pÄ lÀshastighet pÄ en stor mÀngd data, behövde vi "sprida" denna data jÀmnt över datanoder.

Detta resulterade i att antalet shards per index (med repliker) bör vara strikt lika med antalet datanoder. För det första, för att sÀkerstÀlla en replikeringsfaktor lika med tvÄ (det vill sÀga, vi kan förlora hÀlften av klustret). Och, för det andra, för att bearbeta lÀs- och skrivförfrÄgningar pÄ minst hÀlften av klustret.

Vi bestÀmde först lagringstiden till 30 dagar.

Fördelningen av skÀrvor kan representeras grafiskt enligt följande:

Elasticsearch-kluster 200 TB+

Hela den mörkgrÄ rektangeln Àr ett index. Den vÀnstra röda fyrkanten i den Àr den primÀra skÀrvan, den första i indexet. Och den blÄ fyrkanten Àr en replikskÀrva. De finns i olika datacenter.

NÀr vi lÀgger till ytterligare en shard gÄr den till det tredje datacentret. Och i slutÀndan fÄr vi den hÀr strukturen, som gör det möjligt att förlora DC utan att förlora datakonsistens:

Elasticsearch-kluster 200 TB+

Rotation av index, d.v.s. skapa ett nytt index och ta bort det Àldsta, gjorde vi det lika med 48 timmar (enligt mönstret för indexanvÀndning: de senaste 48 timmarna söks oftast).

Detta indexrotationsintervall beror pÄ följande skÀl:

NÀr en sökbegÀran anlÀnder till en specifik datanod Àr det, ur prestandasynpunkt, mer lönsamt nÀr en shard efterfrÄgas, om dess storlek Àr jÀmförbar med storleken pÄ nodens höft. Detta gör att du kan hÄlla den "heta" delen av indexet i en hög och snabbt komma Ät det. NÀr det finns mÄnga "heta delar" försÀmras hastigheten pÄ indexsökningen.

NÀr en nod börjar köra en sökfrÄga pÄ en shard, allokerar den ett antal trÄdar lika med antalet hyperthreading-kÀrnor i den fysiska maskinen. Om en sökfrÄga pÄverkar ett stort antal skÀrvor, ökar antalet trÄdar proportionellt. Detta har en negativ inverkan pÄ sökhastigheten och pÄverkar indexeringen av ny data negativt.

För att tillhandahÄlla den nödvÀndiga sökfördröjningen bestÀmde vi oss för att anvÀnda en SSD. För att snabbt kunna bearbeta förfrÄgningar mÄste maskinerna som var vÀrd för dessa behÄllare ha minst 56 kÀrnor. Siffran 56 valdes som ett villkorligt tillrÀckligt vÀrde som bestÀmmer antalet trÄdar som Elasticsearch kommer att generera under drift. I Elasitcsearch Àr mÄnga trÄdpoolsparametrar direkt beroende av antalet tillgÀngliga kÀrnor, vilket i sin tur direkt pÄverkar det nödvÀndiga antalet noder i klustret enligt principen "fÀrre kÀrnor - fler noder".

Som ett resultat fann vi att en skÀrva i genomsnitt vÀger cirka 20 gigabyte, och det finns 1 skÀrvor per index. Följaktligen, om vi roterar dem en gÄng var 360:e timme, sÄ har vi 48 av dem. Varje index innehÄller data för 15 dagar.

Dataskrivande och lÀskretsar

LÄt oss ta reda pÄ hur data registreras i det hÀr systemet.

LÄt oss sÀga att nÄgon förfrÄgan kommer frÄn Graylog till koordinatorn. Till exempel vill vi indexera 2-3 tusen rader.

Samordnaren, efter att ha fÄtt en förfrÄgan frÄn Graylog, ifrÄgasÀtter befÀlhavaren: "I indexeringsbegÀran angav vi specifikt ett index, men i vilket fragment att skriva det specificerades inte."

Mastern svarar: "Skriv denna information till shard nummer 71," varefter den skickas direkt till den relevanta datanoden, dÀr primÀr shard nummer 71 finns.

DĂ€refter replikeras transaktionsloggen till en replika-shard, som finns i ett annat datacenter.

Elasticsearch-kluster 200 TB+

En sökförfrÄgan kommer frÄn Graylog till koordinatorn. Koordinatorn omdirigerar den enligt indexet, medan Elasticsearch distribuerar förfrÄgningar mellan primÀr-shard och replika-shard med hjÀlp av round-robin-principen.

Elasticsearch-kluster 200 TB+

De 180 noderna svarar ojÀmnt, och medan de svarar samlar koordinatorn pÄ information som redan har "spottats ut" av snabbare datanoder. Efter detta, nÀr antingen all information har kommit, eller begÀran har nÄtt en timeout, ger den allt direkt till klienten.

Hela det hÀr systemet bearbetar i genomsnitt sökfrÄgor under de senaste 48 timmarna i 300-400 ms, exklusive de frÄgor med ett ledande jokertecken.

Blommor med Elasticsearch: Java-installation

Elasticsearch-kluster 200 TB+

För att fÄ det hela att fungera som vi ursprungligen ville, spenderade vi mycket lÄng tid pÄ att felsöka en mÀngd olika saker i klustret.

Den första delen av problemen som upptÀcktes var relaterad till hur Java Àr förkonfigurerat som standard i Elasticsearch.

Problem ett
Vi har observerat ett mycket stort antal rapporter om att pÄ Lucene-nivÄ, nÀr bakgrundsjobb körs, misslyckas Lucene-segmentsammanslagningar med ett fel. Samtidigt stod det tydligt i loggarna att detta var ett OutOfMemoryError-fel. Vi sÄg frÄn telemetri att höften var fri, och det var inte klart varför denna operation misslyckades.

Det visade sig att Lucene index sammanslagningar förekommer utanför höften. Och containrar Àr ganska strikt begrÀnsade nÀr det gÀller förbrukade resurser. Endast heap kunde passa in i dessa resurser (heap.size-vÀrdet var ungefÀr lika med RAM), och vissa off-heap-operationer kraschade med ett minnesallokeringsfel om de av nÄgon anledning inte passade in i ~500MB som Äterstod innan grÀnsen.

Fixningen var ganska trivial: mÀngden RAM tillgÀngligt för behÄllaren ökades, varefter vi glömde att vi till och med hade sÄdana problem.

Problem tvÄ
4-5 dagar efter lanseringen av klustret mÀrkte vi att datanoder periodvis började falla ut ur klustret och komma in i det efter 10-20 sekunder.

NÀr vi började lista ut det visade det sig att detta off-heap-minne i Elasticsearch inte styrs pÄ nÄgot sÀtt. NÀr vi gav mer minne till behÄllaren kunde vi fylla de direkta buffertpoolerna med olika information, och den rensades först efter att den explicita GC:en lanserades frÄn Elasticsearch.

I vissa fall tog denna operation ganska lÄng tid, och under denna tid lyckades klustret markera denna nod som redan avslutad. Detta problem Àr vÀl beskrivet hÀr.

Lösningen var följande: vi begrÀnsade Javas förmÄga att anvÀnda huvuddelen av minnet utanför högen för dessa operationer. Vi begrÀnsade den till 16 gigabyte (-XX:MaxDirectMemorySize=16g), vilket sÀkerstÀllde att explicit GC anropades mycket oftare och bearbetades mycket snabbare, vilket inte lÀngre destabiliserade klustret.

Problem tre
Om du tror att problemen med "noder som lÀmnar klustret i det mest ovÀntade ögonblicket" Àr över, har du fel.

NÀr vi konfigurerade arbetet med index valde vi mmapfs till minska söktiden pÄ fÀrska skÀrvor med stor segmentering. Detta var en hel misstag, för nÀr man anvÀnder mmapfs mappas filen till RAM, och sedan arbetar vi med den mappade filen. PÄ grund av detta visar det sig att nÀr GC försöker stoppa trÄdar i applikationen, gÄr vi till safepointen under mycket lÄng tid, och pÄ vÀgen dit slutar applikationen att svara pÄ mÀstarens förfrÄgningar om huruvida den Àr vid liv . Följaktligen anser master att noden inte lÀngre finns i klustret. Efter detta, efter 5-10 sekunder, fungerar sopsamlaren, noden kommer till liv, gÄr in i klustret igen och börjar initialisera skÀrvor. Det hela kÀndes vÀldigt mycket som "den produktion vi förtjÀnade" och lÀmpade sig inte för nÄgot allvarligt.

För att bli av med detta beteende bytte vi först till standard niofs, och sedan, nÀr vi migrerade frÄn den femte versionen av Elastic till den sjÀtte, provade vi hybridfs, dÀr detta problem inte reproducerades. Du kan lÀsa mer om lagringstyper hÀr.

Problem fyra
Sedan var det ett annat mycket intressant problem som vi behandlade rekordtid. Vi fÄngade den i 2-3 mÄnader eftersom dess mönster var helt obegripligt.

Ibland gick vÄra koordinatorer till Full GC, vanligtvis nÄgon gÄng efter lunch, och kom aldrig tillbaka dÀrifrÄn. Samtidigt, nÀr man loggar GC-fördröjningen, sÄg det ut sÄ hÀr: allt gÄr bra, bra, bra, och sÄ plötsligt gÄr allt vÀldigt dÄligt.

Först trodde vi att vi hade en ond anvÀndare som lanserade nÄgon form av begÀran som slog koordinatorn ur arbetslÀge. Vi loggade förfrÄgningar under mycket lÄng tid för att försöka ta reda pÄ vad som hÀnde.

Som ett resultat visade det sig att i det ögonblick nÀr en anvÀndare lanserar en enorm förfrÄgan och den kommer till en specifik Elasticsearch-koordinator, svarar vissa noder lÀngre Àn andra.

Och medan samordnaren vÀntar pÄ ett svar frÄn alla noder, samlar han pÄ sig resultaten som skickas frÄn de noder som redan har svarat. För GC betyder detta att vÄra heapanvÀndningsmönster förÀndras mycket snabbt. Och GC som vi anvÀnde kunde inte klara av denna uppgift.

Den enda lösningen vi hittade för att Àndra beteendet hos klustret i den hÀr situationen Àr migrering till JDK13 och anvÀndning av Shenandoah-sopsamlaren. Detta löste problemet, vÄra koordinatorer slutade falla.

Det var hÀr problemen med Java slutade och bandbreddsproblemen började.

"BÀr" med Elasticsearch: genomströmning

Elasticsearch-kluster 200 TB+

Problem med genomströmning gör att vÄrt kluster fungerar stabilt, men vid toppar i antalet indexerade dokument och under manövrar Àr prestandan otillrÀcklig.

Det första symtomet som pÄtrÀffades: under vissa "explosioner" i produktionen, nÀr ett mycket stort antal loggar plötsligt genereras, börjar indexeringsfelet es_rejected_execution att blinka ofta i Graylog.

Detta berodde pÄ det faktum att thread_pool.write.queue pÄ en datanod, tills det ögonblick Elasticsearch kan bearbeta indexeringsförfrÄgan och ladda upp informationen till fragmentet pÄ disken, kan cachelagra endast 200 förfrÄgningar som standard. Och i Elasticsearch dokumentation Mycket lite sÀgs om denna parameter. Endast det maximala antalet trÄdar och standardstorleken anges.

Naturligtvis gick vi för att vrida pÄ det hÀr vÀrdet och fick reda pÄ följande: specifikt, i vÄr installation, cachelagras upp till 300 förfrÄgningar ganska bra, och ett högre vÀrde Àr fyllt av det faktum att vi Äterigen flyger till Full GC.

Dessutom, eftersom det hÀr Àr satser av meddelanden som kommer inom en begÀran, var det nödvÀndigt att justera Graylog sÄ att den inte skriver ofta och i smÄ satser, utan i stora satser eller en gÄng var tredje sekund om partiet fortfarande inte Àr komplett. I det hÀr fallet visar det sig att informationen som vi skriver i Elasticsearch blir tillgÀnglig inte pÄ tvÄ sekunder, utan pÄ fem (vilket passar oss ganska bra), men antalet Äterupptagningar som mÄste göras för att driva igenom en stor mÀngden information minskar.

Detta Àr sÀrskilt viktigt i de ögonblick dÄ nÄgot har kraschat nÄgonstans och rasande rapporterar om det, för att inte fÄ en helt spammad Elastic, och efter en tid - Graylog-noder som inte fungerar pÄ grund av igensatta buffertar.

Dessutom, nÀr vi hade samma explosioner i produktionen, fick vi klagomÄl frÄn programmerare och testare: i det ögonblick dÄ de verkligen behövde dessa loggar, fick de dem mycket lÄngsamt.

De började komma pĂ„ det. Å ena sidan var det tydligt att bĂ„de sökfrĂ„gor och indexeringsfrĂ„gor bearbetades, i huvudsak pĂ„ samma fysiska maskiner, och pĂ„ ett eller annat sĂ€tt skulle det finnas vissa neddragningar.

Men detta kan delvis kringgÄs pÄ grund av det faktum att det i den sjÀtte versionen av Elasticsearch dök upp en algoritm som lÄter dig distribuera frÄgor mellan relevanta datanoder som inte följer den slumpmÀssiga round-robin-principen (behÄllaren som gör indexering och hÄller den primÀra -shard kan vara mycket upptagen, det kommer inte att finnas nÄgot sÀtt att svara snabbt), utan att vidarebefordra denna begÀran till en mindre laddad container med en replika-shard, som kommer att svara mycket snabbare. Med andra ord kom vi fram till use_adaptive_replica_selection: true.

LÀsbilden börjar se ut sÄ hÀr:

Elasticsearch-kluster 200 TB+

ÖvergĂ„ngen till denna algoritm gjorde det möjligt att avsevĂ€rt förbĂ€ttra frĂ„getiden i de ögonblick dĂ„ vi hade ett stort flöde av loggar att skriva.

Slutligen var huvudproblemet det smÀrtfria avlÀgsnandet av datacentret.

Vad vi ville ha frÄn klustret omedelbart efter att vi förlorat anslutningen till en DC:

  • Om vi ​​har en aktuell master i det misslyckade datacentret, kommer den att vĂ€ljas om och flyttas som en roll till en annan nod i en annan DC.
  • Mastern tar snabbt bort alla otillgĂ€ngliga noder frĂ„n klustret.
  • Baserat pĂ„ de Ă„terstĂ„ende kommer han att förstĂ„: i det förlorade datacentret hade vi sĂ„dana och sĂ„dana primĂ€ra skĂ€rvor, han kommer snabbt att marknadsföra kompletterande replikskĂ€rvor i de Ă„terstĂ„ende datacentren, och vi kommer att fortsĂ€tta indexera data.
  • Som ett resultat av detta kommer klustrets skriv- och lĂ€skapacitet gradvis att försĂ€mras, men i allmĂ€nhet kommer allt att fungera, om Ă€n lĂ„ngsamt, men stabilt.

Som det visade sig ville vi ha nÄgot sÄnt hÀr:

Elasticsearch-kluster 200 TB+

Och vi fick följande:

Elasticsearch-kluster 200 TB+

Hur hÀnde det?

NÀr datacentret föll blev vÄr mÀstare flaskhalsen.

Varför?

Faktum Àr att mastern har en TaskBatcher, som ansvarar för att distribuera vissa uppgifter och hÀndelser i klustret. Alla nodutgÄngar, all marknadsföring av en shard frÄn replik till primÀr, vilken uppgift som helst att skapa en shard nÄgonstans - allt detta gÄr först till TaskBatcher, dÀr det bearbetas sekventiellt och i en trÄd.

Vid tidpunkten för tillbakadragandet av ett datacenter visade det sig att alla datanoder i de överlevande datacenterna ansÄg det vara sin plikt att informera befÀlhavaren "vi har tappat sÄdana och sÄdana skÀrvor och sÄdana och sÄdana datanoder."

Samtidigt skickade de överlevande datanoderna all denna information till den nuvarande mastern och försökte vÀnta pÄ bekrÀftelse pÄ att han accepterade den. De vÀntade inte pÄ detta, eftersom befÀlhavaren fick uppgifter snabbare Àn han kunde svara pÄ. Noderna tog timeout för upprepade förfrÄgningar, och befÀlhavaren försökte vid denna tidpunkt inte ens svara pÄ dem, utan var helt upptagen i uppgiften att sortera förfrÄgningar efter prioritet.

I terminalform visade det sig att datanoderna spammade mastern till den grad att den gick in i full GC. Efter det flyttade vÄr mÀstarroll till nÄgon nÀsta nod, absolut samma sak hÀnde med den, och som ett resultat kollapsade klustret helt.

Vi gjorde mÀtningar, och innan version 6.4.0, dÀr detta fixades, rÀckte det för oss att samtidigt bara mata ut 10 datanoder av 360 för att helt stÀnga av klustret.

Det sÄg ut ungefÀr sÄ hÀr:

Elasticsearch-kluster 200 TB+

Efter version 6.4.0, dÀr denna fruktansvÀrda bugg fixades, slutade datanoder att döda mastern. Men det gjorde honom inte "smartare". NÀmligen: nÀr vi matar ut 2, 3 eller 10 (vilket som helst annat Àn en) datanoder, fÄr mastern ett första meddelande som sÀger att nod A har lÀmnat, och försöker berÀtta för nod B, nod C om detta, nod D.

Och för tillfÀllet kan detta bara hanteras genom att sÀtta en timeout för försök att berÀtta för nÄgon om nÄgot, lika med cirka 20-30 sekunder, och dÀrmed styra hastigheten pÄ datacentret som flyttar ut ur klustret.

I princip passar detta in i de krav som frÄn början presenterades pÄ slutprodukten som en del av projektet, men ur "ren vetenskap" synvinkel Àr detta en bugg. Vilket för övrigt framgÄngsrikt fixades av utvecklarna i version 7.2.

Dessutom, nÀr en viss datanod gick ut, visade det sig att spridning av information om dess utgÄng var viktigare Àn att berÀtta för hela klustret att det fanns sÄdana och sÄdana primÀra skÀrvor pÄ den (för att frÀmja en replika-shard i en annan data centrum i den primÀra, och i information kan skrivas pÄ dem).

DÀrför, nÀr allt redan har dött ut, markeras inte de slÀppta datanoderna omedelbart som inaktuella. Följaktligen tvingas vi vÀnta tills alla pingar har gÄtt ut till de slÀppta datanoderna, och först efter det börjar vÄrt kluster berÀtta att dÀr, dÀr och dÀr mÄste vi fortsÀtta att registrera information. Du kan lÀsa mer om detta hÀr.

Som ett resultat av detta tar operationen att dra in ett datacenter idag cirka 5 minuter under rusningstid. För en sÄ stor och klumpig koloss Àr detta ett ganska bra resultat.

Som ett resultat kom vi till följande beslut:

  • Vi har 360 datanoder med 700 gigabyte diskar.
  • 60 koordinatorer för att dirigera trafik genom samma datanoder.
  • 40 masters som vi har lĂ€mnat som ett slags arv sedan versioner före 6.4.0 - för att överleva indragningen av datacentret var vi mentalt beredda att förlora flera maskiner för att garanteras ha ett kvorum av masters Ă€ven i det vĂ€rsta scenariot
  • Alla försök att kombinera roller pĂ„ en container möttes av det faktum att noden förr eller senare skulle gĂ„ sönder under belastning.
  • Hela klustret anvĂ€nder en heap.size pĂ„ 31 gigabyte: alla försök att minska storleken resulterade i att antingen döda nĂ„gra noder pĂ„ tunga sökfrĂ„gor med det ledande jokertecknet eller att fĂ„ strömbrytaren i Elasticsearch sjĂ€lv.
  • Dessutom, för att sĂ€kerstĂ€lla sökprestanda, försökte vi hĂ„lla antalet objekt i klustret sĂ„ litet som möjligt, för att bearbeta sĂ„ fĂ„ hĂ€ndelser som möjligt i flaskhalsen som vi fick i mastern.

Äntligen om övervakning

För att sÀkerstÀlla att allt detta fungerar som avsett övervakar vi följande:

  • Varje datanod rapporterar till vĂ„rt moln att den finns, och att det finns sĂ„dana och sĂ„dana skĂ€rvor pĂ„ den. NĂ€r vi slĂ€cker nĂ„got nĂ„gonstans rapporterar klustret efter 2-3 sekunder att vi i centrum A slĂ€ckte noderna 2, 3 och 4 - det betyder att vi i andra datacenter under inga omstĂ€ndigheter kan slĂ€cka de noder dĂ€r det bara finns en skĂ€rva vĂ€nster.
  • Genom att kĂ€nna till arten av mĂ€starens beteende tittar vi mycket noggrant pĂ„ antalet pĂ„gĂ„ende uppgifter. Eftersom Ă€ven en uppgift som har fastnat, om den inte tar time-out i tid, teoretiskt i nĂ„gon nödsituation kan bli orsaken till att till exempel frĂ€mjandet av en replikskĂ€rva i den primĂ€ra inte fungerar, vilket Ă€r anledningen till att indexeringen slutar fungera.
  • Vi tittar ocksĂ„ mycket noga pĂ„ förseningar av sophĂ€mtare, eftersom vi redan har haft stora svĂ„righeter med detta under optimeringen.
  • Avvisar per trĂ„d för att i förvĂ€g förstĂ„ var flaskhalsen finns.
  • Tja, standardmĂ„tt som heap, RAM och I/O.

NÀr du bygger övervakning mÄste du ta hÀnsyn till funktionerna i Thread Pool i Elasticsearch. Elasticsearch dokumentation beskriver konfigurationsalternativ och standardvÀrden för sökning och indexering, men Àr helt tyst om thread_pool.management. Dessa trÄdar behandlar i synnerhet frÄgor som _cat/shards och andra liknande, som Àr bekvÀma att anvÀnda nÀr man skriver övervakning. Ju större klustret Àr, desto fler sÄdana förfrÄgningar exekveras per tidsenhet, och den tidigare nÀmnda thread_pool.management presenteras inte bara inte i den officiella dokumentationen, utan Àr ocksÄ som standard begrÀnsad till 5 trÄdar, som mycket snabbt kasseras, efter vilken övervakning slutar fungera korrekt.

Vad jag vill sÀga avslutningsvis: vi gjorde det! Vi kunde ge vÄra programmerare och utvecklare ett verktyg som i nÀstan alla situationer snabbt och tillförlitligt kan ge information om vad som hÀnder i produktionen.

Ja, det visade sig vara ganska komplicerat, men vi lyckades ÀndÄ passa in vÄra önskemÄl i befintliga produkter, som vi inte behövde lappa och skriva om för oss sjÀlva.

Elasticsearch-kluster 200 TB+

KĂ€lla: will.com

LĂ€gg en kommentar