Verwalten des Elasticsearch-Arbeitsspeichers und Beheben von Problemen

Da Elastic Cloud Lösungen wie Observability, Security und Search bereitstellt, haben wir den Nutzerkreis von Elastic Cloud über reine Betriebsteams hinaus erweitert und schließen nun auch Dateningenieure, Sicherheitsteams und Berater mit ein. Als Support-Vertreter von Elastic habe ich es genossen, mit einer Vielzahl von Nutzern und Anwendungsfällen in Kontakt zu treten.

Durch den größer gewordenen Nutzerkreis erreichen mich zunehmend Fragen zur Verwaltung der Ressourcenzuweisung, insbesondere zur Fehlerbehebung beim Zuweisungsstatus und zur Vermeidung der Auslösung von Sicherungen (Circuit Breakers). Das kann ich absolut nachvollziehen! Als ich mit Elasticsearch anfing, hatte ich die gleichen Fragen. Damals hatte ich zum ersten Mal mit dem Verwalten von Java-Heaps und Zeitreihen-Datenbank-Shards und mit der Skalierung meiner eigenen Infrastruktur zu tun.

Als ich zu Elastic kam, fand ich es großartig, dass wir neben der Dokumentation auch Blogs und Tutorials hatten, damit ich schnell einsteigen konnte. Im ersten Monat fiel es mir aber schwer, mein theoretisches Wissen und die Fehlermeldungen, die ich über meine Ticket-Queue reinbekam, vernünftig in Einklang zu bringen. Irgendwann begriff ich, wie andere Support-Engineers auch, dass viele der gemeldeten Fehler lediglich Symptome von Zuweisungsproblemen waren und dass man den Nutzer:innen mit so um die sieben Links schnell dabei helfen konnte, ihre Ressourcenzuweisung erfolgreich zu verwalten.

Aus meiner Sicht als Support-Mitarbeiter werde ich die wichtigsten Links zur Theorie des Zuweisungsmanagements durchgehen, die wir an Nutzer senden, die häufigsten Symptome aufzeigen, die wir beobachten, und erläutern, wohin wir Nutzer leiten, damit sie ihre Konfigurationen anpassen und Probleme mit der Ressourcenzuweisung beheben können.

Theorie

Als Java-Anwendung benötigt Elasticsearch eine gewisse logische Speicherzuweisung (Heap) aus dem physischen Speicher des Systems. Das sollte bis zur Hälfte des physischen RAMs sein, begrenzt bei 32 GB. Eine höhere Heap-Nutzung erfolgt meist alsReaktion auf teure Abfragen und größeren Datenspeicher. Parent Circuit Breaker liegt standardmäßig bei 95 %, aber wir empfehlen, Ressourcen zu skalieren, sobald sie konstant 85 % erreichen.

Für weitere Informationen empfehle ich Ihnen diese Überblicksartikel wärmstens:

Konfiguration

Die Standardeinstellungen von Elasticsearch passen die Größe des JVM-Heaps automatisch an die Knotenrolle und den Gesamtspeicher an. Bei Bedarf können Sie die Größe jedoch auf drei Arten direkt konfigurieren:

1. Direkt in Ihrer Konfigurationsdatei > jvm.options Ihrer lokalen Elasticsearch-Dateien:

## JVM configuration

################################################################
## IMPORTANT: JVM heap size
################################################################

…

# Xms represents the initial size of total heap space
# Xmx represents the maximum size of total heap space

-Xms4g
-Xmx4g

2. Als Elasticsearch-Umgebungsvariable in der Docker-Compose-Datei:

version: '2.2'
services:
  es01:
	image: docker.elastic.co/elasticsearch/elasticsearch:7.12.0
	environment:
  	- node.name=es01
  	- cluster.name=es
  	- bootstrap.memory_lock=true
  	- "ES_JAVA_OPTS=-Xms4g -Xmx4g"
  	- discovery.type=single-node
	ulimits:
  	memlock:
    	soft: -1
    	hard: -1
	ports:
  	- 9200:9200

