Elasticsearch-kluster pÄ 200 TB+

Elasticsearch-kluster pÄ 200 TB+

MÄnga stöter pÄ Elasticsearch. Men vad hÀnder nÀr man vill anvÀnda det för att lagra loggar "i en sÀrskilt stor mÀngd"? Och dessutom utan att kÀnna av ett eventuellt misslyckande av nÄgot av flera datacenter? Hur bör arkitekturen se ut, och vilka fallgropar kan man stöta pÄ?

Vi pÄ Odnoklassniki har beslutat att anvÀnda Elasticsearch för att lösa frÄgan om logghantering, och nu delar vi med oss av vÄra erfarenheter till Habr: bÄde om arkitekturen och om fallgroparna.

Jag heter Pjotr Zaitsev, och jag arbetar som systemadministratör pĂ„ Odnoklassniki. Tidigare var jag ocksĂ„ admin och arbetade med Manticore Search, Sphinx search, Elasticsearch. Om det dyker upp ytterligare nĂ„gon 
 search, kommer jag troligen ocksĂ„ att arbeta med den. Jag deltar ocksĂ„ i flera open source-projekt pĂ„ frivillig basis.

NÀr jag kom till Odnoklassniki sade jag oförsiktigt pÄ intervjun att jag kunde arbeta med Elasticsearch. Efter att ha kommit in i det och genomfört nÄgra enklare uppgifter fick jag en stor uppgift att reformera det logghanteringssystem som fanns vid den tidpunkten.

Krav

Krav pÄ systemet formulerades pÄ följande sÀtt:

  • Som frontend skulle Graylog anvĂ€ndas. Eftersom företaget redan hade erfarenhet av att anvĂ€nda denna produkt, kĂ€nde programmerare och testare till den, den var bekant och bekvĂ€m för dem.
  • Dataflödet: i genomsnitt 50-80 tusen meddelanden per sekund, men om nĂ„got gĂ„r sönder Ă€r trafiken oreglerad, det kan bli 2-3 miljoner rader per sekund.
  • Efter att ha diskuterat kraven pĂ„ hastigheten för att bearbeta sökfrĂ„gor med bestĂ€llarna insĂ„g vi att det typiska anvĂ€ndningsmönstret för ett sĂ„dant system Ă€r att mĂ€nniskor söker loggar för sin applikation för de senaste tvĂ„ dagarna och inte vill vĂ€nta lĂ€ngre Ă€n en sekund pĂ„ resultatet av sin frĂ„ga.
  • Administratörer insisterade pĂ„ att systemet enkelt skulle kunna skalas om det behövdes, utan att det krĂ€vdes att de hade djup kunskap om hur det Ă€r uppbyggt.
  • SĂ„ den enda uppgiften för underhĂ„ll som systemet regelbundet krĂ€vde var att byta ut viss hĂ„rdvara.
  • Dessutom har Odnoklassniki en fantastisk teknisk tradition: varje tjĂ€nst vi lanserar mĂ„ste klara av att hantera ett datacenteravbrott (plötsligt, oförutsett och vid vilken tidpunkt som helst).

Det senaste kravet i genomförandet av detta projekt har kostat oss mest blod, vilket jag kommer att berÀtta mer om senare.

Miljö

Vi arbetar pÄ fyra datacenter, medan datanoder för Elasticsearch bara kan placeras i tre (av flera icke-tekniska anledningar).

I dessa fyra datacenter finns ungefĂ€r 18 000 olika loggkĂ€llor — hĂ„rdvara, containrar, virtuella maskiner.

En viktig funktion: klustret startas i containrar Podman inte pÄ fysiska maskiner, utan pÄ vÄr egen molnprodukt one-cloud. Containrarna garanteras 2 kÀrnor, motsvarande 2.0Ghz v4 med möjlighet att anvÀnda resterande kÀrnor om de Àr lediga.

Med andra ord:

Elasticsearch-kluster pÄ 200 TB+

Topologi

Den övergripande lösningen sÄg jag initialt ut pÄ följande sÀtt:

  • 3-4 VIP:ar stĂ„r bakom A-posterna för domĂ€nen Graylog, det Ă€r adressen dit loggarna skickas.
  • varje VIP Ă€r en LVS-belastningsbalanserare.
  • Efter det kommer loggarna till ett batteri av Graylog, dĂ€r en del av datan gĂ„r i GELF-format och en annan del i syslog-format.
  • DĂ€refter skrivs allt detta i stora batchar till ett batteri av Elasticsearch-koordinatorer.
  • Och de, i sin tur, skickar skriv- och lĂ€sförfrĂ„gningar till relevanta datanoder.

