Elasticsearch-klynge pÄ 200 TB+

Elasticsearch-klynge pÄ 200 TB+

Mange mÞter Elasticsearch. Men hva skjer nÄr man Þnsker Ä lagre logger "i sÊrdeles store mengder" med hjelp av det? Og samtidig uten Ä oppleve smertefulle avbrudd pÄ grunn av nedetid i en av flere datasentre? Hvilken arkitektur bÞr man velge, og hvilke skjulte fallgruver kan man stÞte pÄ?

Vi i Odnoklassniki bestemte oss for Ä lÞse logg-hÄndteringsproblemet med Elasticsearch, og nÄ deler vi erfaringene vÄre med Habr: bÄde om arkitekturen og om fallgruvene.

Jeg er Pjotr Zaikov, arbeider som systemadministrator i Odnoklassniki. FÞr dette var jeg ogsÄ administrator, og jobbet med Manticore Search, Sphinx search, Elasticsearch. Det kan hende at hvis det dukker opp noe nytt ... search, sÄ vil jeg ogsÄ jobbe med det. I tillegg deltar jeg i flere open source-prosjekter pÄ frivillig basis.

Da jeg begynte i Odnoklassniki, sa jeg ubetenksomt i intervjuet at jeg kunne jobbe med Elasticsearch. Etter Ä ha blitt kjent med det og gjort noen enkle oppgaver, fikk jeg tildelt en stor oppgave med Ä reformere logg-hÄndteringssystemet som eksisterte pÄ det tidspunktet.

Krav

Kravene til systemet ble formulert som fĂžlger:

  • Som frontend skulle Graylog brukes. Fordi selskapet allerede hadde erfaring med dette produktet, var bĂ„de programmerere og testere kjent med det, og de syntes det var komfortabelt Ă„ bruke.
  • Datamengden: i gjennomsnitt 50-80 tusen meldinger per sekund, men hvis noe gĂ„r galt, sĂ„ er trafikken uten begrensning, og det kan vĂŠre 2-3 millioner linjer per sekund.
  • Etter Ă„ ha diskutert med kundene kravene til hastigheten ved behandling av sĂžkespĂžrsmĂ„l, forsto vi at den typiske bruken av et slikt system er slik at folk sĂžker logger fra applikasjonen sin de siste to dagene og ikke Ăžnsker Ă„ vente lenger enn ett sekund pĂ„ resultatet av forespĂžrselen.
  • Administratorene insisterte pĂ„ at systemet lett skulle kunne skaleres ved behov, uten Ă„ kreve at de mĂ„tte sette seg grundig inn i hvordan det var bygget opp.
  • Den eneste oppgaven med vedlikehold som disse systemene trengte fra tid til annen var Ă„ bytte ut noe maskinvare.
  • I tillegg har Odnoklassniki en flott teknisk tradisjon: enhver tjeneste vi lanserer, mĂ„ kunne hĂ„ndtere et datasenter-nedbrudd (uventet, upĂ„lagt og til enhver tid).

Det siste kravet i gjennomfĂžringen av dette prosjektet har kostet oss mest, noe jeg vil fortelle mer om senere.

MiljĂž

Vi jobber med fire datasentre, men Elasticsearch-nodene kan kun plasseres i tre (av en rekke ikke-tekniske grunner).

I disse fire datasentrene finnes det omtrent 18 000 ulike loggkilder — maskinvare, containere, virtuelle maskiner.

En viktig funksjon: klustret startes i containere Podman ikke pÄ fysiske maskiner, men pÄ vÄrt eget skyprodukt one-cloud. Containerne garanteres 2 kjerner, tilsvarende 2.0Ghz v4 med mulighet for utnyttelse av de Þvrige kjernene i tilfelle de er inaktive.

Med andre ord:

Elasticsearch-klynge pÄ 200 TB+

Topologi

Den overordnede lÞsningen sÄ jeg i utgangspunktet slik ut:

  • 3-4 VIP-er stĂ„r bak A-posten til domenet Graylog, det er adressen som loggene sendes til.
  • hver VIP fungerer som en LVS-balancer.
  • Etter det blir loggene sendt til en Graylog-batteri, hvorav en del data gĂ„r i GELF-format, og en del i syslog-format.
  • Deretter skrives alt dette i store batcher til en gruppe med Elasticsearch-koordinatorer.
  • Og de sender forespĂžrslene om skriving og lesing til relevante datanoder.

