Elasticsearch i produktion - bästa metoder för implementering

Elasticsearch är mycket optimerad sökmotor för modern dataanalys.

Elasticsearch är en fantastisk sökning och analysmotor i realtid. Det är byggt på Apache Lucene. Det är distribuerat, RESTful, enkelt att använda och mycket tillgängligt. Elasticsearch-användningsfall inkluderar drivning av sökningen, transaktionsövervakning och feldetektering, innehållsupptäckt, loganalys, fuzzy search, aggregering av händelsedata, visualisering av data. Elasticsearch och resten av Elastic Stack har visat sig vara extremt mångsidig, och som du kan se ovan användningsfall finns det flera sätt att integrera Elasticsearch i vad din produkt levererar idag och lägga till extra inblick i det.

Vi använder det kraftigt för sökning och analyser på Botmetric, vi indexerar ungefär en miljard dokument per dag och vi använder mycket komplexa aggregeringar för datavisualisering i realtid.

Som sagt, bootstrapping av en applikation vs att köra den i produktion och underhåll är helt annorlunda. Denna arikel täcker många av dessa faktorer från verkliga erfarenheter och är de grundläggande vanliga artiklar du bör tänka på för att köra Elasticsearch i produktion.

Minne:

Elasticsearch och Lucene är skrivna i Java, vilket betyder att du måste se upp för heapspace och JVM-statistik. Ju mer hög som finns tillgänglig för Elasticsearch, desto mer minne kan den använda för filter och annan caching för att öka frågeställningen. Men observera att för mycket hög kan utsätta dig för långa pauser för insamling av skräp. Ställ inte Xmx ovanför den avgränsning som JVM använder för komprimerade objektpekare (komprimerade oops); den exakta avgränsningen varierar men är nära 32 GB.

Ett vanligt problem är att konfigurera en hög för hög. Du har en 64 GB maskin - och av golly vill du ge Elasticsearch alla 64 GB minne. Mer är bättre! Heap är definitivt viktigt för Elasticsearch. Det används av många datastrukturer i minnet för att ge snabb drift. Men med det sagt finns det en annan större användare av minne som är utanför: OS-filcache.

Lucene är utformad för att utnyttja det underliggande operativsystemet för att lagra data i minnesdatastrukturer. Lucensegment lagras i enskilda filer. Eftersom segment är oföränderliga ändras dessa filer aldrig. Detta gör dem mycket cache-vänliga, och det underliggande operativsystemet kommer glatt att hålla heta segment bosatta i minnet för snabbare åtkomst. Dessa segment inkluderar både det inverterade indexet (för fulltextsökning) och doc-värden (för aggregeringar). Lucenes prestanda bygger på denna interaktion med operativsystemet. Men om du ger allt tillgängligt minne till Elasticsearchs hög, kommer det inte att finnas kvar för OS-filcache. Detta kan påverka prestandan på allvar. Standardrekommendationen är att ge 50% av det tillgängliga minnet till Elasticsearch heap, samtidigt som de andra 50% är fritt. Det går inte oanvänd; Lucene kommer glatt att konsumera allt som finns kvar för filcache. Elasticsearch-högen kan konfigureras på följande sätt,

exportera ES_HEAP_SIZE = 10g

eller

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

CPU:

Elasticsearch stöder aggregeringar och filtrerade frågor. Att köra komplexa filtrerade frågor, intensiv indexering, perkolering och frågor mot index kräver tung CPU, så det är viktigt att plocka upp den rätta. Man måste förstå CPU-specifikationer och hur de beter sig med Java när frågorna körs på JVM.

Varje pool kör ett antal trådar, som kan konfigureras och har en kö. Att ändra detta rekommenderas inte om du inte har ett mycket specifikt krav eftersom Elasticsearch tilldelar kärnor dynamiskt.

Gängbassängstyper:

Elasticsearch har 3 typer av trådbassänger.

  1. Cache: Den cachade trådpoolen är en obegränsad trådpool som kommer att spaja en tråd om det finns väntande förfrågningar. Denna trådpool används för att förhindra att förfrågningar som skickas till denna pool blockeras eller avvisas. Oanvända trådar i den här trådpoolen kommer att avslutas efter att en livslängd upphör att gälla (standardvärde till fem minuter). Den cachelagrade trådpoolen är reserverad för den generiska trådpoolen.
  2. Fast: Den fasta trådpolen har en fast storlek på trådar för att hantera förfrågningarna med en kö (valfritt avgränsad) för väntande förfrågningar som inte har några trådar för att betjäna dem. Storleksparametern styr antalet trådar och är standardvärden för antalet kärnor gånger 5.
  3. Skalning: Skalningstrådens pool innehåller ett dynamiskt antal trådar. Detta nummer är proportionellt mot arbetsbelastningen och varierar mellan 1 och värdet på storleksparametern.

