Einführung
Als erfahrenes DevOps-Beratungsunternehmen widmet sich ITGix der Bereitstellung innovativer Lösungen und der Rationalisierung von Prozessen für unsere Kunden. Heute freuen wir uns, einen Anwendungsfall zu präsentieren, bei dem wir gemeinsam mit einem Kunden Elasticsearch implementiert, optimiert und skaliert haben. Durch den Einsatz unserer Elasticsearch-Expertise und unseres Engagements für die Bereitstellung zuverlässiger und skalierbarer Lösungen konnten wir die spezifischen Anforderungen des Kunden erfüllen und seine Suchfunktionen verbessern.
Identifizierung des Bedarfs an Elasticsearch:
Unser Kunde erkannte, wie wichtig es war, eine robuste Suchfunktion in seine Anwendung zu integrieren, um die Benutzerfreundlichkeit zu erhöhen und den Datenabruf zu verbessern. Es war ihnen klar, dass herkömmliche Datenbanksysteme für komplexe Volltextsuchen, die Funktionen wie Stichwortabgleich, Relevanzbewertung und facettierte Suche erfordern, nicht gut geeignet sind.
Elasticsearch erwies sich aufgrund seiner Leistungsfähigkeit und Flexibilität als ideale Lösung für ihre Suchanforderungen. Als verteilte Open-Source-Such- und Analyse-Engine bietet Elasticsearch eine Reihe von Funktionen, die speziell für effiziente Volltextsuchen entwickelt wurden. Sie nutzt die Apache-Lucene-Bibliothek, die fortschrittliche Indizierungs- und Abfragefunktionen bietet und selbst bei großen Datenmengen sehr leistungsfähig ist.
Darüber hinaus ist Elasticsearch dank seiner verteilten Architektur hoch skalierbar und widerstandsfähig. Durch die Verteilung der Daten auf mehrere Knoten und Shards kann es hohe Abfragevolumina bewältigen und eine hohe Verfügbarkeit für Suchvorgänge bieten. Diese Skalierbarkeit stellt sicher, dass Elasticsearch bei wachsender Kundenanwendung und steigendem Datenvolumen problemlos skaliert werden kann, um die Anforderungen der Suchfunktionalität zu erfüllen, ohne die Leistung zu beeinträchtigen.
Einsatz und erste Herausforderungen
In Zusammenarbeit mit unserem Kunden haben wir uns auf den Weg gemacht, Elasticsearch für seine Anwendung zu implementieren. Wie bei jeder neuen Implementierung traten jedoch auch hier Herausforderungen auf. Zunächst kam es bei der Bereitstellung von Elasticsearch zu Leistungsproblemen aufgrund von Ressourcenbeschränkungen und suboptimalen Konfigurationen. Die Anforderungen der Anwendung belasteten die Elasticsearch-Instanz, was sich auf die Suchfunktionen und die Reaktionsfähigkeit auswirkte.
Optimieren von Elasticsearch für die Leistung

