In der Sammlung unserer Tutorials habe ich dir gezeigt, wie du MySQL, PostgreSQL, MongoDB, Apache Cassandra, Redis, RethinkDB, InfluxDB, Neo4j, ArangoDB und OrientDB unter Ubuntu installierst, einrichtest und erste Schritte damit umsetzt. Ich erweitere die Reihe, indem ich dir die NoSQL-Datenbank-Plattform Elasticsearch vorstelle, dir bei der Installation sowie der Konfiguration helfe und dir ein paar Basics vorführe. Dabei ist wichtig zu berücksichtigen, dass Elasticsearch Teil eines Stacks ist, dem so genannten ELK-Stack. Weitere Bestandteile dieses Stacks sind Logstash und Kibana. Zusätzlich zu den genannten Stack-Elementen dient Nginx zur Lastenverteilung und Reverse-Proxy-Authentifizierung für Elasticsearch, weswegen ich eines der folgenden Kapitel zusätzlich dessen Installation und Konfiguration widme.
Zu Elasticsearch und dem ELK-Stack
Als REST-basierte Such- und Analytik-Engine macht Elasticsearch für dich die Suche und Analyse deiner Daten in Echtzeit möglich. Es lassen sich viele Arten von Suchanfragen durchführen und kombinieren und somit Daten großflächig erfassen.
Elasticsearch verwendet standardmäßige RESTful APIs und JSON, arbeitet schemalos und dokumentenorientiert. Intern legt Elasticsearch die Dokumente in Indizes ab, wobei unter einem Index beliebig viele Dokumente unterschiedlichen Typs abgelegt werden können.
Logstash wirkt im Stack als Pipeline zum Sammeln, Verarbeiten und Weiterleiten von Ereignissen. Kibana baut als browserbasierte Open-Source-Analyseplattform auf der Suchmaschine Elasticsearch auf und ermöglicht u.a. die Suche und Visualisierung der in Elasticsearch-Indizes enthaltenen Daten.
Voraussetzung
Du musst Java auf deinem Server installieren. Eine Anleitung hierzu findest du in unserem Tutorial zum Thema Neo4j unter Ubuntu 16.04/18.04 installieren und einrichten.
Installation und Konfiguration von Elasticsearch
Gewährleiste mittels dem folgenden Kommando, dass dein Server up to date ist.
apt-get update && apt-get upgrade
Dann lädst du den GPG-Key zu Elasticsearch herunter.
wget -qO - https://packages.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
Im Anschluss daran fügst du das Repository von Elasticsearch mit folgendem Befehl hinzu. Solltest du eine andere Versionsnummer von Elasticsearch installieren möchten, dann kannst du diese im untenstehenden Kommando entsprechend anpassen.
echo "deb https://artifacts.elastic.co/packages/6.x/apt stable main" | sudo tee -a /etc/apt/sources.list.d/elastic-6.x.list
Führe mit dem neuen Repository ein Update auf deinem Server durch.
apt-get update
Schließlich installierst du daraufhin Elasticsearch.
apt-get -y install elasticsearch
Danach ist es notwendig in den beiden Konfigurationsdateien /etc/default/elasticsearch und /etc/elasticsearch/elasticsearch.yml jeweils eine Anpassung vorzunehmen. Zunächst öffnest du die Erstere der Beiden mit dem Kommando unten im nano-Editor.
nano /etc/default/elasticsearch
Unterhalb der Headline fügst du dann als neuen Inhalt den unten eingeblendeten Code hinzu.
START_DAEMON=true
Der folgende Screenshot zeigt dir, wie dies am Ende aussehen soll.
Nach diesem Update speicherst du die Konfigurationsdatei mit der Tastenkombination Strg+O, bestätigst die Speicherung mit der Taste Enter und verlässt den Editor dann mit der Tastenkombination Strg+X.
Als nächstes öffnest du die Zweite der beiden Konfigurationsdateien im nano-Editor,
nano /etc/elasticsearch/elasticsearch.yml
scrollst darin bis zur Network-Sektion und machst die Zeile ausfindig, in der die Information zu network.host hinterlegt ist. Im Screenshot unten ist diese farblich hervorgehoben.
Du entfernst die Raute zu Beginn der Zeile, um diese wieder rein zu kommentieren und änderst diese Information entsprechend in localhost um, wie im Code-Snippet unten und im darauf folgenden Screenshot zu sehen.
network.host: localhost
Schließlich speicherst und verlässt du den nano-Editor auf dieselbe Weise wie in der Konfigurationsdatei zuvor. Restarte den Service von Elasticsearch und füge diesen dem Boot mit Hilfe der beiden folgenden Kommandos hinzu.
service elasticsearch restart
systemctl enable elasticsearch
Verifiziere danach mit dem unten eingeblendeten Befehl den Status dieses Service.
service elasticsearch status
Dabei sollte dir folgendes Output im Terminal wiedergegeben werden, das dir bestätigt, dass der Service aktiv ist.
● elasticsearch.service - Elasticsearch
Loaded: loaded (/usr/lib/systemd/system/elasticsearch.service; enabled; vendor preset: enabled)
Active: active (running) since Tue 2018-07-31 08:07:28 CEST; 7h ago
Docs: http://www.elastic.co
Main PID: 7025 (java)
CGroup: /system.slice/elasticsearch.service
├─7025 /usr/bin/java -Xms1g -Xmx1g -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=75 -XX:+UseCMSInitiating
└─7106 /usr/share/elasticsearch/modules/x-pack/x-pack-ml/platform/linux-x86_64/bin/controller
Jul 31 08:07:28 server-ou11tvdq systemd[1]: Started Elasticsearch.
lines 1-10/10 (END)
Installation und Konfiguration von Kibana
Zur Installation von Kibana führst du auf deinem Server im Terminal zunächst das Kommando aus, das wir dir im betreffenden Tutorial zum Thema Kibana auf Ubuntu installieren im Kapitel Kibana installieren zeigen. Daraufhin ist es notwendig in der Konfigurationsdatei von Kibana eine Anpassung vorzunehmen. Öffne diese Datei im nano-Editor
nano /etc/kibana/kibana.yml
und machst die Zeile ausfindig, in der die Information zu server.host hinterlegt ist, wie im unten präsentierten Screenshot farblich hervorgehoben.
Kommentiere diese Information wieder ein und mache sie zugänglich, indem du die davorstehende Raute entfernst. Das Ergebnis entnimmst du dem folgenden Screenshot.
Hiernach speicherst du die Konfigurationsdatei mit der Tastenkombination Strg+O, bestätigst die Speicherung mit der Taste Enter und verlässt den Editor mit der Tastenkombination Strg+X. Um den Installations- und Konfigurationsprozess zu finalisieren, befolgst du die Terminal-Befehle, wie ich sie dir im Tutorial Kibana auf Ubuntu installieren im Kapitel Kibana als Service starten bereitstelle.
Installation und Konfiguration von Nginx
Nun installierst du Nginx mit dem folgenden Kommando
apt-get install nginx
und entfernst daraufhin die default-Konfiguration.
rm /etc/nginx/sites-enabled/default
Auch im Fall von Nginx musst du eine Anpassung an der Konfiguration vornehmen. Hierzu öffnest du die im Code-Snippet ersichtlich werdende Datei im nano-Editor
nano /etc/nginx/sites-available/kibana
und befüllst diese mit dem Code, den du im Code-Block unten siehst. Hierbei fügst du Nginx Config Reverse Proxy auf Port 80 zu Kibana Port 5601 hinzu. Speichere dies und beende die Editierung, indem du den nano-Editor verlässt.
server {
listen 80;
location / {
proxy_pass http://localhost:5601;
}
}
Erstelle im Anschluss daran eine symbolische Verbindung zur nginx-Konfiguration.
ln -s /etc/nginx/sites-available/kibana /etc/nginx/sites-enabled/kibana
Schließlich führst du dann noch die beiden unten vorgegebenen Kommandos im Terminal aus, um zu gewährleisten, dass Nginx auf deinem Server aktiv ist.
systemctl restart nginx
systemctl status nginx
Installation und Konfiguration von Logstash
Abschließend installierst du Logstash.
apt -y install logstash
Öffne hiernach die Konfigurationsdatei im nano-Editor
nano /etc/logstash/conf.d/logstash-simple.conf
und füge eine benutzerdefinierte logstash-Konfiguration hinzu, indem die den Code in die Datei einbindest, den ich dir im untenstehenden Code-Snippet zur Verfügung stelle. Speichere wie gewohnt das von dir durchgeführte Update und verlasse den nano-Editor.
input {
tcp {
port => 514
type => syslog
}
udp {
port => 514
type => syslog
}
}
output {
elasticsearch {
hosts => ["localhost"]
}
}
Schließe Java von privilegierten Ports aus, denn es kann Port 514 verwenden, der auf Ubuntu privilegiert ist.
setcap cap_net_bind_service=+epi /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java
Je nachdem wie du Java installiert hast, kann der Java-Pfad bei dir anders sein, als der im oben gezeigten Code-Snippet. Wäre dies der Fall, müsstest du diesen entsprechend im oben eingeblendeten Kommando anpassen.
Mit dem folgende Befehl
which java
oder alternativ
whereis java
könntest du den symbolischen Link herausfinden, der wiederrum weiterführend Aufschluss zum Standort bzw. zum Pfad der aktuellen jre-Datei geben könnte. In der Regel sollte es sich bei diesem symbolischen Link um /usr/bin/java handeln. Das unten aufgeführte Kommando würde dir dazu dienen, den korrekten Pfad deiner Java-Distribution ausfindig zu machen.
readlink -f /usr/bin/java
Letztlich führst du im Terminal dann noch die drei folgenden Befehle aus, um zu verifizieren, dass Logstash auf deinem Server aktiv ist.
systemctl restart logstash
systemctl enable logstash
systemctl status logstash
Getting started mit Kibana
Die browserbasierte Open-Source-Analyseplattform von Kibana erreichst du, nachdem du meine Installations- und Konfigurations-Tipps aus den vorherigen Kapiteln befolgt hast und dann im Browser http://localhost/app/kibana eingibst. Hierbei tauscht du localhost mit der IP deines Servers aus.
Dem unten eingeblendeten Screenshot entnimmst du die Startseite, auf der du die Features verbildlicht durch Icons übersichtlich aufgeführt hast und diese rasch erreichen kannst. Eine Anmeldung zur Plattform ist nicht notwendig.
In der Dokumentation von Elasticsearch findest du u.a. Informationen zur Nutzung von Kibana. Über das Console-Icon auf der Startseite oder analog dazu über den Menüpunkt DevTools gelangst du zur Konsole, in der du sämtliche Queries, die von Elasticsearch interpretiert werden können, ausführen kannst. Beginnt deine Query mit GET, dann möchtest du Daten einlesen und dir wiedergeben lassen. Beginnt diese jedoch mit POST, dann fügst du Daten hinzu. Startet deine Query mit PUT, erstellst du Daten und mit DELETE leitest du die Löschung von Daten ein.
In der linken Seite der Konsole kannst du deine Query formulieren und ausführen. Auf der rechte Seite entnimmst du das auf die Query generierte Output.
Um die Graph-Funktion von Kibana zu nutzen, musst du sicherstellen, dass du eine Testlizenz bekommen kannst. Hierzu kannst du die Konsole von Kibana nutzen. Dort gibst du zunächst den untenstehenden Code ein
GET _xpack/license/trial_status
und führst diesen aus, sodass dein Output dem gleicht, wie im folgenden Screenshot auf der rechten Hälfte der Konsole veranschaulicht.
Danach führst du folgenden Code via Kibana-Konsole aus,
POST _xpack/license/start_trial?acknowledge=true
sodass du in der Konsole zur Rechten das Output erhältst, das dir der Screenshot unten präsentiert.
Zur weiteren Nutzung der Konsole:
Bei den Indizierungs-, Such-, Aktualisierungs- und Löschoperationen beziehst du dich immer auf den Namen eines Index, da Dokumente in Elasticsearch unter Indexen geführt werden. Unter ein und demselben Index kann eine beliebige Menge von Dokumenten enthalten sein. Ein Index dient in der Regel zur Sammlung von Dokumenten mit einem ähnlichen Merkmal und somit zur eindeutigen Identifikation dieser. Ein Dokument als Informationseinheit wird im JSON-Format ausgedrückt.
Gefolgt auf einen Index kannst du die Information zum Typ in deine Query mit aufnehmen. Ein Typ ist eine logische Kategorie/Partition eines Index. Für ein und denselben Index kann mehr als ein Typ definiert werden. Zusätzlich kannst du in deiner Query die ID des Index mit angeben. Beim Typ und der ID handelt es sich um zwei Arten von Meta-Feldern. Informationen zu allen verfügbaren Meta-Feldern für deine Queries entnimmst der Dokumentation von Elasticsearch.
Elasticsearch macht es möglich einen Index in mehrere Teile zu zerlegen, die wiederum Shards genannt werden. Jeder Shard ist an sich ein voll funktionsfähiger und eigenständiger Index, der auf jedem Knoten innerhalb des Clusters gehostet werden kann.
Würdest du über die Konsole einen Index erstellen, könnte die Query z.B. folgender Syntax folgen, wie du sie im Code-Snippet unten erkennst.
PUT index
Würdest du bei der Query Meta-Felder, wie de Typ und die ID einsetzen, könntest du den Index spezifizieren und eine Property oder eine beliebige Menge an Properties definieren.
PUT index/type/id
{
"property1": type1,
"property2": type2,
…
}
Zur Veranschaulichung habe ich beispielhaft einen Datensatz angelegt, wie du dem Code im unten präsentierten Snippet entnimmst. Das Dokument unter der ID 1010 gehört dem Index auto an. Ich könnte nun im Nachgang weitere Dokumente zu diesem Index erstellen, indem ich diese alle durch unterschiedliche IDs voneinander differenzierbar mache.
PUT auto/_doc/1010
{
"year_of_construction": 2013,
"color": "white",
"brand": "Audi"
}
Wenn ich daraufhin im Menü den Punkt Management aufrufe und dort den Button Index Management betätige, werden mir alle in der Datenbank befindlichen Indexe aufgelistet, wie du im Screenshot unten erkennst. Beim Klick auf einen Index wird zur Rechten eine Übersicht zur Informationsstruktur im Dokument bereitgestellt. Wie dir der Screenshot unten zeigt, kann man im Tab Mapping nachvollziehen, wie die Felder im Dokument definiert sind.
Alternativ zu oben vorgeführten Query zum auto-Index hätte ich auch folgende Syntax nutzen können, in der ich explizit das Mapping antriggere.
PUT index/type/id
{
"mappings": {
"doc": {
"properties": {
"property1": {"type": data type1},
"property2": {"type": data type2},
...
}
}
}
}
Beim Mapping wird festgelegt, wie ein Dokument und die darin enthaltenen Felder gespeichert und indiziert werden. Hiermit lassen sich die Felder im Dokument definieren. Eine Übersicht zu den Parametern, die beim Mapping verwendet werden, und zu den Strukturen, die ein Mapping haben kann, bietet dir die Dokumentation von Elasticsearch.
Die oben eingeblendete Syntax in Anwendung auf die zuvor vorgeführte Query zum auto-Index, sähe so aus, wie du im Code-Block unten siehst.
PUT auto/_doc/1010
{
"mappings": {
"doc": {
"properties": {
"year_of_construction": 2013,
"color": "white",
"brand": "Audi"
}
}
}
}
Wie ich dir bereits mitgeteilt habe, gelangst du an in der Datenbank befindliche Daten, indem du deine Query mit GET beginnst. Eine einfach gestrickte Query könnte der Syntax folgen, wie du sie unten siehst.
GET index
Soll deine Query ausgereifter ausfallen, kannst du Einfluss auf die Treffermenge nehmen, indem du auf Basis bestimmter Felder suchst (Stichwort: query), auf Basis bestimmter Felder aggregierst (Stichwort: aggs), auf Basis bestimmter Felder (Stichwort: sort) sortierst und/oder bestimmte Felder in Skripten adressierst (Stichwort: script_fields).
GET index/_search
{
"query": {
...
},
"aggs": {
...
},
"sort": [
...
],
"script_fields": {
...
}
}
Beim Löschen eines Index verwendest du die Syntax, wie sie im Code-Snippet unten zu sehen ist.
DELETE index
Fazit
Die Installation und Konfiguration der Komponenten des ELK-Stacks haben wir zusammen gemeistert. Ich habe dir die Basics der Nutzung der Konsole in der Weboberfläche von Kibana gezeigt und dir dabei die Syntax der Elasticsearch-Queries nahe gebracht. Eine detaillierte und umfangreiche Dokumentation bietet dir hierzu Elasticsearch selbst, sodass du einen jederzeit abrufbaren Leitfaden bei der Realisierung deiner Projekte hast.