Elasticsearch delar upp CPU-användningen i trådpooler av olika typer:

  • generisk: för standardåtgärder som upptäckt och tråd poolpool cachas.
  • index: för index / radera operationer. Trådpooltypen är fast.
  • sökning: för räkning / sökoperationer. Trådpooltypen är fast.
  • få: för få operationer. Trådpooltypen är fast.
  • bulk: för bulkoperationer som bulkindexering. Trådpooltypen är fast. Den bästa konfigurationen av bulkdokument beror på klusterkonfiguration, detta kan identifieras genom att testa flera värden.
  • percolate: för percolation. Trådpooltypen är fast.
  • uppdatera: För uppdatering. Trådpooltypen skalas.

Ändring av en specifik trådpool kan göras genom att ställa in dess typspecifika parametrar.

Läs mer https://www.elastic.co/guide/sv/elasticsearch/reference/2.2/modules-threadpool.html#types

Skärmstorlek:

Skärven är den enhet där Elasticsearch distribuerar data inom klustret. Den hastighet med vilken Elasticsearch kan flytta skärmen runt när data balanseras, t.ex. efter ett fel beror på skärmens storlek och antal såväl som nätverks- och diskprestanda.

I Elasticsearch körs varje fråga i en enda tråd per skärv. Flera skär kan emellertid behandlas parallellt, liksom flera frågor och aggregeringar mot samma skär.

Detta innebär att den minsta frågestatensen, när ingen cache är inblandad, beror på data, typ av fråga, såväl som storleken på skärven. Fråga efter massor av små skärvor kommer att göra bearbetningen per skärv snabbare, men eftersom många fler uppgifter måste stå i kö och behandlas i följd, kommer det inte nödvändigtvis att bli snabbare än att fråga efter ett mindre antal större skärvor. Att ha massor av små skärvor kan också minska frågeställningen om det finns flera samtidiga frågor.

Varje skärv har data som måste förvaras i minnet och använder högutrymme. Detta inkluderar datastrukturer som har information på skärvnivån och även på segmentnivå för att definiera var data finns på disken. Storleken på dessa datastrukturer är inte fast och kommer att variera beroende på användningsfallet. En viktig egenskap hos det segmentrelaterade omkostnaden är dock att det inte är strikt proportionellt mot segmentets storlek. Detta innebär att större segment har mindre overhead per datavolym jämfört med mindre segment. Skillnaden kan vara betydande. Att välja rätt antal skär är komplicerat eftersom du aldrig vet hur många dokument du får innan du börjar. Att ha massor av skärvor kan vara både bra och fruktansvärt för ett kluster. Index och skärvhantering kan överbelasta huvudnoden, som kan bli svarslös, vilket kan leda till något konstigt och otäckt beteende. Tilldela dina masternoder tillräckligt med resurser för att klara klusterstorleken.

Det dåliga är att antalet skär är oändligt och det definieras när du skapar indexet. När index har skapats är det enda sättet att ändra antalet skär så att du tar bort dina index, skapa dem igen och återindex.

Replication

Elasticsearch stöder replikering, data replikeras bland datanoderna så att en nodförlust inte skulle leda till dataförlust. Som standard är replikationsfaktorn 1, men beroende på dina produktkrav kan den ökas. Ju fler kopior, desto mer katastrofbeständiga blir dina data. En annan fördel med att ha fler kopior är att varje nod har en replikskärm, vilket förbättrar frågeställningen eftersom kopior också används för frågeställningar.

Replikationsformeln som används av Elasticsearch för konsistens är,

(primär + nummer_of_replicas) / 2 + 1

Optimera allokering

Baserat på produktdata krav kan vi klassificera data i varmt och kallt. Index som öppnas oftare än andra kan tilldelas fler datanoder medan index som är mindre ofta åtkomna index kan ha mindre resurser. Denna strategi är särskilt användbar för att lagra tidsseriedata som applikationsloggar (t.ex.: ELK).

Detta kan uppnås genom att köra en cronjob som flyttar index till olika noder med jämna mellanrum.