Elasticsearch-klynge pÄ 200 TB+

Terminologi

Kanskje ikke alle har kjennskap til terminologien, derfor vil jeg gjerne stoppe litt opp ved den.

I Elasticsearch finnes det flere typer noder — master, koordinator, datanode. Det er ogsĂ„ to andre typer for ulike konverteringer av logger og kommunikasjon mellom forskjellige klynger, men vi brukte kun de nevnte.

Master
Pinger alle nodene som er tilstede i klyngen, opprettholder et oppdatert kart over klyngen og sprer det mellom nodene, behandler hendelseslogikk, driver med diverse cluster wide housekeeping.

Koordinator
UtfÞrer en eneste oppgave: tar imot forespÞrselene fra klientene for lesing eller skriving og ruter denne trafikken. NÄr det er en skrivingsforespÞrsel, vil den sannsynligvis spÞrre master hvilken shard i den relevante indeksen den skal legge dette til, og videresende forespÞrselen videre.

Datanode
Lagrer data, utfÞrer sÞkebegjÊringer og operasjoner pÄ sharder som er plassert pÄ den.

Graylog
Dette er noe som ligner en sammensmelting av Kibana med Logstash i ELK-stakken. Graylog kombinerer bÄde UI og loggbehandlingspipeline. Bak kulissene i Graylog fungerer Kafka og Zookeeper, som sikrer tilkoblingen av Graylog som en klynge. Graylog kan cache logger (Kafka) i tilfelle Elasticsearch ikke er tilgjengelig og gjenta mislykkede lese- og skriveforespÞrselene, gruppere og merke loggene etter angitte regler. Som Logstash har Graylog funksjonalitet for Ä modifisere strenger fÞr de skrives til Elasticsearch.

I tillegg har Graylog innebygd service discovery, som lar deg hente hele klyngeoversikten basert pÄ en tilgjengelig Elasticsearch-node, og filtrere den etter et bestemt tag, noe som gir mulighet for Ä sende forespÞrselene til bestemte containere.

Visuelt ser det omtrent slik ut:

Elasticsearch-klynge pÄ 200 TB+

Dette er et skjermbilde fra en spesifikk instans. Her bygger vi et histogram basert pÄ sÞkespÞrsmÄlet og viser relevante linjer.

Indexes

NÄr vi gÄr tilbake til systemarkitekturen, vil jeg gjerne gÄ nÊrmere inn pÄ hvordan vi bygde modellene for indekser for at alt skulle fungere riktig.

I det tidligere diagrammet er dette det laveste nivÄet: Elasticsearch data noder.

En indeks er en stor virtuell enhet bestÄende av Elasticsearch-shards. Hver av shardene i seg selv er intet annet enn en Lucene-indeks. Og hver Lucene-indeks bestÄr igjen av ett eller flere segmenter.

Elasticsearch-klynge pÄ 200 TB+

Ved prosjektplanleggingen antok vi at for Ä tilfredsstille lesehastighetskravene ved store datamengder mÄtte vi jevnt 'fordele' disse dataene over datanodene.

Dette resulterte i at antallet shards per indeks (med replikasjoner) mÄtte vÊre nÞyaktig likt antallet datanoder. For det fÞrste for Ä oppnÄ en replikasjonsfaktor pÄ to (det vil si at vi kan miste halvparten av klyngen). Og for det andre for Ä kunne behandle lese- og skriveforespÞrslene pÄ minst halvparten av klyngen.

Vi bestemte fĂžrst lagringstiden til 30 dager.

Fordelingen av shards kan grafisk presenteres som fĂžlger:

Elasticsearch-klynge pÄ 200 TB+

Den mÞrkegrÄ rektangelen i sin helhet er indeksen. Den venstre rÞde kvadraten i den er primary-sharden, den fÞrste i indeksen. Den blÄ kvadraten er replica-sharden. De befinner seg i forskjellige datasentre.

NÄr vi legger til en ny shard, gÄr den til det tredje datasenteret. Til slutt fÄr vi en struktur som gjÞr det mulig Ä miste et datasenter uten Ä miste datakonsistens.

