paint-brush
4 Leistungsprobleme bei Elasticsearch und wie man sie löstvon@rocksetcloud
4,113 Lesungen
4,113 Lesungen

4 Leistungsprobleme bei Elasticsearch und wie man sie löst

von Rockset5m2024/05/16
Read on Terminal Reader

Zu lang; Lesen

In diesem Blog gehen wir Lösungen für häufige Leistungsprobleme von Elasticsearch im großen Maßstab durch, darunter langsame Indizierung, Suchgeschwindigkeit, Shard- und Indexgröße sowie Mandantenfähigkeit.
featured image - 4 Leistungsprobleme bei Elasticsearch und wie man sie löst
Rockset HackerNoon profile picture


Skalierung von Elasticsearch

Elasticsearch ist eine NoSQL-Such- und Analyse-Engine, die sich leicht für die Protokollanalyse, Textsuche, Echtzeitanalyse und mehr verwenden lässt. Allerdings ist Elasticsearch unter der Haube ein komplexes, verteiltes System mit vielen Hebeln, die Sie betätigen müssen, um optimale Leistung zu erzielen.


In diesem Blog gehen wir Lösungen für häufige Leistungsprobleme von Elasticsearch im großen Maßstab durch, darunter langsame Indizierung, Suchgeschwindigkeit, Shard- und Indexgröße sowie Multi-Tenancy. Viele Lösungen stammen aus Interviews und Diskussionen mit technischen Leitern und Architekten, die praktische Erfahrung mit dem Betrieb des Systems im großen Maßstab haben.

Wie kann ich die Indizierungsleistung in Elasticsearch verbessern?

Bei Workloads mit hohem Schreibdurchsatz müssen Sie möglicherweise Elasticsearch optimieren, um die Indizierungsleistung zu verbessern. Wir bieten mehrere bewährte Methoden, um ausreichend Ressourcen für die Indizierung zur Verfügung zu haben, sodass der Vorgang die Suchleistung in Ihrer Anwendung nicht beeinträchtigt:


  • Erhöhen Sie das Aktualisierungsintervall : Elasticsearch stellt durch Aktualisieren des Index neue Daten für die Suche zur Verfügung. Aktualisierungen werden so eingestellt, dass sie automatisch jede Sekunde erfolgen, wenn ein Index in den letzten 30 Sekunden eine Abfrage erhalten hat. Sie können das Aktualisierungsintervall erhöhen, um mehr Ressourcen für die Indizierung zu reservieren.


  • Verwenden Sie die Bulk-API : Bei der Aufnahme großer Datenmengen kann die Indizierung mit der Update-API Wochen dauern . In diesen Szenarien können Sie die Indizierung von Daten mithilfe der Bulk-API ressourcenschonender beschleunigen. Auch bei Verwendung der Bulk-API sollten Sie die Anzahl der indizierten Dokumente und die Gesamtgröße der Bulk-Anforderung kennen, um sicherzustellen, dass die Clusterleistung nicht beeinträchtigt wird. Elastic empfiehlt, die Bulk-Größe zu vergleichen. Als Faustregel gilt 5–15 MB/Bulk-Anforderung .


  • Indexpuffergröße erhöhen: Sie können das Speicherlimit für ausstehende Indexierungsanforderungen über den Standardwert von 10 % des Heaps erhöhen. Dies kann bei indexierungsintensiven Arbeitslasten ratsam sein, kann sich jedoch auf andere speicherintensive Vorgänge auswirken.


  • Replikation deaktivieren: Sie können die Replikation auf Null setzen, um die Indizierung zu beschleunigen. Dies wird jedoch nicht empfohlen, wenn Elasticsearch das Aufzeichnungssystem für Ihre Arbeitslast ist.


  • Begrenzen Sie Upserts und Datenmutationen vor Ort : Einfügungen, Aktualisierungen und Löschungen erfordern eine Neuindizierung ganzer Dokumente. Wenn Sie CDC- oder Transaktionsdaten in Elasticsearch streamen, sollten Sie möglicherweise weniger Daten speichern, da dann weniger Daten neu indiziert werden müssen.


  • Vereinfachen Sie die Datenstruktur: Bedenken Sie, dass die Verwendung von Datenstrukturen wie verschachtelten Objekten zu mehr Schreibvorgängen und Indizes führt. Durch die Vereinfachung der Anzahl der Felder und der Komplexität des Datenmodells können Sie die Indizierung beschleunigen.

Was kann ich tun, um meine Suchgeschwindigkeit in Elasticsearch zu erhöhen?