Elasticsearch-kluster pÄ 200 TB+

Terminologi

Kanske Àr inte alla insatta i terminologin, sÄ jag skulle vilja stanna vid den en stund.

I Elasticsearch finns det flera typer av noder — master, koordinator, datanod. Det finns ocksĂ„ tvĂ„ andra typer för olika loggtransformationer och för att lĂ€nka ihop olika kluster, men vi anvĂ€nde bara de nĂ€mnda.

Master
Pingar alla noder nÀrvarande i klustret, upprÀtthÄller en aktuell karta över klustret och sprider den mellan noderna, hanterar hÀndelselogik, sysslar med olika typer av cluster wide housekeeping.

Koordinator
Utför en enda uppgift: tar emot förfrÄgningar frÄn kunder för lÀsning eller skrivning och dirigerar denna trafik. Om det Àr en skrivförfrÄgan kommer den troligtvis att frÄga master vilken shard av den relevanta indexen den ska lÀgga detta i och vidarebefordra förfrÄgningen.

Datanod
Lagrar data, utför sökförfrÄgningar och operationer pÄ de shards som finns dÀr.

Graylog
Det hÀr Àr en slags sammanslagning av Kibana med Logstash i ELK-stacken. Graylog kombinerar bÄde UI och en pipeline för logghantering. Under huven hos Graylog arbetar Kafka och Zookeeper, som möjliggör kommunikation mellan Graylog som en kluster. Graylog kan cacha loggar (Kafka) vid avbrott av Elasticsearch och repetera misslyckade lÀs- och skrivförfrÄgningar, gruppera och mÀrka loggar enligt angivna regler. Precis som Logstash har Graylog funktionalitet för att modifiera strÀngar innan de skrivs till Elasticsearch.

Dessutom har Graylog inbyggd service discovery som gör det möjligt att fÄ en översikt över hela klustret baserat pÄ en tillgÀnglig Elasticsearch-nod och filtrera den efter en viss tagg, vilket ger möjlighet att rikta förfrÄgningar mot specifika containrar.

Visuellt ser det ut sÄ hÀr:

Elasticsearch-kluster pÄ 200 TB+

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

Index

NÀr vi ÄtervÀnder till systemets arkitektur skulle jag vilja gÄ nÀrmare in pÄ hur vi byggde indexmodellen sÄ att allt fungerade korrekt.

I det tidigare diagrammet Àr detta den lÀgsta nivÄn: Elasticsearch datanoder.

Ett index Àr en stor virtuell entitet som bestÄr av Elasticsearch-shards. Varje shard Àr i sig inget annat Àn ett Lucene-index. Och varje Lucene-index bestÄr i sin tur av ett eller flera segment.

Elasticsearch-kluster pÄ 200 TB+

Vid designen rÀknade vi med att för att uppfylla kravet pÄ lÀshastighet vid stora datamÀngder mÄste vi jÀmnt "sprida ut" dessa data över datanoderna.

Det resulterade i att antalet shards per index (med repliker) mÄste vara strikt lika med antalet datanoder. För det första för att sÀkerstÀlla en replikationsfaktor pÄ tvÄ (det vill sÀga vi kan förlora hÀlften av klustret). För det andra för att kunna hantera lÀs- och skrivförfrÄgningar med minst hÀlften av klustret.

Vi definierade lagringstiden initialt som 30 dagar.

Distributionen av shards kan grafiskt representeras pÄ följande sÀtt:

Elasticsearch-kluster pÄ 200 TB+

Hela den mörkgrÄ rektangeln Àr indexet i sin helhet. Den vÀnstra röda fyrkanten i den Àr primÀrsharden, den första i indexet. Och den blÄ fyrkanten Àr replica-sharden. De finns i olika datacenter.

NÀr vi lÀgger till en ytterligare shard hamnar den i det tredje datacentret. Och i slutÀndan fÄr vi en sÄdan struktur som möjliggör förlust av datacenter utan att förlora konsistensen av data:

Elasticsearch-kluster pÄ 200 TB+