Elasticsearch-klynge pÄ 200 TB+

Vi har satt rotasjonen av indekser, det vil si Ä opprette en ny indeks og fjerne den eldste, til 48 timer (basert pÄ bruken av indeksen: de siste 48 timene blir sÞkt oftest).

Dette rotasjonsintervallet for indekser er knyttet til fÞlgende Ärsaker:

NĂ„r en spesifikk datanode mottar en sĂžkeforespĂžrsel, er det mer gunstig med ytelse Ă„ spĂžrre en shard, hvis stĂžrrelsen er sammenlignbar med stĂžrrelsen pĂ„ nodens heap. Dette gjĂžr at vi kan holde den ‘hvite’ delen av indeksen i heapen og raskt fĂ„ tilgang til den. NĂ„r det blir flere ‘hvite deler’, reduseres hastigheten pĂ„ sĂžket i indeksen.

NÄr en node begynner Ä utfÞre en sÞkeforespÞrsel pÄ en shard, tilordner den antall trÄder lik antall hypertrÄdede kjerner pÄ den fysiske maskinen. Hvis sÞkeforespÞrselen berÞrer et stort antall shards, Þker antallet trÄder proporsjonalt. Dette pÄvirker sÞkehastigheten negativt og har en dÄrlig effekt pÄ indeksering av nye data.

For Ă„ sikre nĂždvendig sĂžkeforsinkelse, bestemte vi oss for Ă„ bruke SSD. For rask behandling av forespĂžrslene mĂ„tte maskinene som vertet disse containerne ha minst 56 kjerner. Tallet 56 er valgt som en betinget tilstrekkelig stĂžrrelse, som bestemmer antall trĂ„der Elasticsearch vil produsere under drift. I Elasticsearch avhenger mange innstillinger for trĂ„dpool direkte av antallet tilgjengelige kjerner, som igjen direkte pĂ„virker antall noder som kreves i klyngen etter prinsippet "fewer cores — more nodes".

Vi endte opp med at gjennomsnittlig veier en shard omtrent 20 gigabyte, og det er 360 shards per indeks. Dermed, hvis vi roterer dem hver 48. time, har vi 15 av dem. Hver indeks inneholder data for 2 dager.

Skrive- og leseordninger for data

La oss se nÊrmere pÄ hvordan data skrives i dette systemet.

La oss si at vi mottar en forespĂžrsel fra Graylog til koordinatoren. For eksempel, vi Ăžnsker Ă„ indeksere 2-3 tusen linjer.

Koordinatoren, etter Ă„ ha mottatt en forespĂžrsel fra Graylog, spĂžr masteren: «I forespĂžrselen om indeksering var vi spesifikt angitt en indeks, men i hvilken shard dette skulle skrives – var ikke angitt».

Masteren svarer: «Skriv denne informasjonen i shard nummer 71», deretter sendes den direkte til den relevante datanoden, hvor primÊr-shard nummer 71 befinner seg.

Deretter blir transaksjonsloggen replikert til replica-shard, som allerede ligger i et annet datasenter.

Elasticsearch-klynge pÄ 200 TB+

Fra Graylog kommer en sĂžkforespĂžrsel til koordinatoren. Koordinatoren videresender den etter indeksen, mens Elasticsearch, etter prinsippet om round-robin, fordeler forespĂžrslene mellom primĂŠr-shard og replica-shard.

Elasticsearch-klynge pÄ 200 TB+

Nodene, som er 180 i antall, svarer ujevnt, og mens de svarer, samler koordinatoren informasjonen som allerede er «spyttet ut» av raskere datanoder. NÄr enten all informasjon er kommet, eller forespÞrselen har nÄdd tidsgrensen, gir den alt direkte til klienten.

Hele dette systemet behandler i gjennomsnitt sÞkforespÞrslene for de siste 48 timene pÄ 300-400ms, unntatt de forespÞrslene som har ledende wildcard.

«SmÄ detaljer» med Elasticsearch: Java-konfigurasjon

Elasticsearch-klynge pÄ 200 TB+

For at alt dette skulle fungere slik vi opprinnelig Þnsket, brukte vi mye tid pÄ Ä finjustere forskjellige saker i klyngen.

