Wie behebe ich eine Circuit-Breaker-Ausnahme in Amazon OpenSearch Service?

Letzte Aktualisierung: 01.09.2021

Ich versuche, Daten an meinen Amazon-OpenSearch-Service-Cluster (Nachfolger von Amazon Elasticsearch Service) zu senden. Ich erhalte jedoch einen Ausnahmefehler, der besagt, dass meine Daten zu groß sind. Was ist der Grund dafür und wie löse ich das Problem?

Kurzbeschreibung

Wenn eine Anfrage die OpenSearch-Service-Knoten erreicht, schätzen Circuit Breakers die Menge an Speicher, die zum Laden der erforderlichen Daten benötigt wird. OpenSearch Service vergleicht dann die geschätzte Größe mit der konfigurierten Heap-Größenbeschränkung. Wenn die geschätzte Größe Ihrer Daten größer als die verfügbare Heap-Größe ist, wird die Abfrage beendet. Infolgedessen wird eine CircuitBreakerException ausgelöst, um eine Überlastung des Knotens zu verhindern.

OpenSearch Service verwendet die folgenden Circuit Breakers, um JVM OutofMemoryError-Ausnahmen zu verhindern:

  • Request
  • Fielddata
  • In-Flight-Anfragen
  • Accounting
  • Parent

Hinweis: Es ist wichtig zu wissen, welcher dieser fünf Circuit Breakers die Ausnahme ausgelöst hat, da jeder Circuit Breaker seine eigenen Optimierungsanforderungen hat. Weitere Informationen zu Circuit-Breaker-Typen finden Sie unter Circuit-Breaker-Einstellungen auf der Elasticsearch-Website.

Verwenden Sie den folgenden Befehl, um die aktuelle Speichernutzung pro Knoten und Circuit Breaker zu ermitteln:

GET _nodes/stats/breaker

Beachten Sie auch, dass Circuit Breaker kein perfekter Mechanismus sind. Zwar bieten Circuit Breaker eine gewisse Ausfallsicherheit gegen Überlastung eines Knotens, jedoch kann es immer noch zu einem OutOfMemoryError kommen. Circuit Breaker können den Speicher nur überwachen, wenn er explizit reserviert ist. Daher ist es nicht immer möglich, die genaue Speichernutzung im Voraus abzuschätzen. Wenn Sie beispielsweise über einen kleinen Speicherheap verfügen, ist der relative Overhead des nicht verfolgten Speichers größer. Weitere Informationen zu Circuit Breakers und zur Ausfallsicherheit von Knoten finden Sie auf der Elasticsearch-Website unter Verbesserung der Ausfallsicherheit von Knoten mit dem Real-Memory-Circuit-Breaker.

Um eine Überlastung Ihrer Datenknoten zu vermeiden, befolgen Sie die Tipps im Abschnitt Fehlerbehebung bei hohem JVM-Speicherdruck.

Auflösung

Circuit-Breaker-Ausnahme

Wenn Sie Elasticsearch Version 7.x und höher mit 16 GB Heap verwenden, wird die folgende Fehlermeldung angezeigt, wenn das Circuit-Breaker-Limit erreicht ist:

"error": {
        "root_cause": [
            {
                "type": "circuit_breaking_exception",
                "reason": "[parent] Data too large, data for [<http_request>] would be [16355096754/15.2gb], which is larger than the limit of [16213167308/15gb], real usage: [15283269136/14.2gb], new bytes reserved: [1071827618/1022.1mb]",
               }
      ]
}

Diese Beispielausgabe zeigt an, dass die zu verarbeitenden Daten für den übergeordneten Circuit Breaker zu groß sind. Der Circuit Breaker „parent“ (ein Circuit-Breaker-Typ) ist für die Gesamtspeicherauslastung Ihres Clusters verantwortlich. Wenn eine Ausnahme für einen Parent-Circuit-Breaker auftritt, hat der Gesamtspeicher, der für alle Circuit Breaker verwendet wird, das eingestellte Limit überschritten. Ein übergeordneter Circuit Breaker löst eine Ausnahme aus, wenn der Cluster 95 % von 16 GB überschreitet, was 15,2 GB Heap entspricht.

Sie können diese Logik überprüfen, indem Sie den Unterschied zwischen Speicherauslastung und eingestelltem Circuit Breaker-Limit berechnen. Verwenden Sie die Werte aus unserer Beispielausgabe und subtrahieren Sie „real usage: [15283269136/14.2gb]“ von „limit of [16213167308/15gb]“. Diese Berechnung zeigt, dass diese Anfrage etwa 1,02 GB new bytes reserved-Speicher benötigt, um die Anfrage erfolgreich zu verarbeiten. In diesem Beispiel hatte der Cluster jedoch weniger als 0,8 GB freien Speicherheap verfügbar, als die Datenanfrage einging. Infolgedessen wird der Circuit Breaker ausgelöst.