3. Über unsere Elastic Cloud Hosted > Deployment > Edit view. Hinweis: Das Dropdown-Menü weist physischen Speicher zu, und ungefähr die Hälfte wird dem Heap zugewiesen.

Elasticsearch Hot Data- und Content-Tier

Beseitigen von Problemen

Wenn Sie derzeit Probleme mit der Performance Ihres Clusters haben, liegt es wahrscheinlich an den üblichen Verdächtigen:

  • Konfigurationsprobleme: Unterdimensionierte Master-Knoten, keine ILM-Richtlinie
  • Volumen induziert: Hohe Anfragegeschwindigkeit/-last, überlappende teure Abfragen/Schreibvorgänge
Alle nachfolgenden cURL/API-Anfragen können in der Elastic Cloud Hosted > Elasticsearch API Console, als cURL an die Elasticsearch API, oder unter Kibana > Dev Tools.

Zuweisungszustand

Datenindizes werden in Subshards gespeichert, die den Heap-Speicher für Wartungsarbeiten und Such-/Schreibvorgänge nutzen. Die Shard-Größe sollte 50 GB nicht überschreiten. Nehmen wir das obige Beispiel von Elastic Cloud Hosted mit 8 GB physischem Speicher verteilt auf zwei Zonen (wodurch insgesamt zwei Knoten zugewiesen werden), und verbinden wir dies mit einem Beispiel:  _cat/allocation.

GET /_cat/allocation?v=true&h=shards,node
shards node
    41 instance-0000000001
    41 instance-0000000000
GET /_cluster/health?filter_path=status,*_shards

{
  "status": "green",
  "unassigned_shards": 0,
  "initializing_shards": 0,
  "active_primary_shards": 41,
  "relocating_shards": 0,
  "active_shards": 82,
  "delayed_unassigned_shards": 0
}

Wenn Shards einen Wert > 0 außerhalb von active_shards oder active_primary_shards melden, haben Sie eine Ursache für Performance-Probleme ausgemacht.

Wenn hier ein Problem gemeldet wird, lautet die Meldung meist unassigned_shards > 0. Handelt es sich bei diesen Shards um primäre Shards, meldet Ihr Cluster denStatus „rot“, handelt es sich hingegen nur um Replikate, meldet er den Status „gelb“. (Daher ist die Festlegung von Replikaten für Indizes wichtig – so kann der Cluster bei einem Problem wiederhergestellt werden, anstatt Datenverlust zu erleiden.) Nehmen wir an, wir haben denStatus „gelb“ mit einem einzelnen nicht zugewiesenen Shard. Zur Untersuchung würden wir mit _cat/shards prüfen, welcher Index-Shard Probleme verursacht.

GET _cat/shards?v=true&s=state
index                                 	shard prirep state    	docs   store ip       	node
logs                                  	0 	p  	STARTED     	2  10.1kb 10.42.255.40 instance-0000000001
logs                                  	0 	r  	UNASSIGNED
kibana_sample_data_logs               	0 	p  	STARTED 	14074  10.6mb 10.42.255.40 instance-0000000001
.kibana_1                             	0 	p  	STARTED  	2261   3.8mb 10.42.255.40 instance-0000000001

Dies betrifft also unsere Nicht-System-Indexprotokolle, die einen nicht zugewiesenen Replikat-Shard haben. Sehen wir uns an, was die Probleme verursacht, indem wir _cluster/allocation/explain ausführen. (Profi-Tipp: Genau so gehen wir vor, wenn wir uns anden Support wenden.)

GET _cluster/allocation/explain?pretty&filter_path=index,node_allocation_decisions.node_name,node_allocation_decisions.deciders.*

{ "index": "logs",
  "node_allocation_decisions": [{
      "node_name": "instance-0000000005",
      "deciders": [{
          "decider": "data_tier",
          "decision": "NO",
          "explanation": "node does not match any index setting [index.routing.allocation.include._tier] tier filters [data_hot]"
}]}]}

