Elasticsearch in Production - Best Practices voor implementatie

Elasticsearch is een zeer geoptimaliseerde zoekmachine voor moderne data-analyse.

Elasticsearch is een geweldige realtime zoekmachine en analyse-engine. Het is gebouwd op Apache Lucene. Het is gedistribueerd, RESTful, eenvoudig te gebruiken en zeer beschikbaar. Elasticsearch use cases omvatten het aandrijven van de zoekactie, transactiebewaking en foutdetectie, inhouddetectie, loganalyse, fuzzy search, aggregatie van gebeurtenisgegevens, gegevensvisualisatie. Elasticsearch en de rest van de Elastic Stack hebben bewezen extreem veelzijdig te zijn, en zoals u hierboven kunt zien, zijn er meerdere manieren om Elasticsearch te integreren in wat uw product vandaag levert en er extra inzicht aan toe te voegen.

We gebruiken het veel voor zoeken en analyseren bij Botmetric, we indexeren ongeveer een miljard documenten per dag en we gebruiken zeer complexe aggregaties voor datavisualisatie in realtime.

Dat gezegd hebbende, het opstarten van een applicatie versus het uitvoeren ervan in productie en onderhoud zijn totaal verschillend. Dit artikel behandelt veel van deze factoren uit ervaringen uit het echte leven en zijn de basisvoorwerpen die u moet overwegen om Elasticsearch in productie te gebruiken.

Geheugen:

Elasticsearch en Lucene zijn geschreven in Java, wat betekent dat je moet uitkijken voor de heapspace- en JVM-statistieken. Hoe meer heap beschikbaar is voor Elasticsearch, hoe meer geheugen het kan gebruiken voor filter en andere caching om de queryprestaties te verbeteren. Maar houd er rekening mee dat te veel hoop u kan onderwerpen aan lange pauzes voor het ophalen van afval. Stel Xmx niet in boven de grenswaarde die de JVM gebruikt voor gecomprimeerde objectaanwijzers (gecomprimeerde oeps); de exacte cutoff varieert maar is bijna 32 GB.

Een veel voorkomend probleem is het configureren van een te grote heap. U hebt een 64 GB-machine - en door golly wilt u Elasticsearch alle 64 GB geheugen geven. Meer is beter! Heap is absoluut belangrijk voor Elasticsearch. Het wordt gebruikt door veel datastructuren in het geheugen voor een snelle werking. Maar dat gezegd hebbende, er is nog een andere belangrijke gebruiker van geheugen die uit de lucht is: OS-bestandscache.

Lucene is ontworpen om het onderliggende besturingssysteem te gebruiken voor het opslaan van datastructuren in het geheugen. Lucene-segmenten worden opgeslagen in afzonderlijke bestanden. Omdat segmenten onveranderlijk zijn, veranderen deze bestanden nooit. Dit maakt ze zeer cachevriendelijk en het onderliggende besturingssysteem zal graag warme segmenten in het geheugen houden voor snellere toegang. Deze segmenten omvatten zowel de geïnverteerde index (voor zoeken in volledige tekst) als doc-waarden (voor aggregaties). De prestaties van Lucene zijn afhankelijk van deze interactie met het besturingssysteem. Maar als je al het beschikbare geheugen aan de hoop van Elasticsearch geeft, blijft er niets over voor OS-bestandscache. Dit kan de prestaties ernstig beïnvloeden. De standaard aanbeveling is om 50% van het beschikbare geheugen aan Elasticsearch te geven, terwijl de andere 50% vrij blijft. Het zal niet ongebruikt blijven; Lucene verbruikt graag wat overblijft voor bestandscache. Elasticsearch heap kan op de volgende manieren worden geconfigureerd,

export ES_HEAP_SIZE = 10g

of

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

CPU:

Elasticsearch ondersteunt aggregaties en gefilterde zoekopdrachten. Het uitvoeren van complexe gefilterde query's, intensieve indexering, percolatie en query's tegen indices vereist een zware CPU, dus het oppakken van de juiste is van cruciaal belang. Men moet de CPU-specificaties begrijpen en hoe ze zich gedragen met Java terwijl de vragen op JVM worden uitgevoerd.

Elke pool heeft een aantal threads, die kunnen worden geconfigureerd, en heeft een wachtrij. Wijziging hiervan wordt niet aanbevolen, tenzij u een zeer specifieke vereiste hebt, omdat Elasticsearch de toewijzing van kernen dynamisch uitvoert.

