Ein Elasticsearch-Tutorial: Getting Started

#Hinweis: Elastic hat kürzlich angekündigt, dass es für neue Versionen von Elasticsearch und Kibana nach Version 7.9 eine Closed-Source-Lizenzierung einführen wird. Weitere Einzelheiten finden Sie in den Kommentaren unseres CEO Tomer Levy zum Thema „Truly Doubling Down on Open Source“.

Elasticsearch ist das lebendige Herz der heute beliebtesten Log-Analyse-Plattform – dem ELK Stack (Elasticsearch, Logstash und Kibana). Die Rolle von Elasticsearch ist so zentral, dass sie zum Synonym für den Namen des Stacks selbst geworden ist. Elasticsearch dient in erster Linie der Suche und Log-Analyse und ist heute eines der beliebtesten Datenbanksysteme auf dem Markt. Dieses Elasticsearch-Tutorial vermittelt neuen Benutzern das erforderliche Wissen und die Werkzeuge, um mit der Nutzung von Elasticsearch zu beginnen. Es enthält Anweisungen zur Installation und zur anfänglichen Indizierung und Datenverarbeitung.

Was ist Elasticsearch?

Elasticsearch (manchmal auch als ES bezeichnet) wurde erstmals 2010 veröffentlicht und ist eine moderne Such- und Analysemaschine, die auf Apache Lucene basiert. Elasticsearch ist eine NoSQL-Datenbank, die vollständig quelloffen ist und mit Java entwickelt wurde. Das bedeutet, dass sie Daten auf unstrukturierte Weise speichert und dass man sie nicht mit SQL abfragen kann.

Dieses Elasticsearch-Tutorial könnte auch als NoSQL-Tutorial betrachtet werden. Im Gegensatz zu den meisten NoSQL-Datenbanken hat Elasticsearch jedoch einen starken Fokus auf Suchmöglichkeiten und -funktionen – und zwar so sehr, dass der einfachste Weg, Daten von ES zu erhalten, darin besteht, sie mit der umfangreichen Elasticsearch-API zu suchen.

Im Kontext der Datenanalyse wird Elasticsearch zusammen mit den anderen Komponenten des ELK-Stacks, Logstash und Kibana, verwendet und spielt die Rolle der Datenindizierung und -speicherung.

Installation von Elasticsearch

Die Anforderungen für Elasticsearch sind einfach: Java 8 (spezielle Version empfohlen: Oracle JDK Version 1.8.0_131). Werfen Sie einen Blick auf dieses Logstash-Tutorial, um sicherzustellen, dass Sie bereit sind. Außerdem sollten Sie sicherstellen, dass Ihr Betriebssystem in der Elastic-Support-Matrix aufgeführt ist, da es sonst zu seltsamen und unvorhersehbaren Problemen kommen kann. Sobald das erledigt ist, können Sie mit der Installation von Elasticsearch beginnen.

Sie können Elasticsearch als eigenständige Distribution herunterladen oder es über die apt und yum Repositories installieren. Wir werden Elasticsearch auf einem Ubuntu 16.04-Rechner, der auf AWS EC2 läuft, mit apt installieren.

Zuerst müssen Sie den Signierschlüssel von Elastic hinzufügen, damit Sie das heruntergeladene Paket verifizieren können (überspringen Sie diesen Schritt, wenn Sie bereits Pakete von Elastic installiert haben):

wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -

Für Debian müssen wir dann das Paket apt-transport-https installieren:

sudo apt-get install apt-transport-https

Der nächste Schritt besteht darin, die Repository-Definition zu Ihrem System hinzuzufügen:

echo "deb https://artifacts.elastic.co/packages/6.x/apt stable main" | sudo tee -a /etc/apt/sources.list.d/elastic-6.x.list

Jetzt müssen nur noch die Repositories aktualisiert und Elasticsearch installiert werden:

sudo apt-get updatesudo apt-get install elasticsearch

Elasticsearch konfigurieren