Den fÞrste delen av de oppdagede problemene var relatert til hvordan Java er forhÄndsinnstilt i Elasticsearch som standard.

Problem én
Vi observerte et stort antall meldinger om at pÄ Lucene-nivÄ, nÄr bakgrunnsjobber kjÞres, feiler segmentfusjoner i Lucene med en feil. Det var synlig i loggene at dette var en OutOfMemoryError. Gjennom telemetri sÄ vi at heap-en var ledig, og det var uklart hvorfor denne operasjonen feilet.

Det viste seg at fusjoner av Lucene-indekser skjer utenfor heap-en. Containerne har ganske strenge begrensninger pÄ forbrukte ressurser. Bare heap-en var innenfor disse ressursene (heap.size-verdien var omtrent lik RAM), og noen off-heap-operasjoner feilet med minneallokeringsfeil hvis de av en eller annen grunn ikke ble utfÞrt innenfor de ~500MB som var igjen til grensen.

LÞsningen var ganske triviale: vi Þkte RAM-omfanget tilgjengelig for containeren, hvoretter vi glemte at slike problemer noensinne hadde oppstÄtt.

Det andre problemet
Omtrent 4-5 dager etter oppstart av klyngen la vi merke til at datanodene begynte Ă„ falle ut av klyngen periodisk og kom tilbake etter ca. 10-20 sekunder.

Da vi begynte Ä undersÞke, fant vi ut at denne sÄkalte off-heap minnet i Elasticsearch nesten ikke blir kontrollert i det hele tatt. NÄr vi ga containeren mer minne, fikk vi muligheten til Ä fylle direkte buffer-pooler med ulik informasjon, og det ble ryddet opp fÞrst etter at explicit GC fra Elasticsearch ble kjÞrt.

I noen tilfeller tok dette operasjonen en ganske lang tid, og i lĂžpet av den tiden klarte klustret Ă„ merke denne noden som allerede ute av drift. Dette problemet er godt dokumentert. her.

LÞsningen var som fÞlger: Vi begrenset Java sin mulighet til Ä bruke hoveddelen av minnet utenfor heap til disse operasjonene. Vi satte en grense pÄ 16 gigabyte (-XX:MaxDirectMemorySize=16g), som resulterte i at explicit GC ble kalt betydelig oftere og kjÞrte mye raskere, noe som igjen stabiliserte klustret.

Det tredje problemet.
Hvis du tror at problemene med «noder som forlater klustret pÄ de mest uventede tidspunktene» er over, tar du feil.

NĂ„r vi konfigurerte arbeidet med indekser, valgte vi mmapfs for Ă„ forkorte sĂžketiden etter ferske shards med hĂžy segmentering. Dette var en ganske grov feil, fordi ved bruk av mmapfs blir filen mappet inn i RAM, og deretter jobber vi med den mappede filen. Dette resulterte i at nĂ„r GC forsĂžk Ă„ stoppe trĂ„dene i applikasjonen, tok det veldig lang tid fĂžr vi kom til safepoint, og pĂ„ veien dit slutter applikasjonen Ă„ svare pĂ„ masterens forespĂžrsel om den fortsatt er aktiv. Dermed mener masteren at noden ikke lenger er tilstede i klustret. Etter fem til ti sekunder utfĂžres garbage collector, noden kommer tilbake, gĂ„r inn igjen i klustret og begynner Ă„ initialisere shards. Alt dette minnet sterkt om “produksjonen vi fortjente” og var ikke egnet for noe seriĂžst.

For Ă„ bli kvitt denne oppfĂžrselen, gikk vi fĂžrst over til standard niofs, og etter at vi hadde migrert fra femte til sjette versjon av Elastic, prĂžvde vi hybridfs, hvor dette problemet ikke forekom. Du kan lese mer om lagringstyper. her.

Det fjerde problemet.
Deretter var det et annet veldig interessant problem som vi brukte rekordlang tid pÄ Ä lÞse. Vi jaktet pÄ det i 2-3 mÄneder, fordi mÞnsteret var helt uforstÄelig.

Noen ganger gikk koordinatorene vĂ„re i Full GC, vanligvis etter lunsj, og kom aldri tilbake. PĂ„ logsynkronisering av GC sĂ„ det slik ut: alt gĂ„r bra, bra, bra, sĂ„ plutselig — alt ble dĂ„rlig.