Hot node är en typ av datanod som utför all indexering i klustret. De har också de senaste indexen eftersom dessa i allmänhet tenderar att fråga oftast. Eftersom indexering är en CPU- och IO-intensiv operation måste dessa servrar vara kraftfulla och stödjas av bifogad SSD-lagring. Vi rekommenderar att du kör minst 3 heta noder för hög tillgänglighet. Beroende på hur mycket ny information du vill samla in och fråga dock kan du mycket väl behöva öka detta antal för att uppnå dina prestationsmål.

Varm nod är typ av datanod som är utformad för att hantera en stor mängd skrivskyddsindex som inte är lika troligt att fråga ofta. Eftersom dessa index är skrivskyddade, tenderar varm nod att använda stora anslutna skivor (vanligtvis snurrskivor) istället för SSD: er. Liksom med varm nod rekommenderar vi minst 3 varm nod för hög tillgänglighet. Och som tidigare, med förbehållet att större mängder data kan kräva ytterligare noder för att uppfylla prestandakraven. Observera också att CPU- och minneskonfigurationer ofta kommer att behöva spegla de i dina heta noder. Detta kan endast bestämmas genom att testa med frågor som liknar vad du skulle uppleva i en produktionssituation.

För mer information om varm och varm nod, se här.

En annan strategi som du kan anpassa är att arkivera index till s3 och återställa när du behöver data från dessa index. Du kan läsa mer om det härifrån.

Nodtopologi:

Elasticsearch-noder kan delas in i tre kategorier masternod, datanod, klientnod.

  1. Huvudnod: Huvudnoden kan vara liten om den inte är en datanod eftersom den inte lagrar några index / skärvor. Dess ansvar är att lagra detaljerade klustertillstånd och hjälpdata och andra noder i index / skärmar metadatauppslag. Elasticsearch bör ha flera huvudnoder för att undvika splittring av hjärnproblem.
  2. Datanod: Datanoden ansvarar för att lagra / fråga faktiska indexdata.
  3. Klientnod: Klientnod används som proxy för indexering och sökning. Detta rekommenderas starkt om aggregeringar används hårt. Dessa är speciella ElasticSearch-noder som varken är data eller masterberättigade. Klientnoder är klustermedvetna och kan därför fungera som smarta belastningsbalanserare. Du kan skicka dina frågor till klientnoderna som sedan kan ta på sig den dyra uppgiften att samla svar på frågeställningsresultaten från var och en av datanoderna.

lägg till dessa inställningar i filen elasticsearch.yml för respektive noder.

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

Felsökningstips:

Elasticsearch-prestanda beror starkt på maskinen den är installerad på. CPU, Memory Use och Disk I / O är grundläggande operativsystemmätningar för varje Elasticsearch-nod. Det rekommenderas att du tittar på Java Virtual Machine (JVM) -mätvärden när CPU-användningen spikar. I följande exempel var orsaken till piggen högre avfallsuppsamlingsaktivitet.

  1. Högtryck: Högt minnetryck fungerar mot klusterprestanda på två sätt: Eftersom minnetrycket stiger till 75% och över, förblir mindre minne tillgängligt, och ditt kluster måste nu också spendera några CPU-resurser för att återta minnet genom sopor. Dessa CPU-cykler är inte tillgängliga för att hantera användarförfrågningar medan skräpuppsamling är på. Som ett resultat ökar responstiderna för användarförfrågningar när systemet blir mer och mer resursbegränsat. Om minnet trycket fortsätter att stiga och når nära 100%, används en mycket mer aggressiv form av skräpuppsamling, vilket i sin tur kommer att påverka klusterens svarstider dramatiskt. Indexens svarstider-metrisk visar att högt minnetryck leder till en betydande prestandapåverkan.
  2. Tillväxt i JVM: s icke-heapminne, äta bort minne som är avsett för sidcache och eventuellt orsakar kärnnivå OOM-skörden.
  3. Undvik delad hjärnproblem. Delad hjärna är ett scenario där klustret delas upp. Till exempel har du 6 nodkluster. 2 noder kopplas bort från klustret, men de kan fortfarande se varandra. Dessa två noder skapar sedan ett annat kluster. De väljer till och med en ny mästare. Vi har nu två kluster med samma namn, en med fyra noder och en annan med 2 noder. Var och en har en huvudnod också. Det här är vad som kallas split-brain-problem med ES-kluster. För att undvika detta, ställ in ES-parametern discovery.zen.minimum_master_nodes till halva antalet noder + 1.
  4. Eftersom Elasticsearch använder lagringsenheter kraftigt, säkerställer övervakning av skivens I / O att detta grundläggande behov uppfylls. Det finns många orsaker till I / O med reducerad disk, det anses vara en nyckelmetrik för att förutsäga många typer av problem. Det är en bra metrisk att kontrollera effektiviteten för indexering och frågautförande. Analysera läs- och skrivoperationer indikerar direkt vad systemet behöver mest i det specifika användningsfallet. Operativsysteminställningarna för disk I / O är en bas för alla andra optimeringar, avstämning av skiva I / O kan undvika potentiella problem. Om diskens I / O fortfarande inte är tillräckligt, bör motåtgärder som att optimera antalet skär och deras storlek, strypa samman, byta ut långsamma diskar, flytta till SSD eller lägga till fler noder utvärderas utifrån omständigheterna som orsakar I / O flaskhalsar.
  5. För applikationer som är beroende av sökning är användarupplevelsen starkt korrelerad med latens för sökbegäranden. Det finns många saker som kan påverka frågeställningen, till exempel konstruerade frågeställningar, felaktigt konfigurerade Elasticsearch-kluster, JVM-minne och avfallssamlingsproblem, disk IO och så vidare. Frågestatiden är det statistik som direkt påverkar användare, så se till att du lägger några varningar på det.
  6. De flesta filter i Elasticsearch är cachade som standard. Det betyder att Elasticsearch under den första exekveringen av en filtrerad fråga hittar dokument som matchar filtret och bygger en struktur som kallas "bitset" med den informationen. Data lagrade i bitsatsen innehåller en dokumentidentifierare och om ett visst dokument stämmer med filtret. Efterföljande exekveringar av frågor med samma filter kommer att återanvända informationen lagrad i bitsatsen, vilket gör att frågan körs snabbare genom att spara I / O-operationer och CPU-cykler. Att använda filtret i frågan rekommenderas. För mer information se här.
  7. Uppdateringstid och sammanslagningstid är nära relaterade till indexeringsprestanda, plus de påverkar den totala klusterprestanda. Uppdateringstiden ökar med antalet filoperationer för Lucene-indexet (skärva).
  8. Att aktivera loggning med långsam fråga hjälper dig att identifiera vilka frågor som är långsamma och vad som kan göras för att förbättra dem, särskilt användbara för jokerteckenfrågor.
  9. Öka ulimitstorleken för att tillåta maxfiler.
  10. ElasticSearch-prestanda kan drabbas när operativsystemet beslutar att byta ut oanvändt programminne. Inaktivera byte genom att ställa in OS-nivåinställningar eller ställa in följande i ElasticSearch config bootstrap.mlockall: true
  11. Inaktivera att ta bort alla index med jokerteckenfråga. För att säkerställa att någon inte utfärdar en DELETE-operation på alla index (* eller _all), ställer action.destructive_requires_name till true.

Innan du avslutar är här listan med webbadresser som är användbara för att titta på statistiken.

  • / _cluster / health? pretty: För klusterhälsaindikatorn.
  • / _status? pretty: För all information om alla index.
  • / _noder? vackert: För all information om noderna.
  • / _cat / master? pretty: För masternod.
  • / _statistik? vackert: För tilldelning av skärvor, statistik för index.
  • / _noder / statistik? vackert: För individuell nodstatistik inkluderar detta, jvm, http, io-statistik för noden.

Samling av Elasticsearch för statistik stöds av de flesta systemövervakningsverktyg som Datadog, TICK. Att använda sådana verktyg rekommenderas och att skapa tratt rekommenderas starkt för kontinuerlig övervakning av Elasticsearch.

Slutsats:

Elasticsearch är en distribuerad sök- och analysmotor i fulltext som gör det möjligt för flera hyresgäster att söka igenom hela sin datauppsättning, oavsett storlek, med enastående hastigheter. Förutom sina fulltextsökfunktioner fungerar ElasticSearch som ett analyssystem och distribuerad databas. ElasticSearch har stora standardinställningar för att komma igång. Men när du har gått förbi det första experimentfasen måste du spendera lite tid på att justera inställningarna för dina behov. Det rekommenderas att du går igenom din konfiguration senare, tillsammans med den officiella dokumentationen, för att säkerställa att ditt kluster är konfigurerat för att tillgodose dina behov.