Die Konfiguration von Elasticsearch erfolgt über eine Konfigurationsdatei, deren Speicherort von Ihrem Betriebssystem abhängt. In dieser Datei können Sie allgemeine Einstellungen (z. B. Knotenname) sowie Netzwerkeinstellungen (z. B. Host und Port), Speicherort, Speicherplatz, Protokolldateien und mehr konfigurieren.

Für Entwicklungs- und Testzwecke reichen die Standardeinstellungen aus, es wird jedoch empfohlen, vor dem Einsatz in der Produktion zu recherchieren, welche Einstellungen Sie manuell festlegen sollten.

Zum Beispiel und insbesondere bei der Installation von Elasticsearch in der Cloud ist es eine gute Best Practice, Elasticsearch entweder an eine private IP oder an localhost zu binden:

sudo vim /etc/elasticsearch/elasticsearch.ymlnetwork.host: "localhost"http.port:9200

Ausführen von Elasticsearch

Elasticsearch wird nach der Installation nicht automatisch ausgeführt und muss manuell gestartet werden. Wie Sie Elasticsearch starten, hängt von Ihrem spezifischen System ab. Auf den meisten Linux- und Unix-basierten Systemen können Sie diesen Befehl verwenden:

sudo service elasticsearch start

Und das war’s! Um zu bestätigen, dass alles gut funktioniert, zeigen Sie einfach curl oder Ihren Browser auf http://localhost:9200, und Sie sollten etwas wie die folgende Ausgabe sehen:

{ "name" : "33QdmXw", "cluster_name" : "elasticsearch", "cluster_uuid" : "mTkBe_AlSZGbX-vDIe_vZQ", "version" : { "number" : "6.1.2", "build_hash" : "5b1fea5", "build_date" : "2018-01-10T02:35:59.208Z", "build_snapshot" : false, "lucene_version" : "7.1.0", "minimum_wire_compatibility_version" : "5.6.0", "minimum_index_compatibility_version" : "5.0.0" }, "tagline" : "You Know, for Search"}

Um den Prozess der Ausführung von Elasticsearch zu debuggen, verwenden Sie die Elasticsearch-Logdateien, die sich (unter Deb) in /var/log/elasticsearch/ befinden.

Erstellen eines Elasticsearch-Index

Indizieren ist der Prozess des Hinzufügens von Daten zu Elasticsearch. Denn wenn man Daten in Elasticsearch einspeist, werden diese in Apache Lucene-Indizes abgelegt. Das ist sinnvoll, weil Elasticsearch die Lucene-Indizes zum Speichern und Abrufen seiner Daten verwendet. Obwohl man nicht viel über Lucene wissen muss, ist es hilfreich zu wissen, wie es funktioniert, wenn man anfängt, sich ernsthaft mit Elasticsearch zu beschäftigen.
Elasticsearch verhält sich wie eine REST-API, daher kann man entweder die POST– oder die PUT-Methode verwenden, um Daten hinzuzufügen. Sie verwenden PUT, wenn Sie das id des Datenelements kennen oder angeben möchten, oder POST, wenn Sie möchten, dass Elasticsearch ein id für das Datenelement erzeugt:

curl -XPOST 'localhost:9200/logs/my_app' -H 'Content-Type: application/json' -d'{ "timestamp": "2018-01-24 12:34:56", "message": "User logged in", "user_id": 4, "admin": false}'curl -X PUT 'localhost:9200/app/users/4' -H 'Content-Type: application/json' -d '{ "id": 4, "username": "john", "last_login": "2018-01-25 12:34:56"}'

Und die Antwort:

{"_index":"logs","_type":"my_app","_id":"ZsWdJ2EBir6MIbMWSMyF","_version":1,"result":"created","_shards":{"total":2,"successful":1,"failed":0},"_seq_no":0,"_primary_term":1}{"_index":"app","_type":"users","_id":"4","_version":1,"result":"created","_shards":{"total":2,"successful":1,"failed":0},"_seq_no":0,"_primary_term":1}

