Elasticsearch i produksjon - beste praksis for distribusjon

Elasticsearch er svært optimalisert søkemotor for moderne dataanalyse.

Elasticsearch er en fantastisk søk- og analysemotor i sanntid. Den er bygget på Apache Lucene. Den er distribuert, RESTful, enkel å bruke og svært tilgjengelig. Elasticsearch-brukstilfeller inkluderer å søke etter søk, transaksjonsovervåking og feildeteksjon, innholdsoppdagelse, logganalyse, uklar søk, aggregering av hendelsesdata, visualisering av data. Elasticsearch og resten av Elastic Stack har vist seg å være ekstremt allsidige, og som du ser over brukssaker over, er det flere måter å integrere Elasticsearch i det produktet ditt leverer i dag og gi ekstra innsikt i det.

Vi bruker det tungt for søk og analyse på Botmetric, vi indekserer omtrent en milliard dokumenter om dagen og vi bruker veldig komplekse aggregeringer for datavisualisering i sanntid.

Når det er sagt, er bootstrapping av et program vs å kjøre det i produksjon og vedlikehold totalt annerledes. Denne arikalen dekker mange av disse faktorene fra opplevelser fra det virkelige liv og er de grunnleggende vanlige elementene du bør vurdere for å kjøre Elasticsearch i produksjon.

Hukommelse:

Elasticsearch og Lucene er skrevet i Java, noe som betyr at du må passe på statistikken over heapspace og JVM. Jo mer heap som er tilgjengelig for Elasticsearch, jo mer minne kan den bruke til filter og annen hurtigbufring for å øke spørsmålets ytelse. Men vær oppmerksom på at for mye haug kan utsette deg for lange pauser for innsamling av søppel. Ikke sett Xmx til over avskjæringen som JVM bruker for komprimerte objektpekere (komprimerte ups); den nøyaktige avskjæringen varierer, men er nær 32 GB.

Et vanlig problem er å konfigurere en for stor haug. Du har en 64 GB maskin - og av golly vil du gi Elasticsearch hele 64 GB minne. Mer er bedre! Heap er absolutt viktig for Elasticsearch. Det brukes av mange datastrukturer i minnet for å gi rask drift. Men når det er sagt, er det en annen stor bruker av minne som ikke er i bruk: OS-filbuffer.

Lucene er designet for å utnytte det underliggende operativsystemet for å lagre data-strukturer i minnet. Lucene-segmenter lagres i individuelle filer. Fordi segmenter er uforanderlige, endres aldri disse filene. Dette gjør dem veldig cache-vennlige, og det underliggende operativsystemet vil med glede holde varme segmenter bosatt i minnet for raskere tilgang. Disse segmentene inkluderer både den inverterte indeksen (for fulltekstsøk) og dokumentverdiene (for aggregeringer). Lucenes ytelse er avhengig av dette samspillet med operativsystemet. Men hvis du gir alt tilgjengelig minne til Elasticsearch sin haug, vil det ikke være noe igjen for OS-filbufferen. Dette kan påvirke ytelsen alvorlig. Standard anbefalingen er å gi 50% av det tilgjengelige minnet til Elasticsearch heap, mens de andre 50% blir fri. Det vil ikke gå ubrukt; Lucene vil gjerne konsumere det som er igjen til filbufferen. Elasticsearch-bunken kan konfigureres på følgende måter,

eksport ES_HEAP_SIZE = 10 g

eller

ES_JAVA_OPTS = "- Xms10g -Xmx10g" ./bin/elasticsearch

PROSESSOR:

Elasticsearch støtter aggregeringer og filtrerte spørsmål. Å kjøre komplekse filtrerte spørsmål, intensiv indeksering, perkolering og spørringer mot indekser trenger tung CPU, så det er viktig å hente den riktige. Man må forstå CPU-spesifikasjoner og hvordan de oppfører seg med Java når spørsmålene kjøres på JVM.

Hvert basseng kjører et antall tråder, som kan konfigureres, og har en kø. Å endre dette anbefales ikke med mindre du har veldig spesifikke krav, ettersom Elasticsearch gjør tildeling av kjerner dynamisk.

Gjengbassengtyper:

Elasticsearch har 3 typer trådbassenger.

  1. Bufret: Bufret trådbasseng er et ubegrenset trådbasseng som vil gyte en tråd hvis det er ventende forespørsler. Dette tråd bassenget brukes til å forhindre at forespørsler sendt til dette bassenget blokkerer eller blir avvist. Ubrukte tråder i denne trådpuljen blir avsluttet etter at utholdet går ut (standard til fem minutter). Bufret trådbasseng er forbeholdt generisk trådbasseng.
  2. Fast: Det faste trådbassenget har en fast størrelse på tråder for å håndtere forespørslene med en kø (valgfritt avgrenset) for ventende forespørsler som ikke har noen tråder for å betjene dem. Størrelsesparameteren kontrollerer antall tråder, og er standard for antall kjerner ganger 5.
  3. Skalering: Skaleringstrådpuljen har et dynamisk antall tråder. Dette tallet er proporsjonalt med arbeidsmengden og varierer mellom 1 og verdien til størrelsesparameteren.