FÞrst trodde vi at vi hadde en ond bruker som kjÞrte en forespÞrsel som fikk koordinatoren til Ä gÄ ut av arbeidsmodus. Vi logget forespÞrslene lenge i et forsÞk pÄ Ä finne ut hva som skjedde.

Det viste seg at nÄr en bruker kjÞrer en stor forespÞrsel, og den treffer en spesifikk Elasticsearch-koordinator, responderer noen noder tregere enn de andre.

Mens koordinatoren venter pÄ svar fra alle nodene, akkumulerer den resultatene fra nodene som har svart. For GC betyr dette at bruksmÞnsteret for heapen endrer seg raskt. Den GC-en vi brukte klarte ikke Ä hÄndtere denne oppgaven.

Den eneste lÞsningen vi fant for Ä endre atferden til klyngen i en slik situasjon, var Ä migrere til JDK13 og bruke sÞppelsamleren Shenandoah. Dette lÞste problemet, og koordinatorene vÄre sluttet Ä falle.

Her sluttet problemene med Java, og problemene med bÄndbredde begynte.

«BÊr» med Elasticsearch: bÄndbredde

Elasticsearch-klynge pÄ 200 TB+

Problemer med bÄndbredde betyr at klyngen vÄr fungerer stabilt, men at ytelsen er utilstrekkelig under topptider for indekserte dokumenter og ved manÞvrering.

Det fÞrste symptomet vi oppdaget: under visse «eksplosjoner» i produksjon, nÄr et stort antall logger genereres raskt, begynte Graylog Ä vise feilmeldinger for indeksering es_rejected_execution.

Dette skjedde fordi thread_pool.write.queue pÄ en datanode, fÞr Elasticsearch fÄr behandlet forespÞrselen om indeksering og sendt informasjon til shard pÄ disk, kun kan cache 200 forespÞrslene som standard. Og i dokumentasjonen for Elasticsearch legges det lite vekt pÄ denne parameteren. Det nevnes bare maks antall trÄder og standardstÞrrelse.

SelvfÞlgelig begynte vi Ä justere denne verdien og fant ut fÞlgende: spesielt i vÄr oppsett kan det caches opp til 300 forespÞrseler ganske bra, mens hÞyere verdier fÞrer til at vi havner tilbake i Full GC.

I tillegg, ettersom dette er meldingsseksjoner som kommer innenfor én forespÞrsel, mÄtte Graylog ogsÄ justeres slik at det ikke skrev ofte og i smÄ batcher, men i store batcher eller hvert 3. sekund, hvis batchen fortsatt ikke er full. I sÄ fall blir informasjonen vi skriver i Elasticsearch tilgjengelig ikke etter to sekunder, men etter fem (som er helt akseptabelt for oss), men antallet retriever som mÄ gjÞres for Ä presse gjennom en stor mengde informasjon reduseres.

Dette er sĂŠrlig viktig nĂ„r noe gĂ„r galt og rapporterer frustrert, slik at vi ikke fĂ„r en helt spammende Elastic, og etter en stund — ikke-fungerende Graylog-noder pĂ„ grunn av fulle buffere.

I tillegg, nÄr vi hadde disse eksplosjonene i produksjonen, fikk vi klager fra programmerere og testere: i det Þyeblikket de virkelig trenger disse loggene, blir de levert til dem veldig sakte.

Vi begynte Ä undersÞke. PÄ den ene siden var det klart at bÄde sÞkeforespÞrslene og forespÞrslene om indeksering egentlig kjÞrte pÄ de samme fysiske maskinene, og pÄ en eller annen mÄte ville det helt klart vÊre visse nedganger.

Men dette kunne delvis omgÄs ved at det i versjon seks av Elasticsearch kom en algoritme som tillater Ä fordele forespÞrslene mellom relevante datanoder ikke pÄ tilfeldig round-robin-prinsipp (containeren som tar seg av indeksering og holder primary-shard, kan vÊre veldig opptatt, og der vil det ikke vÊre mulighet for Ä svare raskt), men Ä sende denne forespÞrselen til en mindre belastet container med replica-shard, som vil svare mye raskere. Med andre ord, vi kom frem til use_adaptive_replica_selection: true.