Bei unserer Analyse stellten wir fest, dass die Leistungsprobleme hauptsächlich mit den unterschiedlichen Eigenschaften und Größen der beiden Indizes in der Kundenanwendung zusammenhingen. Ein Index hatte eine Größe von etwa 12 GB, während der andere Index mit etwa 500 GB wesentlich größer war. Der Prozess der automatischen Skalierung, bei dem Shards auf neue Datenknoten umverteilt werden, erwies sich als zeitaufwändig und führte zu Problemen bei Suchvorgängen, während die automatische Skalierung im Gange war.
Um diese Herausforderung zu bewältigen, haben wir eine Lösung entwickelt, bei der zwei separate Elasticsearch-Cluster eingerichtet wurden, die jeweils einen der Indizes verwalten. Durch die Aufteilung der Indizes auf verschiedene Cluster konnten wir die erforderlichen Ressourcen zuweisen und die Konfigurationen auf der Grundlage der spezifischen Anforderungen der einzelnen Indizes optimieren.
Für den 12-GB-Index haben wir einen eigenen Elasticsearch-Cluster eingerichtet. Dieser Cluster wurde entwickelt, um die Arbeitslast des kleineren Index zu bewältigen und ermöglichte uns eine schnelle und effiziente automatische Skalierung. Die Ressourcenzuweisung und das Shard-Management für diesen Cluster wurden optimiert, um schnelle und reaktionsschnelle Suchvorgänge zu ermöglichen.
Für den 500-GB-Index hingegen stellten wir fest, dass eine automatische Skalierung nicht erforderlich war, da bereits genügend Ressourcen im Cluster vorhanden waren. Durch sorgfältige Planung und Ressourcenzuweisung stellten wir sicher, dass dieser Cluster über die erforderliche Rechenleistung und Speicherkapazität verfügte, um den größeren Index zu verarbeiten, ohne dass eine dynamische Skalierung erforderlich war.
Durch die Aufteilung der Indizes in verschiedene Elasticsearch-Cluster konnten wir die mit der automatischen Skalierung und der Neuzuweisung von Shards verbundenen Leistungsprobleme überwinden. Der dedizierte Cluster für den 12-GB-Index ermöglichte eine schnelle und reaktionsschnelle Skalierung und stellte sicher, dass Suchvorgänge nicht durch Verzögerungen beeinträchtigt wurden. Gleichzeitig profitierte der Cluster, der den 500-GB-Index beherbergt, von einer optimierten Ressourcenzuweisung, wodurch unnötige Skalierungsvorgänge vermieden und gleichzeitig eine angemessene Leistung und Stabilität gewährleistet wurde.
Optimierung der Ressourcenzuweisung und Knotengruppentrennung
Durch die Aufteilung der Elasticsearch Statefulets in verschiedene Worker-Node-Gruppen konnten wir die Ressourcenzuweisung optimieren und die Gesamtleistung des Systems verbessern. Dieser Ansatz ermöglichte es uns, die Arbeitslast effektiver zu verteilen und Ressourcen auf der Grundlage spezifischer betrieblicher Anforderungen zuzuweisen.
Die Masterknotengruppe, bestehend aus dedizierten Masterknoten, verwaltete globale Konfigurationen und koordinierte den Clusterbetrieb. Diese Knoten waren für Aufgaben wie die Verwaltung von Metadaten, die Bearbeitung von Änderungen des Clusterzustands und die Koordinierung des Hinzufügens oder Entfernens von Knoten zuständig. Durch die Isolierung dieser Aufgaben auf die Masterknotengruppe konnten wir die Stabilität und die effiziente Verwaltung des Elasticsearch-Clusters sicherstellen.
Die Client-Knotengruppe fungierte als Load Balancer und verteilte die eingehenden Anfragen über den Elasticsearch-Cluster. Diese Knoten wurden entwickelt, um Kundeninteraktionen zu bearbeiten, Such- und Indexierungsanfragen an die entsprechenden Datenknoten weiterzuleiten und eine nahtlose Schnittstelle für die Anwendungsintegration bereitzustellen. Durch die Verlagerung der Lastausgleichsaufgaben auf die Client-Knotengruppe konnten wir die Verteilung des eingehenden Datenverkehrs optimieren und die Reaktionsfähigkeit des Elasticsearch-Clusters verbessern.
Die Gruppe der Data Worker Nodes spielte eine wichtige Rolle bei der Abwicklung rechenintensiver Vorgänge wie Suche und Indizierung. Durch die Zuweisung dieser Knoten speziell für datenbezogene Aufgaben konnten wir Ressourcen zuweisen, die auf die Anforderungen von Such- und Indizierungsvorgängen zugeschnitten waren. Diese Trennung stellte sicher, dass die Data Worker Nodes über ausreichend CPU-Ressourcen verfügten, um diese rechenintensiven Aufgaben effizient auszuführen, was zu einer verbesserten Suchleistung und schnelleren Indizierungsvorgängen führte.
Verstehen von esJavaOpts und seine Auswirkungen auf Elasticsearch
Auf unserem Weg zur Optimierung von Elasticsearch erkannten wir auch die Bedeutung der Anpassung der esJavaOpts-Einstellungen. esJavaOpts steht für die Elasticsearch Java Virtual Machine (JVM)-Optionen, mit denen Administratoren die JVM-Heap-Größe feinabstimmen können. Durch die Zuweisung von 50 % des verfügbaren Arbeitsspeichers für den JVM-Heap konnten wir eine effiziente Speicherverwaltung sicherstellen und die Leistung von Elasticsearch verbessern.
Skalierung von Elasticsearch für Wachstum