Elasticsearch deler inn CPU-bruken i trådbassenger av forskjellige typer:

  • generisk: for standardoperasjoner som oppdagelse og trådbassengtype er hurtigbufret.
  • indeks: for å indeksere / slette operasjoner. Trådbassenget er fast.
  • search: for count / search operations. Trådbassenget er fast.
  • få: for få operasjoner. Trådbassenget er fast.
  • bulk: for bulkoperasjoner som bulkindeksering. Trådbassenget er fast. Den beste konfigurasjonen av bulkdokumenter avhenger av klasskonfigurasjon, dette kan identifiseres ved å prøve ut flere verdier.
  • percolate: for percolation. Trådbassenget er fast.
  • oppdatering: For oppdateringsoperasjoner. Trådbassenget skaleres.

Endring av et spesifikt trådbasseng kan gjøres ved å angi typespesifikke parametere.

Les mer https://www.elastic.co/guide/en/elasticsearch/reference/2.2/modules-threadpool.html#types

Skjortestørrelse:

Skåret er enheten som Elasticsearch distribuerer data i klyngen. Den hastigheten som Elasticsearch kan bevege seg på skjær når du balanserer data, f.eks. etter en feil, vil avhenge av størrelsen og antall skjær i tillegg til nettverks- og diskytelse.

I Elasticsearch blir hver spørring utført i en enkelt tråd pr. Flere skjær kan imidlertid behandles parallelt, det samme kan flere spørsmål og aggregeringer mot samme skjær.

Dette betyr at minimum forespørselstiden, når ingen cache er involvert, vil avhenge av dataene, typen spørring, så vel som størrelsen på skjæret. Å spørre om mange små skjær vil gjøre behandlingen per svert raskere, men ettersom mange flere oppgaver må stå i kø og behandles i rekkefølge, er det ikke nødvendigvis raskere enn å spørre om et mindre antall større skår. Å ha mange små skjær kan også redusere gjennomstrømningen av spørsmålet hvis det er flere samtidige spørsmål.

Hver skjort har data som må oppbevares i minnet og bruker mye plass. Dette inkluderer datastrukturer som inneholder informasjon på skjærnivå og også på segmentnivå for å definere hvor data ligger på disken. Størrelsen på disse datastrukturene er ikke fast og vil variere avhengig av brukssaken. Et viktig kjennetegn ved segmentrelatert overhead er imidlertid at det ikke er strengt proporsjonalt med størrelsen på segmentet. Dette betyr at større segmenter har mindre overhead per datavolum sammenlignet med mindre segmenter. Forskjellen kan være betydelig. Å velge riktig antall skår er komplisert fordi du aldri vet hvor mange dokumenter du får før du starter. Å ha masse skjær kan være både bra og forferdelig for en klynge. Indekser og skjærbehandling kan overbelaste hovednoden, noe som kan bli lite svarende, noe som kan føre til litt merkelig og stygg oppførsel. Tildel masternodene dine nok ressurser til å takle klyngestørrelsen.

Den dårlige tingen er at antall skjær er uforanderlig og det er definert når du oppretter indeksen. Når indeks er opprettet, er den eneste måten å endre antall skjær på å slette indeksene, opprette dem på nytt og gjenindeksere.

Replication

Elasticsearch støtter replikering, data blir kopiert mellom dataknodene, slik at et knutetap ikke vil føre til datatap. Som standard er replikasjonsfaktor 1, men avhengig av produktkrav kan den økes. Jo flere kopier, desto mer katastrofebestandig vil dataene dine være. En annen fordel med å ha flere kopier er at hver node har en replika-skjær, noe som forbedrer spørringens ytelse ettersom kopier også brukes til spørring.

Replikeringsformelen som Elasticsearch bruker for konsistens er,

(primær + nummer_av_replikater) / 2 + 1

Optimalisering av tildeling

Basert på krav til produktdata, kan vi klassifisere data i varmt og kaldt. Indekser som åpnes oftere enn andre, kan tildeles flere dataknuter, mens indekser som er sjeldnere tilgjengelige indekser kan ha mindre ressurser. Denne strategien er spesielt nyttig for lagring av tidsseriedata som applikasjonslogger (f.eks: ELK).