Vi har stÀllt in rotationen av index, det vill sÀga skapandet av ett nytt index och borttagning av det Àldsta, till 48 timmar (baserat pÄ mönstret för anvÀndning av indexet: de senaste 48 timmarna söks oftast).

Denna rotationsintervall för index Àr kopplad till följande orsaker:

NÀr en specifik datanod fÄr en sökfrÄga Àr det ur ett prestandaperspektiv fördelaktigt att frÄga en shard om dess storlek Àr jÀmförbar med storleken pÄ nodens heap. Detta tillÄter att hÄlla den "heta" delen av indexet i heapen och snabbt fÄ Ätkomst till den. NÀr det blir mÄnga "heta delar" degraderas sökhastigheten för indexet.

NÀr en nod börjar hantera en sökfrÄga pÄ en shard tilldelar den ett antal trÄdar motsvarande antalet hypertrÄdade kÀrnor i den fysiska maskinen. Om sökfrÄgan berör ett stort antal shards ökar antalet trÄdar proportionellt. Detta pÄverkar sökhastigheten negativt och har en negativ inverkan pÄ indexeringen av nya data.

För att sĂ€kerstĂ€lla nödvĂ€ndig söklatens beslöt vi att anvĂ€nda SSD. För snabb hantering av förfrĂ„gningar mĂ„ste maskinerna dĂ€r dessa containrar var placerade ha minst 56 kĂ€rnor. Siffran 56 har valts som en förhĂ„llandevis tillrĂ€cklig mĂ€ngd som definierar antalet trĂ„dar som Elasticsearch kommer att generera under sin drift. MĂ„nga parametrar för trĂ„dpoolen i Elasticsearch beror direkt pĂ„ antalet tillgĂ€ngliga kĂ€rnor, vilket i sin tur pĂ„verkar det nödvĂ€ndiga antalet noder i klustret enligt principen "fĂ€rre kĂ€rnor — fler noder".

I slutÀndan verkar det som att en shard i genomsnitt vÀger omkring 20 gigabyte, och det finns 360 shards per index. Om vi roterar dem var 48:e timme har vi totalt 15 stycken. Varje index rymmer data för 2 dagar.

Skriva och lÀsa data scheman

LÄt oss gÄ igenom hur data skrivs i detta system.

Anta att vi fÄr en förfrÄgan frÄn Graylog till koordinatorn. Till exempel, vi vill indexera 2-3 tusen rader.

Koordinatorn fÄr en förfrÄgan frÄn Graylog och frÄgar mastern: "I indexeringsförfrÄgan angav vi specifikt index men inte vilken shard den ska skrivas till."

Mastern svarar: "Skriv denna information i shard nummer 71", varefter den direkt skickas till den relevanta data-noden dÀr primary-shard nummer 71 finns.

DĂ€refter replikerar transaktionsloggen till replica-shard som ligger i ett annat datacenter.

Elasticsearch-kluster pÄ 200 TB+

FrÄn Graylog kommer en sökförfrÄgan till koordinatorn. Koordinatorn vidarebefordrar den enligt index, dÀr Elasticsearch via round-robin fördelar förfrÄgningar mellan primary-shard och replica-shard.

Elasticsearch-kluster pÄ 200 TB+

Noderna, totalt 180 stycken, svarar ojÀmnt, och medan de svarar samlar koordinatorn information som de snabbare data-noderna redan "spottat ut". NÀr all information antingen kommit in eller tidsgrÀnsen nÄtts, skickar den allt direkt till klienten.

Hela detta system hanterar i genomsnitt sökförfrÄgningar frÄn de senaste 48 timmarna pÄ 300-400ms, med undantag för de förfrÄgningar som har leading wildcard.

"SmÄtt och gott" med Elasticsearch: Java-instÀllningar

Elasticsearch-kluster pÄ 200 TB+

För att allt skulle fungera som vi frÄn början ville, finjusterade vi under en lÄng tid olika saker i klustret.

Den första delen av de upptÀckta problemen var relaterade till hur Java Àr förinstÀlld i Elasticsearch.

Första problemet
Vi observerade ett stort antal meddelanden om att pÄ Lucene-nivÄ, nÀr bakgrundsjobb körs, faller segmentmerges av Lucene med fel. Loggarna visade att det var ett OutOfMemoryError-fel. Enligt telemetrin sÄg vi att minnet var fritt, och vi förstod inte varför denna operation misslyckades.

