Elasticsearch wurde 2010 eingeführt und war eine der ersten verteilten Suchmaschinen für die schnelle Abfrage von Daten zur Anzeige in Analysen oder Big-Data-Ausgaben. Damals sammelten immer mehr Unternehmen riesige Datenmengen, aber herkömmliche Datenbank-Engines konnten nicht mithalten. Elasticsearch wurde als Vektordatenbank eingeführt, die strukturierte und unstrukturierte Daten speichern kann. Es war der erste große Sprung in die Big-Data-Indizierung und schnellere Abfragen, als Unternehmensanalysen Terabyte an Daten überschritten und Performance-Probleme verursachten.
Was ist Elasticsearch?
Elasticsearch ist ein Datastore, der verwendet wird, um Daten zusammenzuführen und über eine API durchsuchbar zu machen. Es basiert auf Apache Lucene, einem Indexierungs- und Storage-Service, der Daten in Shards verteilt. Jeder Shard enthält seine eigenen Daten, aber die Shards werden voneinander getrennt gehalten, um Daten über Knoten zu verteilen. Elasticsearch fasst alle Shards zusammen und bietet Entwicklern eine API zum Abfragen von Daten. Mit der API können Administratoren Berechtigungen für bestimmte Benutzer festlegen, um Daten weiter zu sichern und nur autorisierten Benutzern Zugriff auf bestimmte Daten zu gewähren.
Entwickler sind nicht auf strukturierte oder unstrukturierte Daten beschränkt. Mit Elasticsearch können Benutzer sowohl strukturierte als auch unstrukturierte Daten abrufen, aber sie fragt Daten in ihren verteilten Shards ab, als wäre Storage eine große Datenbank. Die Art und Weise, wie Elasticsearch Daten verarbeitet, macht sie viel schneller als eine Standarddatenbank-Engine. Daher eignet sie sich am besten für Anwendungen mit Analysen, Suchfunktionen für viele Daten oder Netzwerkverkehrsanalysen.
Kernkomponenten der Elasticsearch-Architektur
Die erste Kernkomponente von Elasticsearch ist der Knoten. Ein Knoten ist ein Server oder ein Gerät, auf dem Daten gespeichert sind. Cluster bestehen aus einer Sammlung von Knoten. Knoten und Cluster können zur Redundanz über Rechenzentren verteilt werden, aber verteilte Daten verbessern die Performance bei Datenabfragen. Elasticsearch ist eine Vektordatenbank, die Daten jedoch als Dokument speichert. Ein Dokument ist eine Entität, die unstrukturierte Daten speichert, obwohl auch strukturierte Daten darin gespeichert werden können.
Daten werden über Knoten hinweg fragmentiert. Shards sind ein Teil der Daten, um große Datastores in kleinere Teile zu segmentieren, was es einfacher macht, Daten in einem Ergebnissatz für die Frontend-Anwendung zu verteilen und gleichzeitig abzufragen. Logstash wird als Datenpipeline verwendet, die Daten in ihrer Rohform aufnimmt und in eine nutzbare Form umwandelt.
Elasticsearch verfügt auch über eine API, die das Gateway zu Daten ist. Entwickler müssen sich bei der API authentifizieren und sie mit einem Schlüssel abfragen. Die API steuert den Zugriff auf die Daten und die Art und Weise, wie Entwickler sie abfragen können. Eine API verdeckt auch die Backend-Architektur und sichert sie, sodass sie für Entwickler zugänglich ist, die mit der Funktionsweise von Apache Lucene und anderen Komponenten nicht vertraut sind.
Knoten und Cluster
Ein Cluster ist eine Gruppe von Knoten, aber Knoten haben ihre eigene spezifische Rolle in einem Cluster. Der Masterknoten steuert im Allgemeinen den Cluster. Der Masterknoten kann Indizes erstellen oder löschen und andere Knoten verfolgen, die am Cluster teilnehmen. Jeder Cluster hat einen Masterknoten.
Ein Datenknoten speichert die Daten. Jede Manipulation oder Änderung von Daten liegt in der Verantwortung des Datenknotens. Wenn Sie Daten aggregieren, fügen Sie sie dem Datenknoten hinzu. Die Suchfunktion erfolgt auch am Datenknoten.
Stellen Sie sich die Koordination von Knoten als die Gateways vor, die den Datenverkehr zum richtigen Knoten steuern. Ein koordinierender Knoten sendet Anfragen an den Masterknoten oder Datenknoten, abhängig von ihrem Ziel. Wenn beispielsweise eine Suche an den Cluster gesendet wird, verwaltet der koordinierende Knoten seine Anfrage.
Elasticsearch verfügt über eine Pipeline zum Transformieren und Verschieben von Daten. Der Aufnahmeknoten ist für die Verwaltung von Dokumenten und deren Transformation für die Indexierung verantwortlich. Elasticsearch empfiehlt, in Umgebungen mit starken Datenübertragungen einen Aufnahmeknoten unabhängig von den Master- und Datenknoten zu haben.
Remote-fähige Knoten senden Anfragen an andere Cluster im Elasticsearch-System. Suchabfragen können Daten mithilfe von Cluster-übergreifenden Funktionen mit einem ferngeeigneten Knoten finden. Die Replikation von Daten über Cluster hinweg liegt auch in der Verantwortung der ferngeeigneten Knoten.
Shards und Replikas
Schnelle Suchen und Abfragen erfordern Indizes. Indexe sind die Art und Weise, wie ein Datenspeicher Daten so organisiert, dass Suchen schneller werden. In Elasticsearch besteht jeder Index aus einer Reihe von Shards. Shards werden über Knoten gespeichert, in denen Elasticsearch sie für eine schnellere Verarbeitung über den Cluster verteilt. Shards enthalten eine Kopie von Daten, aber Elasticsearch kann gleichzeitige Suchen auf mehreren Shards durchführen.
Redundanz ist für Failover und Fehlertoleranz erforderlich, sodass Replikate eine Kopie von Shards verarbeiten. Replikate werden auf verschiedenen Knoten gespeichert, sodass Daten nicht verloren gehen, wenn ein Knoten ausfällt. Wenn ein Knoten ausfällt, wäre Elasticsearch dann in der Lage, auf Daten auf einer Replikation auf einem anderen Knoten zuzugreifen.
Datenfluss in Elasticsearch
Elasticsearch bietet eine API für Entwickler, um ihre Abfragen zu senden. Die API schützt Entwickler vor der Komplexität des Backends. Das Backend besteht wie besprochen aus mehreren Komponenten, einschließlich Shards, Knoten, Indizes und Replikaten. Anstatt Entwickler zur Verwaltung von Elasticsearch-Forschern zu zwingen, beginnt der Datenfluss mit einer Abfrage nach der API.
Die API sendet die Abfrage zuerst an einen Koordinator. Der Koordinator sendet ihn an den entsprechenden Knoten, in dem sich Shards befinden. Eine Abfrage könnte auch an mehrere Shards mit jeweils eigenem Datensatz gesendet werden. Das Routing erfolgt durch den Koordinator, der die richtigen Shards für die Abfrage bestimmt.
Nachdem Shards Dokumente gesammelt haben, werden Indizes für die Dokumente an den Koordinator zurückgeschickt. Wenn mehrere Shards Daten an den Koordinator zurücksenden, organisiert der Koordinator die Indizes, führt sie zusammen und sortiert sie. Wenn die Indizes sortiert sind, ruft der Koordinator dann die tatsächlichen Dokumente aus den Shards ab. Nachdem die Daten abgerufen wurden, werden sie über die API an die Anwendung zurückgesendet.
Best Practices für die Optimierung der Elasticsearch-Architektur
Elasticsearch ist viel komplexer als die durchschnittliche Datenbank-Engine, sodass die Optimierung einen anderen Ansatz erfordert. Sie müssen zunächst sicherstellen, dass genügend Ressourcen im Backend ausgeführt werden. Wenn die Abfragen zu langsam sind, sollten Sie die CPU-, Speicher- oder Server-Storage-Kapazität erhöhen.
Für die Suche nach Daten sind Indizes erforderlich, aber einige Daten werden nicht so häufig verwendet wie andere Daten. Mit Elasticsearch können Sie Indizes einfrieren, wodurch ungenutzte Indizes auf einen anderen Shard verschoben werden. Koordinatoren haben dann weniger Shards, um nach jeder Abfrage zu suchen und so die Performance zu verbessern.
Thread-Pools in Elasticsearch steuern Abfragegrößen und sollten so optimiert werden, dass sie die in jeder Abfrage verarbeitete Datenmenge unterstützen. Konfigurieren Sie Thread-Pools, um genügend Daten für Ihre Abfragen zu verarbeiten, aber sie binden auch an Knotenressourcen. Sowohl Knoten als auch Thread-Pools sollten über genügend Ressourcen verfügen, oder Sie können bei Abfragen mit hohem Volumen eine Verschlechterung der Performance feststellen.
Fazit
Elasticsearch ist viel komplexer als eine Standarddatenbank. Daher ist es für eine optimale Performance erforderlich, über die richtige Architektur und die richtigen Rechenressourcen zu verfügen. Verwenden Sie Best Practices, wenn Sie Elasticsearch konfigurieren, aber es ist auch wichtig, über die richtigen Rechenressourcen zu verfügen, um die Abfragen und den Daten-Storage zu unterstützen, die für das Backend erforderlich sind.
Eine Möglichkeit, sicherzustellen, dass Sie über genügend Storage-Ressourcen verfügen, besteht darin, Pure Storage® FlashBlade® zu nutzen. FlashBlade unterstützt exponentielles Wachstum für kleine bis große Unternehmen. Ihre Anwendungen können skaliert werden, wenn mehr Benutzer Daten speichern und eine beliebige Anzahl von Kunden unterstützen.