Die Daten für das Dokument werden als JSON-Objekt gesendet. Sie fragen sich vielleicht, wie wir Daten indizieren können, ohne die Struktur der Daten zu definieren. Nun, mit Elasticsearch, wie mit jeder anderen NoSQL-Datenbank, ist es nicht notwendig, die Struktur der Daten im Voraus zu definieren. Um jedoch eine optimale Leistung zu gewährleisten, können Sie Elasticsearch-Mappings entsprechend den Datentypen definieren. Mehr dazu später.

Wenn Sie einen der Beats Shipper (z.B. Filebeat oder Metricbeat) oder Logstash verwenden, erstellen diese Teile des ELK Stack automatisch die Indizes.

Um eine Liste Ihrer Elasticsearch-Indizes zu sehen, verwenden Sie:

curl -XGET 'localhost:9200/_cat/indices?v&pretty'health status index uuid pri rep docs.count docs.deleted store.size pri.store.sizeyellow open logstash-2018.01.23 y_-PguqyQ02qOqKiO6mkfA 5 1 17279 0 9.9mb 9.9mbyellow open app GhzBirb-TKSUFLCZTCy-xg 5 1 1 0 5.2kb 5.2kbyellow open .kibana Vne6TTWgTVeAHCSgSboa7Q 1 1 2 0 8.8kb 8.8kbyellow open logs T9E6EdbMSxa8S_B7SDabTA 5 1 1 0 5.7kb 5.7kb

Die Liste enthält in diesem Fall die Indizes, die wir oben erstellt haben, einen Kibana-Index und einen Index, der von einer Logstash-Pipeline erstellt wurde.

Elasticsearch Querying

Sobald Sie Ihre Daten in Elasticsearch indiziert haben, können Sie mit der Suche und Analyse beginnen. Die einfachste Abfrage, die Sie machen können, ist die Abfrage eines einzelnen Elements. Lesen Sie unseren Artikel, der sich ausschließlich mit Elasticsearch-Abfragen befasst.

Wiederum über die Elasticsearch REST API verwenden wir GET:

curl -XGET 'localhost:9200/app/users/4?pretty'

Und die Antwort:

{ "_index" : "app", "_type" : "users", "_id" : "4", "_version" : 1, "found" : true, "_source" : { "id" : 4, "username" : "john", "last_login" : "2018-01-25 12:34:56" }}

Die Felder, die mit einem Unterstrich beginnen, sind alle Metafelder des Ergebnisses. Das _source-Objekt ist das ursprüngliche Dokument, das indiziert wurde.
Wir verwenden GET auch für die Suche, indem wir den _search-Endpunkt aufrufen:

curl -XGET 'localhost:9200/_search?q=logged'{"took":173,"timed_out":false,"_shards":{"total":16,"successful":16,"skipped":0,"failed":0},"hits":{"total":1,"max_score":0.2876821,"hits":}}

Das Ergebnis enthält eine Reihe von zusätzlichen Feldern, die sowohl die Suche als auch das Ergebnis beschreiben. Hier ein kurzer Überblick:

  • took: Die Zeit in Millisekunden, die die Suche gedauert hat
  • timed_out: If the search timed out
  • _shards: Die Anzahl der durchsuchten Lucene-Shards und deren Erfolgs- und Fehlerquoten
  • hits: Die tatsächlichen Ergebnisse, zusammen mit Meta-Informationen für die Ergebnisse

Die Suche, die wir oben durchgeführt haben, wird als URI-Suche bezeichnet und ist die einfachste Art, Elasticsearch abzufragen. Wenn Sie nur ein Wort eingeben, durchsucht ES alle Felder aller Dokumente nach diesem Wort. Sie können spezifischere Suchen mit Lucene-Abfragen erstellen:

  • username:johnb – Sucht nach Dokumenten, in denen das Feld username gleich „johnb“
  • john* – Sucht nach Dokumenten, die Begriffe enthalten, die mit john beginnen und von null oder mehr Zeichen gefolgt werden, wie „john“, „johnb“ und „johnson“
  • john? – Sucht nach Dokumenten, die Begriffe enthalten, die mit „john“ beginnen, gefolgt von nur einem Zeichen. Passt zu „johnb“ und „johns“, aber nicht zu „john“

