Einführung
Elasticsearch ist eine Plattform für die verteilte Suche und Analyse von Daten in Echtzeit. Die Popularität ist auf die einfache Bedienung, die leistungsstarken Funktionen und die Skalierbarkeit zurückzuführen.
Elasticsearch unterstützt RESTful-Operationen. Dies bedeutet, dass Sie HTTP-Methoden (GET, POST, PUT, DELETE usw.) in Kombination mit einem HTTP-URI (/collection/entry
) verwenden können, um Ihre Daten zu bearbeiten. Der intuitive RESTful-Ansatz ist sowohl entwickler- als auch benutzerfreundlich. Dies ist einer der Gründe für die Popularität von Elasticsearch.
Elasticsearch ist eine kostenlose Open-Source-Software mit einem soliden Unternehmen dahinter: Elastic. Diese Kombination macht es für den Einsatz in allen Bereichen von persönlichen Tests bis zur Unternehmensintegration geeignet.
Dieser Artikel führt Sie in Elasticsearch ein und zeigt Ihnen, wie Sie es installieren, konfigurieren, sichern und verwenden.
Voraussetzungen
Bevor Sie diesem Tutorial folgen, benötigen Sie:
-
Ein Ubuntu 16.04-Droplet, das durch Befolgen derInitial Server Setup with Ubuntu 16.04 eingerichtet wurde, einschließlich des Erstellens eines Sudo-Nicht-Root-Benutzers.
-
Das installierte Oracle JDK 8 können Sie im Abschnitt „Installieren des Oracle JDK“ vonthis Java installation article ausführen
Sofern nicht anders angegeben, sollten alle Befehle, für die in diesem Lernprogramm Root-Berechtigungen erforderlich sind, als Nicht-Root-Benutzer mit Sudo-Berechtigungen ausgeführt werden.
[[Schritt 1 - Herunterladen und Installieren von Elasticsearch]] == Schritt 1 - Herunterladen und Installieren von Elasticsearch
Elasticsearch kann direkt auselastic.co inzip
,tar.gz
,deb
oderrpm
Paketen heruntergeladen werden. Für Ubuntu ist es am besten, das Paketdeb
(Debian) zu verwenden, mit dem alles installiert wird, was Sie zum Ausführen von Elasticsearch benötigen.
Aktualisieren Sie zunächst Ihren Paketindex.
sudo apt-get update
Laden Sie die neueste Elasticsearch-Version herunter, die zum Zeitpunkt des Schreibens 2.3.1 ist.
wget https://download.elastic.co/elasticsearch/release/org/elasticsearch/distribution/deb/elasticsearch/2.3.1/elasticsearch-2.3.1.deb
Dann installieren Sie es auf die übliche Ubuntu-Weise mitdpkg
.
sudo dpkg -i elasticsearch-2.3.1.deb
Dies führt dazu, dass Elasticsearch in/usr/share/elasticsearch/
installiert wird, wobei die Konfigurationsdateien in/etc/elasticsearch
abgelegt und das Init-Skript in/etc/init.d/elasticsearch
hinzugefügt werden.
Fügen Sie das Init-Skript zu den Standard-Runlevels hinzu, um sicherzustellen, dass Elasticsearch automatisch mit dem Server gestartet und gestoppt wird.
sudo systemctl enable elasticsearch.service
Bevor Sie Elasticsearch zum ersten Mal starten, lesen Sie bitte den nächsten Abschnitt über die empfohlene Mindestkonfiguration.
[[Schritt-2 - Konfigurieren der Elasticsearch]] == Schritt 2 - Konfigurieren der Elasticsearch
Nachdem Elasticsearch und seine Java-Abhängigkeiten installiert wurden, ist es an der Zeit, Elasticsearch zu konfigurieren. Die Elasticsearch-Konfigurationsdateien befinden sich im Verzeichnis/etc/elasticsearch
. Es gibt zwei Dateien:
-
elasticsearch.yml
konfiguriert die Einstellungen des Elasticsearch-Servers. Hier werden alle Optionen außer denen für die Protokollierung gespeichert, weshalb wir uns hauptsächlich für diese Datei interessieren. -
logging.yml
bietet eine Konfiguration für die Protokollierung. Zu Beginn müssen Sie diese Datei nicht bearbeiten. Sie können alle Standardprotokollierungsoptionen beibehalten. Sie finden die resultierenden Protokolle standardmäßig in/var/log/elasticsearch
.
Die ersten Variablen, die auf einem Elasticsearch-Server angepasst werden müssen, sindnode.name
undcluster.name
inelasticsearch.yml
. Wie der Name schon sagt, gibtnode.name
den Namen des Servers (Knotens) und des Clusters an, dem dieser zugeordnet ist.
Wenn Sie diese Variablen nicht anpassen, wird automatisch einnode.name
in Bezug auf den Droplet-Hostnamen zugewiesen. Diecluster.name
werden automatisch auf den Namen des Standardclusters gesetzt.
Der Wertcluster.name
wird von der Funktion zur automatischen Erkennung von Elasticsearch verwendet, um Elasticsearch-Knoten automatisch zu erkennen und einem Cluster zuzuordnen. Wenn Sie den Standardwert nicht ändern, befinden sich möglicherweise unerwünschte Knoten im selben Netzwerk in Ihrem Cluster.
So starten Sie die Bearbeitung der Hauptkonfigurationsdatei vonelasticsearch.yml
mitnano
oder Ihrem bevorzugten Texteditor.
sudo nano /etc/elasticsearch/elasticsearch.yml
Entfernen Sie das Zeichen#
am Zeilenanfang fürcluster.name
undnode.name
, um sie zu kommentieren, und aktualisieren Sie dann ihre Werte. Ihre ersten Konfigurationsänderungen in der Datei/etc/elasticsearch/elasticsearch.yml
ollten folgendermaßen aussehen:
/etc/elasticsearch/elasticsearch.yml
. . .
cluster.name: mycluster1
node.name: "My First Node"
. . .
Dies sind die Mindesteinstellungen, mit denen Sie mit Elasticsearch beginnen können. Es wird jedoch empfohlen, den Konfigurationsteil weiterzulesen, um das Verständnis und die Feinabstimmung von Elasticsearch zu verbessern.
Eine besonders wichtige Einstellung von Elasticsearch ist die Rolle des Servers, der entweder Master oder Slave ist. Master servers sind für den Zustand und die Stabilität des Clusters verantwortlich. In großen Bereitstellungen mit vielen Clusterknoten wird empfohlen, mehr als einen dedizierten Master zu haben. In der Regel speichert ein dedizierter Master keine Daten oder erstellt keine Indizes. Daher sollte keine Überlastungsgefahr bestehen, durch die der Clusterzustand gefährdet werden könnte.
Slave servers werden als Arbeitspferde verwendet, die mit Datenaufgaben geladen werden können. Selbst wenn ein Slave-Knoten überlastet ist, sollte der Cluster-Zustand nicht ernsthaft beeinträchtigt werden, vorausgesetzt, es gibt andere Knoten, die zusätzliche Lasten aufnehmen können.
Die Einstellung, die die Rolle des Servers bestimmt, heißtnode.master
. Standardmäßig ist ein Knoten ein Master. Wenn Sie nur einen Elasticsearch-Knoten haben, sollten Sie diese Option auf den Standardwerttrue
belassen, da immer mindestens ein Master benötigt wird. Wenn Sie den Knoten alternativ als Slave konfigurieren möchten, weisen Sie der Variablennode.master
einen Wert vonfalse
wie folgt zu:
/etc/elasticsearch/elasticsearch.yml
. . .
node.master: false
. . .
Eine weitere wichtige Konfigurationsoption istnode.data
, die bestimmt, ob ein Knoten Daten speichert oder nicht. In den meisten Fällen sollte diese Option auf ihrem Standardwert (true
) belassen werden. In zwei Fällen möchten Sie möglicherweise keine Daten auf einem Knoten speichern. Einer ist, wenn der Knoten ein dedizierter Master ist ", wie zuvor erwähnt. Der andere ist, wenn ein Knoten nur zum Abrufen von Daten von Knoten und zum Aggregieren von Ergebnissen verwendet wird. Im letzteren Fall wirkt der Knoten alssearch load balancer.
Wenn Sie nur einen Elasticsearch-Knoten haben, sollten Sie diesen Wert nicht ändern. Andernfalls geben Sie zum Deaktivieren des lokalen Speicherns von Datennode.data
alsfalse
wie folgt an:
/etc/elasticsearch/elasticsearch.yml
. . .
node.data: false
. . .
In größeren Elasticsearch-Bereitstellungen mit vielen Knoten sind zwei weitere wichtige Optionenindex.number_of_shards
undindex.number_of_replicas
. Der erste bestimmt, in wie viele Teile odershards der Index aufgeteilt wird. Die zweite definiert die Anzahl der Replikate, die über den Cluster verteilt werden. Durch mehr Shards wird die Indizierungsleistung verbessert, während durch mehr Replikate die Suche beschleunigt wird.
Standardmäßig sind 5 Shards und 1 Replikate vorhanden. Angenommen, Sie untersuchen und testen Elasticsearch noch auf einem einzelnen Knoten, können Sie mit nur einem Shard und keinen Replikaten beginnen. Daher sollten ihre Werte wie folgt festgelegt werden:
/etc/elasticsearch/elasticsearch.yml
. . .
index.number_of_shards: 1
index.number_of_replicas: 0
. . .
Eine letzte Einstellung, die Sie möglicherweise ändern möchten, istpath.data
, die den Pfad bestimmt, in dem Daten gespeichert werden. Der Standardpfad ist/var/lib/elasticsearch
. In einer Produktionsumgebung wird empfohlen, eine dedizierte Partition und einen Bereitstellungspunkt zum Speichern von Elasticsearch-Daten zu verwenden. Im besten Fall handelt es sich bei dieser dedizierten Partition um ein separates Speichermedium, das eine bessere Leistung und Datenisolation bietet. Sie können einen anderenpath.data
-Pfad angeben, indem Sie ihn wie folgt angeben:
/etc/elasticsearch/elasticsearch.yml
. . .
path.data: /media/different_media
. . .
Speichern und beenden Sie die Datei, sobald Sie alle Änderungen vorgenommen haben. Jetzt können Sie Elasticsearch zum ersten Mal starten.
sudo systemctl start elasticsearch
Weisen Sie Elasticsearch einige wenige Schritte zu, bevor Sie versuchen, es zu verwenden. Andernfalls erhalten Sie möglicherweise Fehler, weil Sie keine Verbindung herstellen können.
[[Schritt-3 - Sichern der Elasticsearch]] == Schritt 3 - Sichern der Elasticsearch
Standardmäßig verfügt Elasticsearch über keine integrierte Sicherheit und kann von jedem gesteuert werden, der auf die HTTP-API zugreifen kann. Dies ist nicht immer ein Sicherheitsrisiko, da Elasticsearch nur die Loopback-Schnittstelle (d. H.127.0.0.1
) überwacht, auf die nur lokal zugegriffen werden kann. Daher ist kein öffentlicher Zugriff möglich und Elasticsearch ist sicher genug, solange allen Serverbenutzern vertraut wird oder es sich um einen dedizierten Elasticsearch-Server handelt.
Wenn Sie jedoch die Sicherheit verbessern möchten, müssen Sie zunächst die Authentifizierung aktivieren. Die Authentifizierung erfolgt durch die kommerziellenShield plugin. Leider ist dieses Plugin nicht kostenlos, aber es gibt eine kostenlose 30-Tage-Testversion, mit der Sie es testen können. Die offizielle Seite enthält ausgezeichnete Installations- und Konfigurationsanweisungen. Das einzige, was Sie möglicherweise zusätzlich wissen müssen, ist, dass der Pfad zum Installationsmanager des Elasticsearch-Plugins/usr/share/elasticsearch/bin/plugin
ist.
Wenn Sie das kommerzielle Plugin nicht verwenden möchten, aber dennoch den Remotezugriff auf die HTTP-API zulassen müssen, können Sie die Netzwerkexposition mit Ubuntus Standard-Firewall UFW (Uncomplicated Firewall) zumindest einschränken. Standardmäßig ist UFW installiert, aber nicht aktiviert. Wenn Sie es verwenden möchten, gehen Sie folgendermaßen vor:
Erstellen Sie zunächst eine Regel, um alle erforderlichen Dienste zuzulassen. Sie müssen mindestens SSH zulassen, damit Sie sich am Server anmelden können. Um den weltweiten Zugriff auf SSH zu ermöglichen, Whitelist-Port 22.
sudo ufw allow 22
Ermöglichen Sie dann den Zugriff auf den Standard-HTTP-API-Port von Elasticsearch (TCP 9200) für den vertrauenswürdigen Remote-Host, z. B.TRUSTED_IP
, wie folgt:
sudo ufw allow from TRUSTED_IP to any port 9200
Erst danach aktivieren Sie UFW mit dem Befehl:
sudo ufw enable
Überprüfen Sie abschließend den Status von UFW mit dem folgenden Befehl:
sudo ufw status
Wenn Sie die Regeln korrekt angegeben haben, sollte die Ausgabe folgendermaßen aussehen:
Output of java -versionStatus: active
To Action From
-- ------ ----
9200 ALLOW TRUSTED_IP
22 ALLOW Anywhere
22 (v6) ALLOW Anywhere (v6)
Sobald Sie bestätigt haben, dass UFW aktiviert ist und den Elasticsearch-Port 9200 schützt, können Sie Elasticsearch erlauben, auf externe Verbindungen zu warten. Öffnen Sie dazu die Konfigurationsdatei vonelasticsearch.yml
erneut.
sudo nano /etc/elasticsearch/elasticsearch.yml
Suchen Sie die Zeile mitnetwork.bind_host
, kommentieren Sie sie aus, indem Sie das Zeichen#
am Zeilenanfang entfernen, und ändern Sie den Wert in0.0.0.0
, sodass er folgendermaßen aussieht:
/etc/elasticsearch/elasticsearch.yml
. . .
network.host: 0.0.0.0
. . .
Wir haben0.0.0.0
angegeben, damit Elasticsearch alle Schnittstellen und gebundenen IPs abhört. Wenn Sie möchten, dass es nur eine bestimmte Schnittstelle abhört, können Sie die IP-Adresse anstelle von0.0.0.0
angeben.
Starten Sie Elasticsearch mit dem folgenden Befehl neu, damit die obige Einstellung wirksam wird:
sudo systemctl restart elasticsearch
Versuchen Sie anschließend, eine Verbindung vom vertrauenswürdigen Host zu Elasticsearch herzustellen. Wenn Sie keine Verbindung herstellen können, stellen Sie sicher, dass die UFW funktioniert und die Variablenetwork.host
korrekt angegeben wurde.
[[Schritt-4 -—- Testen der Elastiksuche]] == Schritt 4 - Testen der Elastiksuche
Inzwischen sollte Elasticsearch auf Port 9200 ausgeführt werden. Sie können es mitcurl
, dem clientseitigen Befehlszeilen-URL-Übertragungstool und einer einfachen GET-Anforderung testen.
curl -X GET 'http://localhost:9200'
Sie sollten die folgende Antwort sehen:
Output of curl{
"name" : "My First Node",
"cluster_name" : "mycluster1",
"version" : {
"number" : "2.3.1",
"build_hash" : "bd980929010aef404e7cb0843e61d0665269fc39",
"build_timestamp" : "2016-04-04T12:25:05Z",
"build_snapshot" : false,
"lucene_version" : "5.5.0"
},
"tagline" : "You Know, for Search"
}
Wenn Sie eine ähnliche Antwort wie oben sehen, funktioniert Elasticsearch ordnungsgemäß. Ist dies nicht der Fall, vergewissern Sie sich, dass Sie die Installationsanweisungen korrekt befolgt und einige Zeit für den vollständigen Start von Elasticsearch eingeplant haben.
Führen Sie den folgenden Befehl aus, um eine gründlichere Überprüfung von Elasticsearch durchzuführen:
curl -XGET 'http://localhost:9200/_nodes?pretty'
In der Ausgabe des obigen Befehls können Sie alle aktuellen Einstellungen für Knoten, Cluster, Anwendungspfade, Module usw. anzeigen und überprüfen.
[[Schritt-5 -—- Verwenden von Elasticsearch]] == Schritt 5 - Verwenden von Elasticsearch
Fügen Sie zunächst einige Daten hinzu, um Elasticsearch zu verwenden. Wie bereits erwähnt, verwendet Elasticsearch eine RESTful-API, die auf die üblichen CRUD-Befehle reagiert:create,read,update unddelete. Um damit zu arbeiten, verwenden wir erneutcurl
.
Sie können Ihren ersten Eintrag mit dem folgenden Befehl hinzufügen:
curl -X POST 'http://localhost:9200/tutorial/helloworld/1' -d '{ "message": "Hello World!" }'
Sie sollten die folgende Antwort sehen:
Output{"_index":"tutorial","_type":"helloworld","_id":"1","_version":1,"_shards":{"total":2,"successful":1,"failed":0},"created":true}
Mitcuel
haben wir eine HTTP-POST-Anfrage an den Elasticsearch-Server gesendet. Der URI der Anforderung war/tutorial/helloworld/1
mit mehreren Parametern:
-
tutorial
ist der Index der Daten in Elasticsearch. -
helloworld
ist der Typ. -
1
ist die ID unseres Eintrags unter dem obigen Index und Typ.
Sie können diesen ersten Eintrag mit einer HTTP-GET-Anforderung abrufen.
curl -X GET 'http://localhost:9200/tutorial/helloworld/1'
Das Ergebnis sollte so aussehen:
Output{"_index":"tutorial","_type":"helloworld","_id":"1","_version":1,"found":true,"_source":{ "message": "Hello World!" }}
Um einen vorhandenen Eintrag zu ändern, können Sie eine HTTP-PUT-Anforderung verwenden.
curl -X PUT 'localhost:9200/tutorial/helloworld/1?pretty' -d '
{
"message": "Hello People!"
}'
Elasticsearch sollte eine erfolgreiche Änderung wie folgt bestätigen:
Output{
"_index" : "tutorial",
"_type" : "helloworld",
"_id" : "1",
"_version" : 2,
"_shards" : {
"total" : 2,
"successful" : 1,
"failed" : 0
},
"created" : false
}
Im obigen Beispiel haben wir diemessage
des ersten Eintrags in "Hallo Leute!" Geändert. Damit wurde die Versionsnummer automatisch auf2
erhöht.
Möglicherweise haben Sie das zusätzliche Argumentpretty
in der obigen Anforderung bemerkt. Es aktiviert ein für Menschen lesbares Format, sodass Sie jedes Datenfeld in eine neue Zeile schreiben können. Sie können Ihre Ergebnisse auch beim Abrufen von Daten „verschönern“ und eine viel schönere Ausgabe erhalten:
curl -X GET 'http://localhost:9200/tutorial/helloworld/1?pretty'
Jetzt hat die Antwort ein viel besseres Format:
Output{
"_index" : "tutorial",
"_type" : "helloworld",
"_id" : "1",
"_version" : 2,
"found" : true,
"_source" : {
"message" : "Hello People!"
}
}
Bisher haben wir Daten in Elasticsearch hinzugefügt und abgefragt. Um mehr über die anderen Operationen zu erfahren, überprüfen Sie bittethe API documentation.
Fazit
So einfach können Sie Elasticsearch installieren, konfigurieren und verwenden. Sobald Sie genug mit manuellen Abfragen gespielt haben, besteht Ihre nächste Aufgabe darin, sie in Ihren Anwendungen zu verwenden.