Det visade sig att Lucene-indexmerges Àger rum utanför heapen. Och containrarna Àr ganska hÄrt begrÀnsade vad gÀller resurser. Dessa resurser rymde endast heapen (heap.size var ungefÀr lika med RAM), och vissa off-heap-operationer misslyckades med minnesallokeringsfel om de av nÄgon anledning inte passade inom de ~500MB som Äterstod till grÀnsen.

Fixen var ganska trivial: vi ökade det tillgÀngliga RAM-minnet för containern och efter det glömde vi att vi ens hade sÄdana problem.

Det andra problemet
Fyra till fem dagar efter att klustret startades mÀrkte vi att data-noderna började periodiskt falla ut ur klustret och komma tillbaka efter 10-20 sekunder.

NÀr vi började undersöka det visade det sig att denna off-heap minne i Elasticsearch knappt kontrolleras alls. NÀr vi gav containern mer minne fick vi möjlighet att fylla direkt buffertpoolerna med olika information, och den rensades endast efter att en explicit GC kördes frÄn Elasticsearch.

I vissa fall tog denna operation ganska lÄng tid, och under denna tid hann klustret mÀrka denna nod som redan nedstÀngd. Detta problem Àr vÀl beskrivet. hÀr.

Lösningen blev följande: vi begrÀnsade Java:s möjlighet att anvÀnda största delen av minnet utanför heapen för dessa operationer. Vi begrÀnsade det till 16 gigabyte (-XX:MaxDirectMemorySize=16g), vilket resulterade i att explicit GC kallades betydligt oftare och genomfördes betydligt snabbare, vilket slutade med att klustret inte blev instabilt.

Problem tre
Om du tror att problem med 'noder som lÀmnar klustret vid de mest ovÀntade ögonblicken' avslutades hÀr, tar du fel.

NÀr vi konfigurerade arbete med indexen valde vi mmapfs för att minska söktiden för nya shards med hög segmentering. Detta var ett ganska grovt misstag, eftersom nÀr man anvÀnder mmapfs sÄ mappas filen in i RAM, och vi arbetar sedan med den mappade filen. Detta gör att nÀr garbage collection försöker stoppa trÄdarna i applikationen tar det mycket lÄng tid att nÄ safepoint, och pÄ vÀgen dit slutar applikationen att svara pÄ masterns förfrÄgningar om huruvida den fortfarande lever. Följaktligen anser master att noden inte lÀngre finns i klustret. Efter cirka 5-10 sekunder genomförs garbage collector, noden Äterupplivas, gÄr Äter in i klustret och pÄbörjar initialisering av shards. Allt detta pÄminde starkt om 'produktionen vi förtjÀnade' och var olÀmpligt för nÄgot seriöst.

För att bli av med ett sÄdant beteende gick vi först över till standard nio-fs, och sedan, nÀr vi migrerade frÄn femte versioner av Elastic till sjÀtte, försökte vi hybridfs dÀr detta problem inte Äterkom. Mer om lagringstyper kan lÀsas. hÀr.

Problem fyra
Sedan fanns det ytterligare ett mycket intressant problem som vi behandlade rekordlÀnge. Vi jagade det i 2-3 mÄnader eftersom dess mönster var helt oklart.

Ibland gick vĂ„ra koordinatorer in i Full GC, vanligtvis nĂ„gon gĂ„ng efter lunch, och kom dĂ€rifrĂ„n inte tillbaka. Vid loggning av GC-förseningar sĂ„g det ut sĂ„ hĂ€r: vi hade allt under kontroll, under kontroll, under kontroll, men sedan plötsligt — och allt gick snabbt dĂ„ligt.

Först trodde vi att vi hade en illvillig anvÀndare som körde en förfrÄgan som fick koordinatorn att sluta fungera. Vi loggade lÀnge förfrÄgningar för att ta reda pÄ vad som hÀnde.

Till slut visade det sig att vid den tidpunkt dÄ en anvÀndare kör en stor förfrÄgan, och den hamnar pÄ en specifik Elasticsearch-koordinator, svarar vissa noder lÄngsammare Àn andra.

Och den tid som koordinatorn vÀntar pÄ svar frÄn alla noder, samlar den resultaten som skickats frÄn de noder som redan svarat. För GC innebÀr det att vÄrt mönster för anvÀndning av heapen förÀndras snabbt. Och den GC vi anvÀnde klarade inte av denna uppgift.