Es gibt noch viele andere Möglichkeiten der Suche, einschließlich der Verwendung von boolescher Logik, dem Boosten von Begriffen, der Verwendung von Fuzzy- und Proximity-Suchen und der Verwendung von regulären Ausdrücken.

Elasticsearch Query DSL

URI-Suchen sind nur der Anfang. Elasticsearch bietet auch eine Suche im Request Body mit einer Query DSL für fortgeschrittene Suchen. Es gibt eine breite Palette von Optionen, die für diese Art von Suche zur Verfügung stehen, und Sie können verschiedene Optionen mischen und anpassen, um die gewünschten Ergebnisse zu erhalten.

Es gibt zwei Arten von Klauseln: 1) Blattabfrageklauseln, die nach einem Wert in einem bestimmten Feld suchen, und 2) zusammengesetzte Abfrageklauseln (die eine oder mehrere Blattabfrageklauseln enthalten können).

Elasticsearch-Abfragetypen

Es gibt eine breite Palette von Optionen, die bei dieser Art von Suchvorgängen zur Verfügung stehen, und Sie können verschiedene Optionen mischen und aufeinander abstimmen, um die von Ihnen gewünschten Ergebnisse zu erhalten. Zu den Abfragetypen gehören:

  1. Geographische Abfragen,
  2. „Mehr wie dies“-Abfragen
  3. Skriptabfragen
  4. Volltextabfragen
  5. Formabfragen
  6. Spanabfragen
  7. Abfragen auf Begriffsebene
  8. Spezialisierte Abfragen

Ab Elasticsearch 6.8 hat der ELK Stack Elasticsearch-Abfragen und Elasticsearch-Filter verschmolzen, aber ES unterscheidet sie immer noch nach Kontext. Die DSL unterscheidet zwischen einem Filterkontext und einem Abfragekontext für Abfrageklauseln. Klauseln in einem Filterkontext testen Dokumente auf boolesche Weise: Stimmt das Dokument mit dem Filter überein, „ja“ oder „nein“? Filter sind im Allgemeinen auch schneller als Abfragen, aber Abfragen können auch eine Relevanzbewertung berechnen, je nachdem, wie gut ein Dokument mit der Abfrage übereinstimmt. Filter verwenden keine Relevanzbewertung. Dies bestimmt die Reihenfolge und den Einschluss von Dokumenten:

curl -XGET 'localhost:9200/logs/_search?pretty' -H 'Content-Type: application/json' -d'{ "query": { "match_phrase": { "message": "User logged in" } }}'

Und das Ergebnis:

{ "took" : 28, "timed_out" : false, "_shards" : { "total" : 5, "successful" : 5, "skipped" : 0, "failed" : 0 }, "hits" : { "total" : 1, "max_score" : 0.8630463, "hits" : }}'

Erstellen eines Elasticsearch-Clusters

Die Pflege eines Elasticsearch-Clusters kann zeitaufwändig sein, insbesondere wenn Sie ELK im Eigenbau betreiben. Aber angesichts der leistungsstarken Such- und Analysefunktionen von Elasticsearch sind solche Cluster unverzichtbar. In unserem Elasticsearch-Cluster-Tutorial gehen wir tiefer in das Thema ein, so dass wir dies als Sprungbrett für eine gründlichere Erläuterung nutzen werden.

Was genau ist ein Elasticsearch-Cluster? Elasticsearch-Cluster gruppieren mehrere Elasticsearch-Knoten und/oder -Instanzen zusammen. Natürlich kann man sich immer dafür entscheiden, eine einzelne Elasticsearch-Instanz oder einen einzelnen Knoten innerhalb eines Clusters zu betreiben. Der Hauptpunkt einer solchen Gruppierung liegt in der Verteilung der Aufgaben, der Suche und der Indizierung auf die Knoten des Clusters. Zu den Knotenoptionen gehören Datenknoten, Masterknoten, Client-Knoten und Ingest-Knoten.

Die Installation von Knoten kann eine Vielzahl von Konfigurationen umfassen, die in unserem oben erwähnten Tutorial behandelt werden. Aber hier ist die grundlegende Elasticsearch-Cluster-Knoten-Installation:

Zuallererst muss Java installiert werden:

sudo apt-get install default-jre

Nachher muss der Anmeldeschlüssel von Elasticsearch hinzugefügt werden:

wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -

Nächstens installieren Sie die neue Iteration von Elasticsearch:

sudo apt-get update && apt-get install elasticsearch

Sie müssen für jeden Elasticsearch-Knoten eine eigene elasticsearch.ymlKonfigurationsdatei (sudo vim /etc/elasticsearch/elasticsearch.yml) erstellen und/oder einrichten. Starten Sie dann Elasticsearch und überprüfen Sie den Status Ihres Elasticsearch-Clusters. Die Antworten sehen in etwa so aus:

{ "cluster_name" : "elasticsearch-cluster-demo", "compressed_size_in_bytes" : 255, "version" : 7, "state_uuid" : "50m3ranD0m54a531D", "master_node" : "IwEK2o1-Ss6mtx50MripkA", "blocks" : { }, "nodes" : { "m4-aw350m3-n0D3" : { "name" : "es-node-1", "ephemeral_id" : "x50m33F3mr--A11DnuM83r", "transport_address" : "172.31.50.123:9200", "attributes" : { } }, },}

Als nächstes steht der Zustand des Elasticsearch-Clusters auf Ihrer Liste. Überprüfen Sie den Zustand Ihres Clusters regelmäßig mit dem folgenden API-Aufruf:

curl -X GET "localhost:9200/_cluster/health?wait_for_status=yellow&local=false&level=shards&pretty"

In diesem Beispiel wird der Parameter local als false angezeigt (was eigentlich der Standardwert ist). Dies zeigt Ihnen den Status des Master-Knotens an. Um den lokalen Knoten zu überprüfen, ändern Sie in true.

Der Parameter level zeigt standardmäßig den Zustand des Clusters an, aber darüber hinausgehende Werte sind indices und shards (wie im obigen Beispiel).

Es gibt zusätzliche optionale Parameter für Timeouts…

timeout
master_timeout

…oder um auf das Eintreten bestimmter Ereignisse zu warten:

wait_for_active_shards
wait_for_events
wait_for_no_initializing_shards
wait_for_no_relocating_shards
wait_for_nodes
wait_for_status

Entfernen von Elasticsearch-Daten

Das Löschen von Elementen aus Elasticsearch ist genauso einfach wie die Eingabe von Daten in Elasticsearch. Die zu verwendende HTTP-Methode ist diesmal – Überraschung –DELETE:

$ curl -XDELETE 'localhost:9200/app/users/4?pretty'{ "_index" : "app", "_type" : "users", "_id" : "4", "_version" : 2, "result" : "deleted", "_shards" : { "total" : 2, "successful" : 1, "failed" : 0 }, "_seq_no" : 1, "_primary_term" : 1}

Um einen Index zu löschen, verwende:

$ curl -XDELETE 'localhost:9200/logs?pretty'

Um alle Indizes zu löschen (mit äußerster Vorsicht zu verwenden) verwende:

$ curl -XDELETE 'localhost:9200/_all?pretty'$

Die Antwort sollte in beiden Fällen lauten:

{ "acknowledged" : true}

Um ein einzelnes Dokument zu löschen:

$ curl -XDELETE 'localhost:9200/index/type/document'

Was kommt jetzt?

Dieses Tutorial hilft Anfängern mit Elasticsearch und bietet daher nur die grundlegenden Schritte der CRUD-Operationen in Elasticsearch. Elasticsearch ist eine Suchmaschine und bietet als solche eine immense Tiefe an Suchfunktionen.
In den letzten Versionen wurden einige unglaubliche neue Elasticsearch-Funktionen eingeführt und auch einige bedeutende Änderungen an der zugrunde liegenden Datenstruktur.

Es ist immer eine gute Idee, die offizielle Elasticsearch-Dokumentation sowie unser Logstash-Tutorial und Kibana-Tutorial zu erkunden.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.