Bildet av lesingen begynner Ă„ se slik ut:

Elasticsearch-klynge pÄ 200 TB+

Overgangen til denne algoritmen tillot en betydelig forbedring av spĂžrringstiden i de Ăžyeblikkene vi hadde en stor strĂžm av logger inn.

Til slutt var hovedproblemet Ă„ trekke ut datasenteret uten komplikasjoner.

Hva vi Ăžnsket fra klyngen umiddelbart etter tap av kontakt med ett DC:

  • Hvis vĂ„r nĂ„vĂŠrende master befinner seg i det avkoblede datasenteret, vil det bli valgt pĂ„ nytt og flytte rollen til en annen node i et annet DC.
  • Masteren vil raskt kaste ut alle utilgjengelige noder fra klyngen.
  • Basert pĂ„ de gjenvĂŠrende vil han forstĂ„: i det tapte datasenteret hadde vi slike primary-sharder, han vil raskt promotere komplementĂŠre replica-sharder i de gjenvĂŠrende datasentrene, og vĂ„r datainndeksering vil fortsette.
  • Som et resultat av dette vil bĂ„ndbredden til klyngen for skriving og lesing gradvis avta, men generelt vil alt fungere selv om det gĂ„r sakte, men stabilt.

Som det viste seg, Ăžnsket vi noe slikt:

Elasticsearch-klynge pÄ 200 TB+

Og vi fikk fĂžlgende:

Elasticsearch-klynge pÄ 200 TB+

Hvordan gikk dette til?

I Þyeblikket av datasenterets fall ble mesteren vÄrt flaskehals.

Why?

Saken er at det i mesteren er en TaskBatcher, som ansvarlig for distribusjonen av bestemte oppgaver og hendelser i klyngen. Ethvert utfall av en node, enhver promovering av en sharde fra replica til primary, enhver oppgave for Ă„ opprette en sharde et sted — alt dette gĂ„r fĂžrst inn i TaskBatcher, hvor det behandles sekvensielt og i Ă©n trĂ„d.

I Ăžyeblikket av utgangen av et datasenter skjedde det at alle datanoder i de overlevende datasentrene fĂžlte det som sin plikt Ă„ informere mesteren "vi har mistet slike shard og slike datanoder".

Samtidig sendte de overlevende datanodene all denne informasjonen til den nÄvÊrende mesteren og prÞvde Ä vente pÄ bekreftelse pÄ at han hadde mottatt den. De ventet ikke pÄ dette, da mesteren mottok oppgaver raskere enn han klarte Ä svare. Noder gjentok forespÞrslene pÄ timeout, mens mesteren i mellomtiden ikke engang prÞvde Ä svare dem, men var helt oppslukt av oppgaven med Ä sortere forespÞrslene etter prioritet.

I terminal form ble det slik at datanodene spammet mesteren til det punktet at han gikk inn i full GC. Etter dette ble rollen som mester overfĂžrt til en eller annen neste node, og det skjedde akkurat det samme med den, og til slutt kollapset klyngen helt.

Vi utfÞrte mÄlinger, og fÞr versjon 6.4.0, hvor dette ble fikset, var det tilstrekkelig Ä ta ut bare 10 datanoder samtidig fra 360 for Ä helt legge klyngen ned.

Det sÄ omtrent slik ut:

Elasticsearch-klynge pÄ 200 TB+

Etter versjon 6.4.0, hvor denne skumle feilen ble fikset, sluttet datanodene Ä drepe mesteren. Men han ble ikke "smartere" av den grunn. Nemlig: nÄr vi tar ut 2, 3 eller 10 (hvilket som helst antall annet enn én) datanoder, fÄr mesteren et eller annet fÞrste meldingen som forteller at node A har falt ut, og prÞver Ä fortelle dette til node B, node C, node D.

Og for Þyeblikket kan dette bare tackles ved Ä sette en tidsavbrudd pÄ forsÞkene om Ä informere noen om noe, lik et sted rundt 20-30 sekunder, og dermed styre hastigheten pÄ datasenterets utgang fra klustret.