Den enda fix vi hittade för att Àndra klusterbeteendet i en sÄdan situation var migration till JDK13 och anvÀndning av skrÀpuppsamlaren Shenandoah. Detta löste problemet, och vÄra koordinatorer slutade krascha.

Med detta slutade problemen med Java och problemen med genomströmning började.

"BÀr" med Elasticsearch: genomströmning

Elasticsearch-kluster pÄ 200 TB+

Problem med genomströmningen innebÀr att vÄrt kluster fungerar stabilt, men under toppar av antalet indexerade dokument och vid manipulationer Àr prestandan otillrÀcklig.

Det första symptom vi mÀrkte: vid vissa "explosioner" i produktionen, nÀr det plötsligt genereras en mycket stor mÀngd loggar, dyker det ofta upp ett indexeringsfel i Graylog som heter es_rejected_execution.

Detta hÀnde eftersom thread_pool.write.queue pÄ en data-nod, innan Elasticsearch kan bearbeta indexeringsförfrÄgan och skicka informationen till shard pÄ disk, som standard kan cacha endast 200 förfrÄgningar. Och i dokumentationen för Elasticsearch sÀrskilt om denna parameter nÀmns vÀldigt lite. Endast det maximala antalet trÄdar och den standardstorlek som nÀmns.

SjÀlvklart började vi justera detta vÀrde och kom fram till följande: specifikt i vÄr setup fungerar det ganska bra att cacha upp till 300 förfrÄgningar, medan ett högre vÀrde innebÀr att vi Äker tillbaka i Full GC.

Dessutom, eftersom detta Àr meddelandepaket som anlÀnder inom en enda begÀran, behövde vi ocksÄ justera Graylog sÄ att det skriver inte ofta och med smÄ batcher, utan stora batcher eller en gÄng var tredje sekund om batchen fortfarande inte Àr full. I sÄ fall blir informationen vi skriver till Elasticsearch tillgÀnglig inte efter tvÄ sekunder, utan efter fem (vilket vi Àr helt okej med), men antalet retrys som vi mÄste göra för att trycka igenom en stor mÀngd information minskar.

Detta Ă€r sĂ€rskilt viktigt i de stunder nĂ€r nĂ„got ovĂ€ntat hĂ€nder och det rapporteras intensivt, sĂ„ att vi inte fĂ„r en helt spamad Elastic, utan efter en tid — en icke-fungerande Graylog-nod pĂ„ grund av överfulla buffertar.

Dessutom, nÀr dessa explosioner intrÀffade i produktionen, fick vi klagomÄl frÄn programmerare och testare: just nÀr de verkligen behöver dessa loggar, ges de ut mycket lÄngsamt.

Vi började undersöka. Å ena sidan var det tydligt att bĂ„de sökfrĂ„gor och indexeringsfrĂ„gor kördes i praktiken pĂ„ samma fysiska maskiner, och pĂ„ ett eller annat sĂ€tt skulle det alltid bli vissa nedgĂ„ngar.

Men detta kunde delvis undvikas genom att den sjÀtte versionen av Elasticsearch introducerade en algoritm som gör att man kan fördela förfrÄgningar mellan relevanta datanoder inte pÄ ett slumpmÀssigt round-robin-sÀtt (containern som hanterar indexering och hÄller primary-shard kan vara mycket upptagen, och dÀr blir det ingen möjlighet att svara snabbt), utan att dirigera denna begÀran till en mindre belastad container med replica-shard som svarar betydligt snabbare. Med andra ord kom vi fram till use_adaptive_replica_selection: true.

Bild av lÀsningen börjar se ut sÄ hÀr:

Elasticsearch-kluster pÄ 200 TB+

ÖvergĂ„ngen till denna algoritm gjorde att vi mĂ€rkbart förbĂ€ttrade frĂ„ga tiden nĂ€r vi hade en stor mĂ€ngd loggar att skriva.

Till sist var det största problemet att smÀrtfritt ta bort datacentret.

