Elasticsearch und der ELK-Stack unter Ubuntu 16.04/18.04


Elastic Stack auf Ubuntu installieren

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.

Editierte Konfigurationsdatei von Elasticsearch unter /etc/default/elasticsearch

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.

Konfigurationsdatei von Elasticsearch unter /etc/elasticsearch/elasticsearch.yml

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

Editierte Konfigurationsdatei von Elasticsearch unter /etc/elasticsearch/elasticsearch.yml

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.

Konfigurationsdatei von Kibana

Kommentiere diese Information wieder ein und mache sie zugänglich, indem du die davorstehende Raute entfernst. Das Ergebnis entnimmst du dem folgenden Screenshot.

Editierte Konfigurationsdatei von Kibana

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.

Startseite von Kibana

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.

Kibana-Console

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.

Status der Testlizenz via Kibana-Console prüfen

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.

Testlizenz via Kibana-Console bekommen

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.

Index Management in Kibana

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.

Aus unserer Rubrik zu Open Source Datenbanken und Datenbank-Plattformen auch noch interessant und hilfreich:

Zurück zur Tutorial Übersicht Back to Tutorial Overview

© 2002-2023 Phox inc. all rights reserved.

© 2002-2023 Phox inc. all rights reserved.