Thread pool types:

Elasticsearch heeft 3 soorten draadpools.

  1. In cache: de threadpool in de cache is een niet-gebonden threadpool die een thread zal spawnen als er openstaande aanvragen zijn. Deze thread-pool wordt gebruikt om te voorkomen dat aanvragen die bij deze pool worden ingediend, worden geblokkeerd of afgewezen. Ongebruikte threads in deze thread-pool worden beëindigd nadat een keepleven is verlopen (standaardinstelling is vijf minuten). De threadpool in de cache is gereserveerd voor de generieke threadpool.
  2. Opgelost: de pool met vaste threads heeft een vaste grootte van threads om de aanvragen af ​​te handelen met een wachtrij (optioneel begrensd) voor in behandeling zijnde aanvragen die geen threads hebben om ze te bedienen. De parameter size bepaalt het aantal threads en is standaard ingesteld op het aantal cores maal 5.
  3. Schalen: de pool met schalingsdraden bevat een dynamisch aantal threads. Dit aantal is evenredig met de werklast en varieert tussen 1 en de waarde van de parameter size.

Elasticsearch verdeelt het CPU-gebruik in verschillende soorten threads:

  • generiek: voor standaardbewerkingen zoals detectie en het type threadpool wordt in de cache opgeslagen.
  • index: voor index / wisbewerkingen. Type schroefdraadpool is vast.
  • zoeken: voor tel- / zoekbewerkingen. Type schroefdraadpool is vast.
  • get: voor bewerkingen. Type schroefdraadpool is vast.
  • bulk: voor bulkoperaties zoals bulkindexering. Type schroefdraadpool is vast. De beste configuratie van bulkdocumenten is afhankelijk van de clusterconfiguratie, dit kan worden geïdentificeerd door meerdere waarden uit te proberen.
  • percolaat: voor percolatie. Type schroefdraadpool is vast.
  • vernieuwen: voor vernieuwingsbewerkingen. Het type schroefdraadpool is aan het schalen.

U kunt een specifieke thread-pool wijzigen door de typespecifieke parameters in te stellen.

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

Scherf grootte:

De scherf is de eenheid waarop Elasticsearch gegevens binnen het cluster distribueert. De snelheid waarmee Elasticsearch scherven kan verplaatsen bij het opnieuw in evenwicht brengen van gegevens, b.v. na een storing, hangt af van de grootte en het aantal shards, evenals de netwerk- en schijfprestaties.

In Elasticsearch wordt elke query uitgevoerd in een enkele thread per scherf. Meerdere shards kunnen echter parallel worden verwerkt, net als meerdere query's en aggregaties tegen dezelfde shard.

Dit betekent dat de minimale latentie voor zoekopdrachten, wanneer er geen caching bij betrokken is, afhankelijk is van de gegevens, het type zoekopdracht en de grootte van de scherf. Door veel kleine shards te bevragen, wordt de verwerking per shard sneller, maar omdat er veel meer taken in de wachtrij moeten worden geplaatst en in volgorde moeten worden verwerkt, is het niet noodzakelijk sneller dan een kleiner aantal grotere shards. Het hebben van veel kleine shards kan ook de doorvoer van zoekopdrachten verminderen als er meerdere gelijktijdige zoekopdrachten zijn.

Elke scherf bevat gegevens die in het geheugen moeten worden bewaard en gebruikt heapruimte. Dit omvat gegevensstructuren die informatie op shard-niveau en ook op segmentniveau bevatten om te bepalen waar gegevens zich op schijf bevinden. De grootte van deze gegevensstructuren staat niet vast en zal variëren afhankelijk van het gebruik. Een belangrijk kenmerk van de segmentgerelateerde overhead is echter dat deze niet strikt evenredig is met de grootte van het segment. Dit betekent dat grotere segmenten minder gegevens per datavolume hebben in vergelijking met kleinere segmenten. Het verschil kan aanzienlijk zijn. Het juiste aantal scherven kiezen is ingewikkeld omdat je nooit weet hoeveel documenten je krijgt voordat je begint. Het hebben van veel scherven kan zowel goed als verschrikkelijk zijn voor een cluster. Beheer van indices en scherven kan het hoofdknooppunt overbelasten, wat mogelijk niet meer reageert, wat tot een vreemd en smerig gedrag kan leiden. Wijs uw hoofdknooppunten voldoende bronnen toe om de clustergrootte aan te kunnen.