Vad vi ville ha frÄn klustret omedelbart efter att ha förlorat kontakten med ett datacenter:

  • Om vĂ„r nuvarande master befinner sig i det bortfallande datacentret, sĂ„ kommer det att vĂ€ljas om och flyttas som roll till en annan nod i ett annat datacenter.
  • Mastern kommer snabbt att ta bort alla otillgĂ€ngliga noder frĂ„n klustret.
  • Baserat pĂ„ de kvarstĂ„ende kommer han att förstĂ„: i det förlorade datacentret hade vi sĂ„dana primary-shardar, snabbt kommer han att frĂ€mja komplementĂ€ra replica-shardar i de kvarstĂ„ende datacentren, och vi kommer att fortsĂ€tta indexera data.
  • Som ett resultat av detta kommer vi att uppleva en gradvis nedgĂ„ng i klusterets bandbredd för skrivning och lĂ€sning, men generellt kommer allt att fungera, Ă€ven om det Ă€r sakta, sĂ„ stabilt.

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

Elasticsearch-kluster pÄ 200 TB+

Och fick följande:

Elasticsearch-kluster pÄ 200 TB+

Hur kom det sig?

Vid tiden för datacentrets nedgÄng blev vÄr flaskhals mÀstaren.

Varför?

Det hela handlar om att det finns en TaskBatcher i mĂ€staren som ansvarar för att sprida specifika uppgifter, hĂ€ndelser i klustret. Varje nodutfall, varje uppgradering av shard frĂ„n replica till primary, varje uppgift för att skapa nĂ„gon shard nĂ„gonstans – allt detta hamnar först i TaskBatcher, dĂ€r det behandlas sekventiellt och i en enda ström.

Vid utfallet av ett datacenter hÀnde det att alla datakluster i de överlevande datacentren tyckte att det var deras plikt att informera mÀstaren "vi har förlorat sÄdana shardar och sÄdana datanoder".

Samtidigt skickade de överlevande datanoderna all denna information till den aktuella mÀstaren och försökte vÀnta pÄ bekrÀftelse pÄ att han hade mottagit den. De vÀntade inte pÄ detta, eftersom mÀstaren fick uppgifter snabbare Àn han kunde svara. Noderna upprepade sina förfrÄgningar efter en tidsgrÀns, och mÀstaren försökte inte ens svara pÄ dem under tiden utan var helt försjunken i uppgiften att sortera förfrÄgningar efter prioritet.

I ett terminalt lÀge hÀnde det att datanoder spamade mÀstaren sÄ mycket att han gick in i full GC. Efter detta flyttades mÀstarens roll till nÄgon nÀsta nod, och samma sak hÀnde med den, och i slutÀndan kollapsade klustret helt.

Vi gjorde mÀtningar och fram till version 6.4.0, dÀr detta blev fixat, var det tillrÀckligt för oss att ta ner endast 10 datanoder frÄn 360 för att helt krossa klustret.

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

Elasticsearch-kluster pÄ 200 TB+

Efter version 6.4.0, dÀr denna hemska bugg blev fixad, slutade datanoderna att döda mÀstaren. Men han blev inte "smartare" av detta. Det vill sÀga: nÀr vi tar ner 2, 3 eller 10 (vilket antal som helst som inte Àr ett) datanoder fÄr mÀstaren nÄgot första meddelande som sÀger att nod A har gÄtt ner och försöker berÀtta om detta för nod B, nod C, nod D.

Och för tillfÀllet kan man bara hantera detta genom att sÀtta en timeout för att försöka berÀtta nÄgot för nÄgon, som ligger pÄ omkring 20-30 sekunder, och pÄ sÄ sÀtt styra hastigheten för datacenterets uttrÀde ur klustret.

I princip överensstÀmmer detta med de krav som ursprungligen stÀlldes pÄ den slutliga produkten inom projektet, men sett ur ett "rent vetenskapligt" perspektiv Àr det en bugg. Som för övrigt framgÄngsrikt ÄtgÀrdades av utvecklarna i version 7.2.

Dessutom, nÀr en viss datanod gick ur drift, visade det sig att sprida information om dess uttrÀde var viktigare Àn att informera hela klustret om att det fanns vissa primary-shard pÄ den (för att kunna uppgradera replica-shard i ett annat datacenter till primary, och dÀr kunna skriva information).

DÀrför, nÀr allt "har tystnat", markeras de uttrÀdande datanoderna inte som stale omedelbart. Följaktligen tvingas vi vÀnta pÄ att alla pings till de uttrÀdande datanoderna timeoutar, innan vÄrt kluster börjar berÀtta att dÀr, dÀr och dÀr behöver vi fortsÀtta skriva information. Mer detaljerat kan man lÀsa om detta hÀr.