Diese Fehlermeldung verweist auf data_hot, das Teil einer Verwaltung des Indexlebenszyklus (ILM)-Richtlinie ist und darauf hinweist, dass unsere ILM-Richtlinie mit unseren aktuellen Indexeinstellungen nicht übereinstimmt. In diesem Fall liegt die Ursache dieses Fehlers darin, dass eine heiß-warm-ILM-Richtlinie eingerichtet wurde, ohne dass bestimmte heiß-warm-Knoten vorhanden sind. (Ich musste garantieren, dass etwas fehlschlägt, daher zeige ich hier absichtlich Fehlerbeispiele. Weitere Informationen finden Sie in diesem Beispiel-Fehlerbehebungsvideo zur Lösung.)

Wenn Sie diesen Befehl ausführen, obwohl keine nicht zugewiesenen Shards vorhanden sind, erhalten Sie einen 400-Fehler mit der Meldung keine unzugewiesenen Shards gefunden, die erklärt werden können, da nichts zu berichten ist.Wenn eine nicht-logische Ursache vorliegt (z. B. ein temporärer Netzwerkfehler wie Node hat Cluster während der Zuteilung verlassen), können Sie das praktische _cluster/reroute von Elastic verwenden.

POST /_cluster/reroute

Diese Anfrage ohne Anpassungen startet einen asynchronen Hintergrundprozess, der versucht, alle aktuellen state:UNASSIGNED Shards zuzuweisen. (Seien Sie nicht wie ich und warten Sie, bis der Vorgang abgeschlossen ist, bevor Sie den Entwickler kontaktieren, denn ich dachte, es würde sofort passieren und zufällig eskalieren, gerade rechtzeitig, damit sie sagen können, dass nichts mehr falsch ist.) Weitere Informationen finden Sie in diesem Fehlerbehebungsvideo zur Überwachung des Zuteilungsstatus.

Sicherungen

Wenn Sie Ihre Heap-Zuweisung ausschöpfen, kann dies dazu führen, dass Anfragen an Ihren Cluster zu einer Zeitüberschreitung oder einem Fehler führen und dass Ihr Cluster häufig mit Fehlern durch Circuit Breaker zu tun hat. Fehler durch Circuit Breaker verursachen elasticsearch.log-Ereignisse wie:

Caused by: org.elasticsearch.common.breaker.CircuitBreakingException: [parent] Data too large, data for [<transport_request>] would be [num/numGB], which is larger than the limit of [num/numGB], usages [request=0/0b, fielddata=num/numKB, in_flight_requests=num/numGB, accounting=num/numGB]

Um dies zu untersuchen, sehen Sie sich Ihren heap.percent an, entweder durch Aufrufen von _cat/nodes:

GET /_cat/nodes?v=true&h=name,node*,heap*
# heap = JVM (logical memory reserved for heap)
# ram  = physical memory

name                                node.role heap.current heap.percent heap.max
tiebreaker-0000000002 mv             119.8mb           23    508mb
instance-0000000001   himrst           1.8gb           48    3.9gb
instance-0000000000   himrst           2.8gb           73    3.9gb

Oder falls Sie es zuvor aktiviert haben, navigieren Sie zu Kibana > Stack Monitoring.

Elasticsearch-Knoten