I prinsippet passer dette inn i de kravene som opprinnelig ble stilt til det endelige produktet i prosjektets rammeverk, men i lys av «ren vitenskap» er dette en feil. En feil som forresten ble vellykket fikset av utviklerne i versjon 7.2.

Dessuten, nÄr en datanode gikk ut, viste det seg at det var viktigere Ä spre informasjonen om dens utgang enn Ä informere hele klustret om at den hadde slike primary-shard (for Ä promotere replica-shard i et annet datasenter til primary, slik at det kunne skrives informasjon).

Derfor, nÄr alt «har roet seg», markeres ikke de utgÄtte datanodene som stale umiddelbart. Dermed mÄ vi vente til alle pingene til de utgÄtte datanodene har timed out, og fÞrst deretter begynner klustret Ä informere om at der og der mÄ skrivingen av informasjon fortsette. Du kan lese mer om dette. her.

Som et resultat tar operasjonen Ä trekke datasenteret vÄrt i dag omtrent 5 minutter i rushtiden. For en sÄ stor og treg maskin er det et ganske godt resultat.

Som et resultat kom vi til fĂžlgende lĂžsning:

  • Vi har 360 datanoder med disker pĂ„ 700 gigabyte.
  • 60 koordinatorer for ruting av trafikk mellom disse datanodene.
  • 40 mastere, som vi har igjen som et slags arv fra tidene fĂžr versjon 6.4.0 — for Ă„ overleve trekkingen av datasenteret var vi moralsk forberedt pĂ„ Ă„ miste noen maskiner, for Ă„ garantere at vi, selv i det dĂ„rligste scenarioet, hadde kvorum av mastere.
  • Enhver forsĂžkt kombinasjon av roller i en container stĂžttet pĂ„ at noden til slutt ville feile under belastning.
  • Hele klustret bruker en heap.size pĂ„ 31 gigabyte: alle forsĂžk pĂ„ Ă„ redusere stĂžrrelsen fĂžrte til at tunge sĂžkespĂžrsmĂ„l med leading wildcard enten drepte noen noder, eller aktivere circuit breaker i Elasticsearch selv.
  • I tillegg, for Ă„ sikre sĂžkeytelse, prĂžvde vi Ă„ holde antallet objekter i klustret sĂ„ lavt som mulig, for Ă„ behandle sĂ„ fĂ„ hendelser som mulig i det trange punktet vi hadde i masteren.

Til slutt om overvÄkning

For everything to work as intended, we monitor the following:

  • Each data node reports to our cloud that it exists and has certain shards on it. When we take down something somewhere, the cluster reports within 2-3 seconds that in data center A we have taken down nodes 2, 3, and 4 — this means that in other data centers, we absolutely cannot take down those nodes that still have shards in a single instance.
  • Understanding the master's behavior, we pay close attention to the number of pending tasks. Because even one stuck task, if not timed out promptly, could theoretically be the reason we can't, for instance, promote a replica shard to primary, causing indexing to stop.
  • We also closely monitor garbage collector delays, as we have already faced significant challenges with this during optimization.
  • Rejections by threads, to understand in advance where the 'bottleneck' is.
  • And the standard metrics, like heap, RAM, and I/O.

When building monitoring, it is essential to consider the peculiarities of the Thread Pool in Elasticsearch. Elasticsearch documentation describes the configuration capabilities and default values for searching, indexing, but completely omits thread_pool.management. These threads handle, among other things, requests like _cat/shards and other similar ones that are convenient for writing monitoring. The larger the cluster, the more of these requests are executed in a given time, and the aforementioned thread_pool.management is not only absent from the official documentation, but it is also limited by default to 5 threads, which can be quickly utilized, after which monitoring ceases to function correctly.

In conclusion, I want to say: we did it! We managed to provide our programmers and developers with a tool that can quickly and reliably provide information about what is happening in production in almost any situation.

Yes, it turned out quite complex, but nevertheless, we were able to fit our wishes into existing products, which did not need to be patched or rewritten for ourselves.

Elasticsearch-klynge pÄ 200 TB+

Kilde: habr.com

KjĂžp pĂ„litelig hosting for nettsteder med DDoS-beskyttelse, VPS VDS-servere đŸ”„ KjĂžp pĂ„litelig hosting for nettsteder med DDoS-beskyttelse, VPS VDS-servere | ProHoster