Resultatet Àr att operationen för att ta ut datacentret idag tar omkring 5 minuter under rusningstid. För en sÄ stor och otymplig maskin Àr det ett ganska bra resultat.

Till slut kom vi fram till följande lösning:

  • Vi har 360 datanoder med diskar pĂ„ 700 gigabyte.
  • 60 koordinatorer för att styra trafiken mellan dessa datanoder.
  • 40 master, som vi har kvar som en slags arv frĂ„n versioner före 6.4.0 - för att överleva uttrĂ€det av datacentret var vi moraliskt beredda att förlora nĂ„gra maskiner, för att garantera att vi Ă€ven vid det sĂ€msta scenariot skulle ha quorum bland mastrarna.
  • Alla försök att kombinera roller pĂ„ en och samma container har kört fast i att förr eller senare har noden brutit samman under belastning.
  • I hela klustret anvĂ€nds en heap.size pĂ„ 31 gigabyte: alla försök att minska storleken ledde till att tunga sökförfrĂ„gningar med leading wildcard antingen dödade vissa noder eller att circuit breaker slog till i sjĂ€lva Elasticsearch.
  • Dessutom, för att sĂ€kerstĂ€lla sökprestanda har vi försökt hĂ„lla antalet objekt i klustret sĂ„ lĂ„gt som möjligt, för att bearbeta sĂ„ fĂ„ hĂ€ndelser som möjligt pĂ„ den mest trĂ„nga punkten, vilket vi hade i mastern.

Till sist om övervakningen

För att allt detta ska fungera som tÀnkt övervakar vi följande:

  • Varje datanod rapporterar till vĂ„r molntjĂ€nst att den finns, och att den har dessa shardar. NĂ€r vi stĂ€nger ner nĂ„got, rapporterar klustret efter 2-3 sekunder att i datacenter A har vi stĂ€ngt ner nod 2, 3 och 4 - detta innebĂ€r att vi pĂ„ inga villkor kan stĂ€nga ner de noder i andra datacenter dĂ€r det finns shardar i en enda kopia.
  • Genom att kĂ€nna till beteendet hos mastern ser vi noga pĂ„ antalet vĂ€ntande uppgifter. För Ă€ven en enda hĂ€ngande uppgift, om den inte timeoutas i tid, kan teoretiskt sett i en krissituation bli orsaken till att vĂ„r promotering av en replica-shard till primary inte fungerar, vilket i sin tur stoppar indexeringen.
  • Vi övervakar Ă€ven noggrant fördröjningarna hos garbage collector, eftersom vi redan har haft stora problem med detta vid optimering.
  • Rejektionsstatistik för trĂ„dar för att pĂ„ förhand förstĂ„ var "flaskhalsen" befinner sig.
  • Och de vanliga mĂ€tvĂ€rdena, som heap, RAM och I/O.

Vid byggandet av övervakningen mÄste man ta hÀnsyn till egenskaperna hos Thread Pool i Elasticsearch. Elasticsearch-dokumentationen beskriver möjligheterna för anpassning och standardvÀrden för sökning och indexering, men nÀmner helt och hÄllet inte thread_pool.management. Dessa trÄdar hanterar bland annat förfrÄgningar av typen _cat/shards och andra liknande, som Àr praktiska att anvÀnda vid skrivandet av övervakning. Ju större klustret Àr, desto fler sÄdana förfrÄgningar utförs per tidsenhet, och den nÀmnda thread_pool.management Àr inte bara inte representerad i den officiella dokumentationen, utan den Àr ocksÄ begrÀnsad till 5 trÄdar som standard, vilket snabbt utnyttjas, vilket gör att övervakningen slutar att fungera korrekt.

Som en avslutning vill jag sÀga: vi lyckades! Vi har kunnat ge vÄra programutvecklare och utvecklare ett verktyg som nÀstan i vilken situation som helst snabbt och pÄlitligt kan ge information om vad som hÀnder i produktion.

Ja, det blev ganska komplext, men ÀndÄ lyckades vi fÄ in vÄra krav i redan existerande produkter utan att behöva patcha eller skriva om dem.

Elasticsearch-kluster pÄ 200 TB+

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