Wenn Sie sich vergewissert haben, dass die für die Arbeitsspeicher-Sicherungen festgelegten Werte erreicht wurden, sollten Sie darüber nachdenken, die Größe Ihres Heaps vorübergehend zu erhöhen, um sich eine Atempause für Ihre Untersuchungen zu verschaffen. Bei der Untersuchung der Ursache sollten Sie Ihre Audit-Logging, Slow-Logging, Cluster-Logs oder die elasticsearch.log auf die vorangegangenen aufeinanderfolgenden Ereignisse durchsuchen. Sie suchen nach:

  • aufwändigen Abfragen, insbesondere:
    • Aggregationen mit hohen Bucket-Zahlen
      • Ich kam mir so dumm vor, als mir dämmerte, dass Suchen vorübergehend einen bestimmten Teil des Heaps zuweisen,bevor sie die Abfrage auf der Grundlage der Suchgröße oder der Bucket-Dimensionen ausführen, sodass eine Einstellung von 10.000.000 meinem Ops-Team wirklich Kopfzerbrechen bereitet hat.
    • nicht-optimierte Mappings
      • Außerdem kam ich mir dumm vor, weil ich dachte, dass es beim hierarchischen Reporting einfacher wäre zu suchen, als wenn die Daten alle „geflattet“ wären (ist es nicht!).
  • Volumen/Tempo der Anfrage: Normalerweise Batch- oder asynchrone Abfragen

Zeit zu skalieren

Wenn das nicht das erste Mal ist, dass Sie Sicherungen (Circuit Breakers) auslösen, oder wenn Sie vermuten, dass dies zu einem dauerhaften Problem wird (z. B. bei einer konstanten Auslastung von 85 %, was bedeutet, dass es an der Zeit ist, die Ressourcen zu skalieren),sollten Sie sich den JVM-Arbeitsspeicherdruck als langfristigen Heap-Indikator genaueransehen. Sie können dies unter Elastic Cloud Hosted > Deployment überprüfen.

Elasticsearch-Instanzen

Oder Sie können es aus _nodes/stats:

GET /_nodes/stats?filter_path=nodes.*.jvm.mem.pools.old

{"nodes": { "node_id": { "jvm": { "mem": { "pools": { "old": {
  "max_in_bytes": 532676608,
  "peak_max_in_bytes": 532676608,
  "peak_used_in_bytes": 104465408,
  "used_in_bytes": 104465408
}}}}}}}

Wo:

JVM Memory Pressure = used_in_bytes / max_in_bytes

Ein mögliches Symptom dafür ist eine hohe Frequenz und lange Dauer von Garbage-Collector-Ereignissen (gc-Ereignissen) in elasticsearch.log:

[timestamp_short_interval_from_last][INFO ][o.e.m.j.JvmGcMonitorService] [node_id] [gc][number] overhead, spent [21s] collecting in the last [40s]

Wenn sich dies bestätigt, müssen Sie entweder die Skalierung Ihres Clusters oder die Verringerung der Anforderungen an den Cluster in Betracht ziehen. Dabei sollten Sie Folgendes untersuchen/erwägen:

Wir stehen Ihnen gern zur Seite

Nach dem, was ich beim Elastic Support so erlebe, ist das die Liste der häufigsten Nutzertickets: nicht zugewiesene Shards, ein unausgewogenes Shard-Heap-Verhältnis, Auslösen von Sicherungen, hohe Garbage-Collection-Aktivität und Zuweisungsfehler. All diese Probleme sind Symptome einer mangelnden Verwaltung der Zuweisung von Kernressurcen. Ich hoffe, Sie haben jetzt die notwendigen theoretischen Kenntnisse und wissen auch, was Sie tun müssen, um diese Probleme zu lösen.

Sollten Sie dennoch an einer Stelle nicht weiterkommen, können Sie sich gern an uns wenden. Wir helfen Ihnen gern! Kontaktieren Sie uns: 

Ein Hoch auf unsere Fähigkeit, die Ressourcenzuweisung von Elastic Stack als Nicht-Ops selbst zu verwalten (liebe Ops-Leute, das geht nicht gegen euch)!

Ursprünglich veröffentlicht am 27. April 2021; aktualisiert am 5. November 2024.

Die Entscheidung über die Veröffentlichung der in diesem Blogeintrag beschriebenen Leistungsmerkmale und Features sowie deren Zeitpunkt liegt allein bei Elastic. Es ist möglich, dass noch nicht verfügbare Leistungsmerkmale oder Features nicht rechtzeitig oder überhaupt nicht veröffentlicht werden.