Dette kan oppnås ved å kjøre en cronjob som flytter indeksene til forskjellige noder med jevne mellomrom.

Hot node er en type datanode som utfører all indeksering i klyngen. De har også de nyeste indeksene, siden disse vanligvis har spørsmål ofte. Siden indeksering er en CPU- og IO-intensiv drift, må disse serverne være kraftige og støttes av vedlagt SSD-lagring. Vi anbefaler å kjøre minimum 3 varme noder for høy tilgjengelighet. Avhengig av mengden nyere data du ønsker å samle inn og spørre om, kan det hende du må øke dette antallet for å oppnå resultatmålene dine.

Varm node er en datanode som er designet for å håndtere en stor mengde skrivebeskyttede indekser som ikke er like sannsynlig å bli spurt ofte. Siden disse indeksene er skrivebeskyttet, har varm node en tendens til å bruke store festede disker (vanligvis spinnende disker) i stedet for SSD-er. Som med varm node, anbefaler vi minimum 3 Varm node for høy tilgjengelighet. Og som før, med forbehold om at større datamengder kan kreve ytterligere noder for å oppfylle ytelseskrav. Vær også oppmerksom på at CPU- og minnekonfigurasjoner ofte vil trenge å speile de hotnodene dine. Dette kan bare bestemmes ved å teste med spørsmål som ligner på det du ville oppleve i en produksjonssituasjon.

For mer informasjon om varm og varm node, se her.

En annen strategi som du kan tilpasse er å arkivere indeksene til s3 og gjenopprette når du trenger data fra disse indeksene. Du kan lese mer om det herfra.

Knutetopologi:

Elasticsearch-noder kan deles inn i tre kategorier masternode, data node, client node.

  1. Hovednode: Hovednoden kan være liten hvis den ikke er en datanode, da den ikke lagrer noen indekser / skjær. Dens ansvar er å lagre detaljert klyngestatus og hjelpedata og andre noder i indekser / skjær meta-dataoppslag. Elasticsearch bør ha flere hovednoder for å unngå splittet hjerneproblem.
  2. Datanode: Datanode er ansvarlig for lagring / spørring av de faktiske indeksdataene.
  3. Klientnode: Klientnode brukes som en proxy for indeksering og søk. Dette anbefales på det sterkeste hvis aggregasjoner brukes kraftig. Dette er spesielle ElasticSearch-noder som verken er data eller masterberettiget. Klientnoder er klyngebaserte og kan derfor fungere som smarte belastningsbalansører. Du kan sende spørsmålene dine til klientnodene som deretter kan ta på seg den dyre oppgaven å samle svar på spørreresultatene fra hver av datanodene.

legg til disse innstillingene i elasticsearch.yml-filen for respektive noder.

Master node: node.master: true node.data:false
Datanode: node.master: falsk node.data:true
Klientnode: node.master: falsk node.data:false

Tips om feilsøking:

Elasticsearch-ytelsen avhenger sterkt av maskinen den er installert på. CPU, minnebruk og Disk I / O er grunnleggende operativsystemberegninger for hver Elasticsearch-node. Det anbefales at du ser på Java Virtual Machine (JVM) -beregninger når CPU-bruken pigger. I det følgende eksemplet var årsaken til piggen høyere søppelinnsamlingsaktivitet.

  1. Heaptrykk: Høyt minnetrykk virker mot klyngens ytelse på to måter: Når minnetrykket stiger til 75% og over, forblir mindre minne tilgjengelig, og klyngen din trenger nå også å bruke noen CPU-ressurser for å gjenvinne minnet gjennom søppelinnsamling. Disse CPU-syklusene er ikke tilgjengelige for håndtering av brukerforespørsler mens søppelhenting er på. Som et resultat øker responstidene for brukerforespørsler etter hvert som systemet blir mer og mer ressursbegrenset. Hvis minnetrykket fortsetter å stige og når nesten 100%, brukes en mye mer aggressiv form for søppelinnsamling, som igjen vil påvirke klyngens responstid dramatisk. Index Response Times-metrikken viser at høyt minnetrykk fører til betydelig ytelseseffekt.
  2. Vekst i JVMs ikke-heap-minne, spiser bort minne beregnet for sidecache og muligens forårsaker OOM-høsting av kjernenivå.
  3. Unngå delt hjerneproblem. Splitt hjerne er et scenario der klyngen splitter opp. For eksempel har du 6 nodeklynger. 2 noder kobler seg fra klyngen, men de kan fortsatt se hverandre. Disse to nodene oppretter deretter en annen klynge. De vil til og med velge en ny mester seg imellom. Vi har nå to klynger med samme navn, en med 4 noder og en annen med 2 noder. Hver har en hovednode også. Dette er det som kalles split-brain-problem med ES-klynger. For å unngå dette, angi ES-parameteren discovery.zen.minimum_master_nodes til halve antallet noder + 1.
  4. Siden Elasticsearch bruker lagringsenheter tungt, sikrer overvåking av disk I / O at dette grunnleggende behovet blir oppfylt. Det er mange årsaker til redusert I / O-disk, det anses som en nøkkelmetrik for å forutsi mange slags problemer. Det er en god beregning å sjekke effektiviteten til indeksering og spørringsytelse. Å analysere lese- og skriveoperasjoner indikerer direkte hva systemet trenger mest i den spesifikke brukssaken. Operativsystemets innstillinger for disk I / O er en base for alle andre optimaliseringer. Hvis du stiller inn disk I / O, kan du unngå potensielle problemer. Hvis disken I / O fremdeles ikke er tilstrekkelig, bør motforanstaltninger som å optimalisere antall skjær og deres størrelse, smelte sammen, erstatte sakte disker, flytte til SSDer eller legge til flere noder, vurderes i henhold til omstendighetene som forårsaker I / O flaskehalser.
  5. For applikasjonene som er avhengige av søk, er brukeropplevelsen sterkt korrelert med latens for søkeforespørsler. Det er mange ting som kan påvirke spørsmålets ytelse, som konstruerte spørringer, feil konfigurert Elasticsearch-klynge, JVM-minne og søppelinnsamlingsproblemer, disk IO, og så videre. Spørringsforsinkelse er beregningen som påvirker brukerne direkte, så sørg for at du legger noen varsler på den.
  6. De fleste filtrene i Elasticsearch er hurtigbufret som standard. Det betyr at under den første utførelsen av et filtrert spørsmål, vil Elasticsearch finne dokumenter som samsvarer med filteret og bygge en struktur kalt "bitsett" ved hjelp av denne informasjonen. Data lagret i bitsettet inneholder en dokumentidentifikator og om et gitt dokument stemmer overens med filteret. Påfølgende henrettelser av spørringer med samme filter vil bruke informasjonen som er lagret i bitsettet, på nytt, og dermed gjøre spørringens utførelse raskere ved å lagre I / O-operasjoner og CPU-sykluser. Det anbefales å bruke filteret i spørringen. For mer informasjon, se her.
  7. Oppdateringstid og flettingstid er nært relatert til indekseringsytelse, pluss at de påvirker den samlede klyngens ytelse. Oppdateringstiden øker med antall filoperasjoner for Lucene-indeksen (shard).
  8. Aktivering av sakte søk logging vil hjelpe deg med å identifisere hvilke spørsmål som er sakte og hva som kan gjøres for å forbedre dem, spesielt nyttig for jokertegn.
  9. Øk ulimit-størrelsen for å tillate maksimale filer.
  10. ElasticSearch-ytelse kan lide når OS bestemmer seg for å bytte ut ubrukt applikasjonsminne. Deaktiver bytte ved å stille innstillinger på OS-nivå eller angi følgende i ElasticSearch config bootstrap.mlockall: true
  11. Deaktiver sletting av alle indeksene etter jokertegn. For å sikre at noen ikke utgir en DELETE-operasjon på alle indekser (* eller _all), sett action.destructive_requires_name til true.

Før du avslutter, er listen over nettadresser som er nyttige for å se beregningene.

  • / _kluster / helse? pen: For klyngehelseindikatoren.
  • / _status? pen: For all informasjon om alle indeksene.
  • / _noder? pen: For all informasjon om nodene.
  • / _cat / master? pretty: For masternode.
  • / _stats? pen: For statistikk for skårdeling, indeksstatistikk.
  • / _noder / statistikk? pen: For individuell nodestatistikk inkluderer dette jvm, http, io statistikk for noden.

Metrics aggregering av Elasticsearch støttes av de fleste systemovervåkingsverktøy som Datadog, TICK. Det anbefales å bruke slike verktøy, og å lage trakt anbefales sterkt for kontinuerlig overvåking av Elasticsearch.

Konklusjon:

Elasticsearch er en distribuert søkes- og analysemotor i fulltekst, som gjør det mulig for flere leietakere å søke gjennom hele datasettene, uansett størrelse, med enestående hastigheter. I tillegg til søkemulighetene i fulltekst, fungerer ElasticSearch som et analysesystem og distribuert database. ElasticSearch har store standardinnstillinger for å komme i gang. Men en gang forbi det første eksperimentstadiet, må du bruke litt tid på å finjustere innstillingene for dine behov. Det anbefales at du besøker konfigurasjonen senere, sammen med den offisielle dokumentasjonen, for å sikre at klyngen er konfigurert til å dekke dine behov.