Die Ausnahmemeldung des Circuit Breakers kann wie folgt interpretiert werden:

  • data for [ ]:  Client sendet HTTP-Anfragen an einen Knoten in Ihrem Cluster. OpenSearch Service verarbeitet die Anfrage entweder lokal oder leitet sie zur zusätzlichen Verarbeitung an einen anderen Knoten weiter.
  • would be [#]: Eine Berechnung der Heap-Größe, wenn die Anfrage verarbeitet wird.
  • limit of [#]: Das aktuelle Circuit-Breaker-Limit.
  • real usage: Die tatsächliche Nutzung des JVM-Heaps.
  • new bytes reserved: Der tatsächliche Speicher, der zur Verarbeitung der Anfrage benötigt wird.

JVM-Speicherdruck

Eine Circuit-Breaker-Ausnahme wird häufig durch einen hohen JVM-Speicherdruck verursacht. Der JVM-Speicherdruck bezieht sich auf den Prozentsatz des Java-Heaps, der für alle Datenknoten in Ihrem Cluster verwendet wird. Prüfen Sie die Metrik JVMMemoryPressure in Amazon CloudWatch, um die aktuelle Nutzung zu ermitteln.

Hinweis: Die JVM-Heap-Größe eines Datenknotens ist auf die halbe Größe des physischen Speichers (RAM) eingestellt, bis zu 32 GB. Wenn der physische Speicher (RAM) beispielsweise 128 GB pro Knoten beträgt, beträgt die Heap-Größe immer noch 32 GB (die maximale Heap-Größe). Andernfalls wird die Heap-Größe als die halbe Größe des physischen Speichers berechnet.

Hoher JVM-Speicherdruck kann durch Folgendes verursacht werden:

  • Ein Anstieg bei der Anzahl der Anfragen an den Cluster. Prüfen Sie die Metriken IndexRate und SearchRate in Amazon CloudWatch, um Ihre aktuelle Last zu ermitteln.
  • Aggregationen, Platzhalter und Verwendung großer Zeitbereiche in Abfragen.
  • Unausgeglichene Shard-Zuweisung über Knoten oder zu viele Shards in einem Cluster.
  • Index-Mapping-Explosionen.
  • Verwenden der Datenstruktur fielddata zur Datenabfrage. Fielddata kann eine große Menge an Heap-Speicherplatz belegen und verbleibt während der gesamten Lebensdauer eines Segments im Heap. Infolgedessen bleibt der JVM-Speicherdruck auf dem Cluster hoch, wenn fielddata verwendet wird. Weitere Informationen finden Sie unter Fielddata auf der Elasticsearch-Website.

Fehlerbehebung bei hohem JVM-Speicherdruck

Versuchen Sie die folgenden Tipps, um einen hohen JVM-Speicherdruck zu beheben:

  • Reduzieren Sie den eingehenden Datenverkehr zu Ihrem Cluster, insbesondere wenn Sie eine hohe Workload haben.
  • Erwägen Sie, den Cluster zu skalieren, um mehr JVM-Speicher zur Unterstützung Ihrer Workload zu erhalten.
  • Wenn eine Cluster-Skalierung nicht möglich ist, reduzieren Sie die Anzahl der Shards, indem Sie alte oder ungenutzte Indizes löschen. Da Shard-Metadaten im Speicher gespeichert werden, kann die Reduzierung der Anzahl der Shards den gesamten Speicherverbrauch reduzieren.
  • Aktivieren Sie langsame Protokolle, um fehlerhafte Anfragen zu identifizieren.
    Hinweis: Stellen Sie vor dem Aktivieren von Konfigurationsänderungen sicher, dass der JVM-Speicherdruck unter 85 % liegt. Auf diese Weise können Sie zusätzlichen Overhead für vorhandene Ressourcen vermeiden.
  • Optimieren Sie Such- und Indexierungsanfragen und wählen Sie die richtige Anzahl von Shards. Weitere Informationen zur Indexierung und Shard-Anzahl finden Sie unter Erste Schritte mit Amazon OpenSearch Service: Wie viele Shards brauche ich?
  • Deaktivieren und vermeiden Sie die Verwendung von fielddata. Standardmäßig ist fielddata in einem Textfeld auf „false“ gesetzt, sofern es in Indexzuordnungen nicht explizit anders definiert ist.
  • Ändern Sie Ihren Index-Mapping-Typ mithilfe der reindex API in ein Schlüsselwort oder erstellen oder aktualisieren Sie die Index Template API. Sie können den Schlüsselworttyp als Alternative für die Durchführung von Aggregationen und das Sortieren von Textfeldern verwenden.
  • Vermeiden Sie die Aggregation von Textfeldern, um einen Anstieg der Felddaten zu verhindern. Wenn Sie mehr Felddaten verwenden, wird mehr Heap-Speicherplatz verbraucht. Verwenden Sie die API-Operation cluster stats, um Ihre Felddaten zu überprüfen.
  • Leeren Sie den fielddata-Cache mit dem folgenden API-Aufruf:
POST /index_name/_cache/clear?fielddata=true (index-level cache)
POST */_cache/clear?fielddata=true (cluster-level cache)

Warnung: Wenn Sie denfielddata-Cache löschen, werden eventuell laufende Abfragen unterbrochen.

Weitere Informationen finden Sie unter Wie kann ich Probleme mit einem hohen JVM-Speicherdruck bei meinem Amazon-OpenSearch-Service-Cluster beheben?