Wenn die Ausführung Ihrer Abfragen zu lange dauert, bedeutet dies möglicherweise, dass Sie Ihr Datenmodell vereinfachen oder die Abfragekomplexität reduzieren müssen. Hier sind einige Bereiche, die Sie berücksichtigen sollten:


  • Erstellen Sie einenzusammengesetzten Index : Fügen Sie die Werte zweier Felder mit niedriger Kardinalität zusammen, um ein Feld mit hoher Kardinalität zu erstellen, das leicht durchsucht und abgerufen werden kann. Sie können beispielsweise ein Feld mit Postleitzahl und Monat zusammenführen, wenn dies zwei Felder sind, nach denen Sie für Ihre Abfrage häufig filtern.


  • Aktivieren Sie die benutzerdefinierte Weiterleitung von Dokumenten: Elasticsearch sendet eine Abfrage an alle Shards, um ein Ergebnis zurückzugeben. Mit der benutzerdefinierten Weiterleitung können Sie bestimmen, auf welchem Shard Ihre Daten liegen, um die Abfrageausführung zu beschleunigen. Allerdings sollten Sie bei der Einführung der benutzerdefinierten Weiterleitung auf Hotspots achten.


  • Verwenden Sie den Schlüsselwort-Feldtyp für strukturierte Suchen: Wenn Sie nach Inhalten wie einer ID oder einer Postleitzahl filtern möchten, empfiehlt es sich, für eine schnellere Abfrage den Schlüsselwort-Feldtyp anstelle des Integer-Typs oder anderer numerischer Feldtypen zu verwenden.


  • Weg mit den über- und untergeordneten Objekten und verschachtelten Objekten : Über- und untergeordnete Beziehungen sind eine gute Umgehung der fehlenden Join-Unterstützung in Elasticsearch und haben dazu beigetragen, die Aufnahme zu beschleunigen und die Neuindizierung zu begrenzen. Mit diesem Ansatz stoßen Unternehmen jedoch irgendwann an Speichergrenzen. In diesem Fall können Sie die Abfrageleistung durch Denormalisierung der Daten beschleunigen.

Wie sollte ich die Größe von Elasticsearch-Shards und -Indizes für die Skalierung bestimmen?

Viele Skalierungsprobleme mit Elasticsearch lassen sich auf die Sharding- und Indizierungsstrategie zurückführen. Es gibt keine allgemeingültige Strategie, wie viele Shards Sie haben sollten oder wie groß Ihre Shards sein sollten. Die beste Möglichkeit, die Strategie zu bestimmen, besteht darin, Tests und Benchmarks mit einheitlichen Produktionsworkloads durchzuführen. Hier sind einige zusätzliche Ratschläge, die Sie berücksichtigen sollten:


  • Verwenden Sie die Force Merge-API : Verwenden Sie die Force Merge-API, um die Anzahl der Segmente in jedem Shard zu reduzieren. Segmentzusammenführungen erfolgen automatisch im Hintergrund und entfernen alle gelöschten Dokumente. Durch die Verwendung einer Force Merge können Sie alte Dokumente manuell entfernen und die Leistung beschleunigen. Dies kann ressourcenintensiv sein und sollte daher nicht während der Spitzenauslastung geschehen.


  • Achten Sie auf Lastungleichgewichte : Elasticsearch verfügt nicht über eine gute Möglichkeit, die Ressourcenauslastung pro Shard zu verstehen und diese bei der Bestimmung der Shard-Platzierung zu berücksichtigen. Daher können Hot Shards auftreten. Um diese Situation zu vermeiden, sollten Sie erwägen, mehr Shards als Datennotizen und kleinere Shards als Datenknoten zu haben.


  • Verwenden Sie zeitbasierte Indizes : Zeitbasierte Indizes können die Anzahl der Indizes und Shards in Ihrem Cluster basierend auf der Aufbewahrung reduzieren. Elasticsearch bietet auch eine Rollover-Index-API, sodass Sie basierend auf Alter oder Dokumentgröße auf einen neuen Index umsteigen können, um Ressourcen freizugeben.

Wie sollte ich das Design für mehrere Mandanten gestalten?

Die gängigsten Strategien für Multi-Tenancy sind ein Index pro Kunde oder Mandant oder die Verwendung von benutzerdefiniertem Routing. So können Sie die Strategien für Ihre Arbeitslast abwägen:


  • Index pro Kunde oder Mandant: Die Konfiguration separater Indizes pro Kunde eignet sich gut für Unternehmen mit einer kleineren Benutzerbasis, Hunderten bis einigen Tausend Kunden, und wenn die Kunden keine Daten teilen. Es ist auch hilfreich, einen Index pro Kunde zu haben, wenn jeder Kunde sein eigenes Schema hat und mehr Flexibilität benötigt.


  • Benutzerdefiniertes Routing: Mit benutzerdefiniertem Routing können Sie den Shard angeben, auf dem sich ein Dokument befindet, z. B. die Kunden-ID oder die Mandanten-ID, um das Routing beim Indizieren eines Dokuments anzugeben. Bei Abfragen basierend auf einem bestimmten Kunden wird die Abfrage direkt an den Shard gesendet, der die Kundendaten enthält, um schnellere Antwortzeiten zu erzielen. Benutzerdefiniertes Routing ist ein guter Ansatz, wenn Sie für alle Ihre Kunden ein einheitliches Schema haben und viele Kunden haben, was häufig der Fall ist, wenn Sie ein Freemium-Modell anbieten.

Elasticsearch skalieren oder nicht skalieren?

Elasticsearch wurde für Anwendungsfälle in den Bereichen Protokollanalyse und Textsuche entwickelt. Viele Organisationen, die Elasticsearch für Echtzeitanalysen in großem Maßstab verwenden, müssen Kompromisse eingehen, um Leistung oder Kosteneffizienz aufrechtzuerhalten, einschließlich der Begrenzung der Abfragekomplexität und der Latenz bei der Datenaufnahme. Wenn Sie beginnen, Nutzungsmuster einzuschränken, Ihr Aktualisierungsintervall Ihr SLA überschreitet oder Sie weitere Datensätze hinzufügen, die zusammengeführt werden müssen, kann es sinnvoll sein, nach Alternativen zu Elasticsearch zu suchen.


Rockset ist eine der Alternativen und wurde speziell für die Echtzeit-Streaming-Datenaufnahme und Abfragen mit geringer Latenz im großen Maßstab entwickelt. Erfahren Sie, wie Sie von Elasticsearch migrieren und erkunden Sie die architektonischen Unterschiede zwischen den beiden Systemen.