Het slechte is dat het aantal scherven onveranderlijk is en wordt bepaald wanneer u de index maakt. Nadat de index is gemaakt, is de enige manier om het aantal scherven te wijzigen, uw indices te verwijderen, opnieuw te maken en opnieuw te indexeren.

kopiëren

Elasticsearch ondersteunt replicatie, gegevens worden gerepliceerd tussen de gegevensknooppunten, zodat een knooppuntverlies niet tot gegevensverlies zou leiden. Standaard is de replicatiefactor 1, maar afhankelijk van uw productvereisten kan deze worden verhoogd. Hoe meer replica's, des te beter zijn uw gegevens bestand tegen rampen. Een ander voordeel van meer replica's is dat elk knooppunt een replicaschard bevat, wat de queryprestaties verbetert, omdat replica's ook worden gebruikt voor query's.

De replicatieformule die Elasticsearch gebruikt voor consistentie is,

(primair + aantal_replica's) / 2 + 1

Toewijzing optimaliseren

Op basis van productgegevensvereisten kunnen we gegevens classificeren in warm en koud. Aan indices die vaker worden gebruikt dan aan andere, kunnen meer gegevensknooppunten worden toegewezen, terwijl aan indices die minder vaak worden gebruikt, minder resources kunnen worden toegewezen. Deze strategie is vooral handig voor het opslaan van tijdreeksgegevens zoals applicatielogboeken (bijvoorbeeld: ELK).

Dit kan worden bereikt door een cronjob uit te voeren die de indices met regelmatige tussenpozen naar verschillende knooppunten verplaatst.

Hot node is een type dataknooppunt dat alle indexering binnen het cluster uitvoert. Ze hebben ook de meest recente indices, omdat deze meestal het meest worden opgevraagd. Aangezien indexeren een CPU- en IO-intensieve bewerking is, moeten deze servers krachtig zijn en worden ondersteund door bijgevoegde SSD-opslag. We raden aan om minimaal 3 Hot nodes te gebruiken voor hoge beschikbaarheid. Afhankelijk van de hoeveelheid recente gegevens die u wilt verzamelen en opvragen, moet u dit aantal wellicht verhogen om uw prestatiedoelen te bereiken.

Warm knooppunt is een type gegevensknooppunt dat is ontworpen om een ​​grote hoeveelheid alleen-lezen indices af te handelen die niet zo vaak worden opgevraagd. Omdat deze indices alleen-lezen zijn, hebben warme knooppunten de neiging om grote gekoppelde schijven (meestal draaiende schijven) te gebruiken in plaats van SSD's. Net als bij hot node raden we een minimum van 3 Warm node aan voor hoge beschikbaarheid. En zoals eerder, met het voorbehoud dat grotere hoeveelheden gegevens mogelijk extra knooppunten nodig hebben om aan de prestatie-eisen te voldoen. Merk ook op dat CPU- en geheugenconfiguraties vaak die van uw hot nodes moeten spiegelen. Dit kan alleen worden vastgesteld door te testen met zoekopdrachten die vergelijkbaar zijn met wat u zou ervaren in een productiesituatie.

Raadpleeg hier voor meer informatie over warme en warme knooppunten.

Een andere strategie die u kunt aanpassen, is het archiveren van de indices naar s3 en herstellen wanneer u gegevens van die indices nodig hebt. U kunt hier meer over lezen.

Knooppunttopologie:

Elasticsearch-knooppunten kunnen worden onderverdeeld in drie categorieën hoofdknooppunt, gegevensknooppunt, clientknooppunt.

  1. Hoofdknooppunt: Het hoofdknooppunt kan klein zijn als het ook geen gegevensknooppunt is, omdat er geen indices / scherven worden opgeslagen. Zijn verantwoordelijkheid is de gedetailleerde clusterstatus opslaan en gegevens en andere knooppunten helpen bij het opzoeken van indices / scherven metagegevens. Elasticsearch moet meerdere hoofdknooppunten hebben om een ​​gesplitst hersenprobleem te voorkomen.
  2. Dataknooppunt: Dataknooppunt is verantwoordelijk voor het opslaan / opvragen van de feitelijke indexgegevens.
  3. Cliëntknooppunt: Cliëntknooppunt wordt gebruikt als een proxy voor indexering en zoeken. Dit wordt sterk aanbevolen als aggregaties intensief worden gebruikt. Dit zijn speciale ElasticSearch-knooppunten die niet geschikt zijn voor gegevens of master. Cliëntknooppunten zijn clusterbewust en kunnen daarom fungeren als slimme load balancers. U kunt uw vragen naar de klantknooppunten verzenden, die vervolgens de dure taak op zich kunnen nemen om antwoorden te verzamelen op de queryresultaten van elk van de gegevensknooppunten.

voeg deze instellingen toe aan het bestand elastischesearch.yml voor respectieve knooppunten.

Hoofdknooppunt: node.master: true node.data:false
Dataknooppunt: node.master: false node.data:true
Client-knooppunt: node.master: false node.data:false

Tips voor het oplossen van problemen:

De prestaties van Elasticsearch zijn sterk afhankelijk van de machine waarop deze is geïnstalleerd. CPU, geheugengebruik en schijf-I / O zijn basisstatistieken van het besturingssysteem voor elk Elasticsearch-knooppunt. Het wordt aanbevolen dat u de Java Virtual Machine (JVM) -statistieken bekijkt wanneer het CPU-gebruik pieken vertoont. In het volgende voorbeeld was de reden voor de piek hogere activiteit voor het ophalen van afval.

  1. Hoopdruk: Hoge geheugendruk werkt op twee manieren tegen de clusterprestaties: aangezien de geheugendruk toeneemt tot 75% en hoger, blijft er minder geheugen beschikbaar en moet uw cluster nu ook wat CPU-middelen uitgeven om geheugen terug te winnen via garbage collection. Deze CPU-cycli zijn niet beschikbaar voor het verwerken van gebruikersverzoeken terwijl het ophalen van afval is ingeschakeld. Als gevolg hiervan nemen de responstijden voor gebruikersverzoeken toe naarmate het systeem steeds meer middelen beperkt. Als de geheugendruk blijft stijgen en bijna 100% bereikt, wordt een veel agressievere vorm van afvalinzameling gebruikt, die op zijn beurt de reactietijd van de cluster dramatisch zal beïnvloeden. Index Response Times metriek laat zien dat hoge geheugendruk leidt tot een aanzienlijke impact op de prestaties.
  2. Groei in het niet-heap-geheugen van de JVM, geheugen wegnemen dat bedoeld is voor paginacache en mogelijk OOM-oogst op kernelniveau veroorzaakt.
  3. Vermijd gespleten hersenprobleem. Gespleten hersenen zijn een scenario waarbij het cluster uit elkaar gaat. U hebt bijvoorbeeld een cluster met 6 knooppunten. 2 knooppunten ontkoppelen van het cluster, maar ze kunnen elkaar nog steeds zien. Deze 2 knooppunten maken vervolgens een ander cluster. Ze zullen zelfs een nieuwe meester onder elkaar kiezen. We hebben nu twee clusters met dezelfde naam, een met 4 knooppunten en een andere met 2 knooppunten. Elk heeft ook een hoofdknooppunt. Dit wordt split-brain-probleem met ES-clusters genoemd. Om dit te voorkomen, stelt u de ES-parameter discovery.zen.minimum_master_nodes in op de helft van het aantal knooppunten + 1.
  4. Aangezien Elasticsearch zwaar gebruik maakt van opslagapparaten, zorgt monitoring van de schijf-I / O ervoor dat aan deze basisbehoefte wordt voldaan. Er zijn veel redenen voor verminderde schijf-I / O, het wordt beschouwd als een belangrijke maatstaf voor het voorspellen van vele soorten problemen. Het is een goede statistiek om de effectiviteit van indexering en queryprestaties te controleren. Analyse van lees- en schrijfbewerkingen geeft direct aan wat het systeem het meest nodig heeft in de specifieke use case. De instellingen van het besturingssysteem voor schijf-I / O vormen een basis voor alle andere optimalisaties, het afstemmen van schijf-I / O kan mogelijke problemen voorkomen. Als de schijf-I / O nog steeds niet voldoende is, moeten tegenmaatregelen zoals het optimaliseren van het aantal scherven en hun grootte, het smoren van samenvoegingen, het vervangen van langzame schijven, het verplaatsen naar SSD's of het toevoegen van meer knooppunten worden geëvalueerd op basis van de omstandigheden die de I / O veroorzaken knelpunten.
  5. Voor de applicaties die afhankelijk zijn van zoeken, is de gebruikerservaring sterk gecorreleerd met de latentie van zoekopdrachten. Er zijn veel dingen die de prestaties van de query kunnen beïnvloeden, zoals geconstrueerde query's, onjuist geconfigureerde Elasticsearch-cluster, problemen met JVM-geheugen en vuilnisophaling, schijf-IO, enzovoort. Zoekopdrachtlatentie is de statistiek die rechtstreeks van invloed is op gebruikers, dus zorg ervoor dat u er enkele waarschuwingen op zet.
  6. De meeste filters in Elasticsearch worden standaard in het cachegeheugen bewaard. Dat betekent dat tijdens de eerste uitvoering van een gefilterde query, Elasticsearch documenten vindt die overeenkomen met het filter en een structuur opbouwen die "bitset" wordt genoemd met behulp van die informatie. Gegevens die zijn opgeslagen in de bitset bevatten een document-ID en of een bepaald document overeenkomt met het filter. Latere uitvoeringen van query's met hetzelfde filter zullen de informatie die is opgeslagen in de bitset hergebruiken, waardoor het uitvoeren van query's sneller wordt door I / O-bewerkingen en CPU-cycli op te slaan. Het gebruik van het filter in query wordt aanbevolen. Zie hier voor meer informatie.
  7. Vernieuwingstijd en samenvoegtijd hangen nauw samen met de indexeringsprestaties, en ze beïnvloeden de algehele clusterprestaties. Vernieuwingsduur neemt toe met het aantal bestandsbewerkingen voor de Lucene-index (scherf).
  8. Als u trage logboekregistratie van zoekopdrachten inschakelt, kunt u bepalen welke query's traag zijn en wat u kunt doen om deze te verbeteren, vooral handig voor jokertekens.
  9. Vergroot de ulimit-grootte om max. Bestanden toe te staan.
  10. De prestaties van ElasticSearch kunnen nadelig zijn wanneer het besturingssysteem besluit ongebruikt toepassingsgeheugen uit te wisselen. Schakel swapping uit door OS-niveau-instellingen in te stellen of stel het volgende in in ElasticSearch config bootstrap.mlockall: true
  11. Schakel het verwijderen van alle indices uit met een jokertekenquery. Om ervoor te zorgen dat iemand niet een DELETE-bewerking op alle indexen (* of _all) uitvoert, stelt u action.destructive_requires_name in op true.

Voordat u eindigt, is hier de lijst met URL's die handig zijn voor het bekijken van de statistieken.

  • / _cluster / health? pretty: voor de clusterstatusindicator.
  • / _status? pretty: voor alle informatie over alle indices.
  • / _nodes? pretty: voor alle informatie over de nodes.
  • / _cat / master? pretty: voor hoofdknooppunt.
  • / _stats? pretty: voor shard-toewijzing, indicesstatistieken.
  • / _nodes / stats? pretty: voor afzonderlijke knooppuntstatistieken omvat dit jvm, http, io-statistieken voor het knooppunt.

Aggregatie van statistieken van Elasticsearch wordt ondersteund door de meeste systeembewakingsprogramma's zoals Datadog, TICK. Het gebruik van dergelijke tools wordt aanbevolen en het maken van een trechter wordt sterk aanbevolen voor het continu bewaken van Elasticsearch.

Gevolgtrekking:

Elasticsearch is een gedistribueerde full-text zoek- en analyse-engine, waarmee meerdere huurders met ongekende snelheden hun volledige datasets kunnen doorzoeken, ongeacht de grootte. Naast de volledige tekstzoekmogelijkheden, fungeert ElasticSearch ook als een analysesysteem en gedistribueerde database. ElasticSearch heeft geweldige standaardwaarden om te beginnen. Maar eenmaal voorbij de eerste experimenteerfase moet je wat tijd besteden om de instellingen aan je behoeften aan te passen. Het wordt aanbevolen om uw configuratie later, samen met de officiële documentatie, opnieuw te bezoeken om ervoor te zorgen dat uw cluster is geconfigureerd om aan uw behoeften te voldoen.