Als die Anwendung des Kunden weiter wuchs, wurde die Skalierbarkeit zu einem kritischen Faktor, um eine optimale Leistung zu gewährleisten. Da Elasticsearch keine eingebauten Skalierungsmechanismen bietet, haben wir die Initiative ergriffen und eine benutzerdefinierte Skalierungslösung entwickelt, um steigende Arbeitslasten zu bewältigen. Um dies zu erreichen, erstellten wir benutzerdefinierte Skripte, die die Data Worker Node Group dynamisch auf Basis der CPU-Auslastung skalierten. Diese Skripte wurden speziell entwickelt, um das Fehlen von Elasticsearch's eingebauten Skalierungsfähigkeiten zu beheben und uns zu ermöglichen, die Kapazität des Clusters als Reaktion auf die Nachfrage anzupassen und einen effizienten Betrieb aufrechtzuerhalten. Durch die Überwachung der CPU-Nutzungsmuster setzten unsere benutzerdefinierten Skripte automatisch zusätzliche Datenknoten ein, um Elasticsearch effektiv zu skalieren. Dadurch wurde sichergestellt, dass das System wachsende Arbeitslasten ohne Beeinträchtigung der Leistung oder Reaktionsfähigkeit bewältigen konnte.
Implementierung von Überwachung und Alarmierung
Um die Stabilität und Zuverlässigkeit der Elasticsearch-Infrastruktur zu gewährleisten, haben wir umfassende Überwachungs- und Warnsysteme implementiert. Als Teil unserer Lösung haben wir das Prometheus-Monitoring mit Alertmanager integriert, um Echtzeit-Einblicke in den Zustand und die Leistung des Clusters zu erhalten. Außerdem nutzten wir Slack, um Benachrichtigungen über kritische Ereignisse und Warnungen im Zusammenhang mit dem Elasticsearch-Cluster zu erhalten.
Durch die Konfiguration von Prometheus zum Sammeln und Analysieren wichtiger Metriken wie Ressourcenauslastung, Indizierungsraten und Abfragelatenzen erhielten wir einen wertvollen Einblick in die Leistung des Elasticsearch-Clusters. So konnten wir proaktiv potenzielle Probleme oder Engpässe erkennen, bevor sie sich auf die Anwendung des Kunden auswirkten.
Durch die Integration von Alertmanager in das Monitoring-Setup konnten wir einen flexiblen und anpassbaren Alarmierungsmechanismus einrichten. Basierend auf vordefinierten Schwellenwerten und Regeln generierte Alertmanager Benachrichtigungen und leitete sie an unseren speziellen Slack-Kanal weiter. Dadurch wurde sichergestellt, dass unser Team umgehend über kritische Ereignisse informiert wurde, so dass wir sofort Maßnahmen ergreifen und die Leistung optimieren konnten.
Schlussfolgerung
Der umfassende Ansatz von ITGix umfasste Anpassungen kritischer Einstellungen wie esJavaOpts, die Gewährleistung einer effizienten Speicherverwaltung und die Verwendung benutzerdefinierter Skalierungsskripte, um die eingebauten Skalierungsgrenzen von Elasticsearch zu überwinden. Dank dieser proaktiven Strategie für die Skalierbarkeit konnte die Anwendung des Kunden mühelos wachsende Arbeitslasten bewältigen und dabei eine optimale Leistung beibehalten.