8 Elasticsearch-Einrichtung

Die Unterstützung von Elasticsearch ist experimentell!

Zabbix unterstützt die Speicherung historischer Daten mithilfe von Elasticsearch anstelle einer Datenbank. Benutzer können den Speicherort für historische Daten zwischen einer kompatiblen Datenbank und Elasticsearch wählen. Das in diesem Abschnitt beschriebene Einrichtungsverfahren gilt für Elasticsearch Version 7.X. Wenn eine frühere oder spätere Version von Elasticsearch verwendet wird, funktioniert möglicherweise einige Funktionalität nicht wie vorgesehen.

1. Wenn alle Verlaufsdaten in Elasticsearch gespeichert werden, werden Trends nicht berechnet und auch nicht in der Datenbank gespeichert. Wenn keine Trends berechnet und gespeichert werden, muss der Speicherzeitraum für Verlaufsdaten möglicherweise verlängert werden.
2. Wenn Elasticsearch verwendet wird, sind Bereichsabfragen, die Werte aus der Datenbank abrufen, durch den Zeitstempel des Datenspeicherzeitraums begrenzt.

Konfiguration

Um eine ordnungsgemäße Kommunikation zwischen allen beteiligten Elementen sicherzustellen, stellen Sie sicher, dass die Parameter der Server-Konfigurationsdatei und der Frontend-Konfigurationsdatei korrekt konfiguriert sind.

Zabbix Server und Frontend

Entwurf der Zabbix-Server-Konfigurationsdatei mit zu aktualisierenden Parametern:

### Option: HistoryStorageURL
# HTTP[S]-URL des History-Speichers.
#
# Mandatory: no
# Default:
# HistoryStorageURL= 
### Option: HistoryStorageTypes
# Durch Kommas getrennte Liste von Werttypen, die an den History-Speicher gesendet werden.
#
# Mandatory: no
# Default:
# HistoryStorageTypes=uint,dbl,str,log,text

Beispielwerte für Parameter, mit denen die Zabbix-Server-Konfigurationsdatei gefüllt werden soll:

HistoryStorageURL=http://test.elasticsearch.lan:9200
HistoryStorageTypes=str,log,text

Diese Konfiguration erzwingt, dass Zabbix Server History-Werte numerischer Typen in der entsprechenden Datenbank und textuelle History-Daten in Elasticsearch speichert.

Elasticsearch unterstützt die folgenden Datentypen:

uint,dbl,str,log,text

Erläuterung der unterstützten Datentypen:

Datenpunkttyp Datenbanktabelle Elasticsearch-Typ
Numerisch (vorzeichenlos) history_uint uint
Numerisch (Gleitkomma) history dbl
Zeichen history_str str
Log history_log log
Text history_text text

Entwurf der Zabbix-Frontend-Konfigurationsdatei (conf/zabbix.conf.php) mit zu aktualisierenden Parametern:

// Elasticsearch-URL (kann ein String sein, wenn für alle Typen dieselbe URL verwendet wird).
$HISTORY['url']   = [
      'uint' => 'http://localhost:9200',
      'text' => 'http://localhost:9200'
];
// In Elasticsearch gespeicherte Werttypen.
$HISTORY['types'] = ['uint', 'text'];

Beispielwerte für Parameter, mit denen die Zabbix-Frontend-Konfigurationsdatei gefüllt werden soll:

$HISTORY['url']   = 'http://test.elasticsearch.lan:9200';
$HISTORY['types'] = ['str', 'text', 'log'];

Diese Konfiguration erzwingt, dass History-Werte vom Typ Text, Character und Log in Elasticsearch gespeichert werden.

Außerdem ist es erforderlich, $HISTORY in conf/zabbix.conf.php global zu machen, um sicherzustellen, dass alles ordnungsgemäß funktioniert (siehe conf/zabbix.conf.php.example für die Vorgehensweise):

// Zabbix-GUI-Konfigurationsdatei.
global $DB, $HISTORY;
Elasticsearch installieren und Mapping erstellen

Die letzten beiden Schritte, damit alles funktioniert, sind die Installation von Elasticsearch selbst und das Erstellen des Mapping-Prozesses.

Für die Installation von Elasticsearch lesen Sie bitte die Elasticsearch-Installationsanleitung.

Mapping ist eine Datenstruktur in Elasticsearch (ähnlich einer Tabelle in einer Datenbank). Das Mapping für alle History-Datentypen ist hier verfügbar: database/elasticsearch/elasticsearch.map.

Das Erstellen des Mappings ist zwingend erforderlich. Einige Funktionen werden nicht funktionieren, wenn das Mapping nicht gemäß der Anleitung erstellt wird.

Um das Mapping für den Typ text zu erstellen, senden Sie die folgende Anfrage an Elasticsearch:

curl -X PUT \
 http://your-elasticsearch.here:9200/text \
 -H 'content-type:application/json' \
 -d '{
   "settings": {
      "index": {
         "number_of_replicas": 1,
         "number_of_shards": 5
      }
   },
   "mappings": {
      "properties": {
         "itemid": {
            "type": "long"
         },
         "clock": {
            "format": "epoch_second",
            "type": "date"
         },
         "value": {
            "fields": {
               "analyzed": {
                  "index": true,
                  "type": "text",
                  "analyzer": "standard"
               }
            },
            "index": false,
            "type": "text"
         }
      }
   }
}'

Eine ähnliche Anfrage muss auch für die Erstellung des Mappings der History-Werte Character und Log ausgeführt werden, jeweils mit der entsprechenden Typkorrektur.

Für die Arbeit mit Elasticsearch lesen Sie bitte die Anforderungen für weitere Informationen.

Housekeeper löscht keine Daten aus Elasticsearch.

Speichern von Verlaufsdaten in mehreren datumsbasierten Indizes

Dieser Abschnitt beschreibt zusätzliche Schritte, die für die Arbeit mit Pipelines und Ingest-Nodes erforderlich sind.

Zunächst müssen Sie Vorlagen für Indizes erstellen.

Das folgende Beispiel zeigt eine Anfrage zum Erstellen einer uint-Vorlage:

curl -X PUT \
 http://your-elasticsearch.here:9200/_template/uint_template \
 -H 'content-type:application/json' \
 -d '{
   "index_patterns": [
      "uint*"
   ],
   "settings": {
      "index": {
         "number_of_replicas": 1,
         "number_of_shards": 5
      }
   },
   "mappings": {
      "properties": {
         "itemid": {
            "type": "long"
         },
         "clock": {
            "format": "epoch_second",
            "type": "date"
         },
         "value": {
            "type": "long"
         }
      }
   }
}'

Um andere Vorlagen zu erstellen, sollte der Benutzer die URL ändern (der letzte Teil ist der Name der Vorlage), das Feld "index_patterns" so anpassen, dass es zum Indexnamen passt, und ein gültiges Mapping festlegen, das aus database/elasticsearch/elasticsearch.map übernommen werden kann.

Beispielsweise kann der folgende Befehl verwendet werden, um eine Vorlage für einen Textindex zu erstellen:

curl -X PUT \
 http://your-elasticsearch.here:9200/_template/text_template \
 -H 'content-type:application/json' \
 -d '{
   "index_patterns": [
      "text*"
   ],
   "settings": {
      "index": {
         "number_of_replicas": 1,
         "number_of_shards": 5
      }
   },
   "mappings": {
      "properties": {
         "itemid": {
            "type": "long"
         },
         "clock": {
            "format": "epoch_second",
            "type": "date"
         },
         "value": {
            "fields": {
               "analyzed": {
                  "index": true,
                  "type": "text",
                  "analyzer": "standard"
               }
            },
            "index": false,
            "type": "text"
         }
      }
   }
}'

Dies ist erforderlich, damit Elasticsearch ein gültiges Mapping für automatisch erstellte Indizes festlegen kann. Anschließend muss die Pipeline-Definition erstellt werden. Eine Pipeline ist eine Art Vorverarbeitung von Daten, bevor diese in Indizes geschrieben werden. Mit dem folgenden Befehl kann eine Pipeline für einen uint-Index erstellt werden:

curl -X PUT \
 http://your-elasticsearch.here:9200/_ingest/pipeline/uint-pipeline \
 -H 'content-type:application/json' \
 -d '{
   "description": "daily uint index naming",
   "processors": [
      {
         "date_index_name": {
            "field": "clock",
            "date_formats": [
               "UNIX"
            ],
            "index_name_prefix": "uint-",
            "date_rounding": "d"
         }
      }
   ]
}'

Der Benutzer kann den Rundungsparameter ("date_rounding") ändern, um einen bestimmten Rotationszeitraum für Indizes festzulegen. Um andere Pipelines zu erstellen, sollte der Benutzer die URL ändern (der letzte Teil ist der Name der Pipeline) und das Feld "index_name_prefix" so anpassen, dass es zum Indexnamen passt.

Siehe auch die Elasticsearch-Dokumentation.

Zusätzlich sollte das Speichern von Verlaufsdaten in mehreren datumsbasierten Indizes auch über den neuen Parameter in der Konfiguration des Zabbix-Servers aktiviert werden:

### Option: HistoryStorageDateIndex
# Aktiviert die Vorverarbeitung von Verlaufswerten im Verlaufsspeicher, um Werte in verschiedenen Indizes basierend auf dem Datum zu speichern.
# 0 - deaktivieren
# 1 - aktivieren
#
# Mandatory: no
# Default:
# HistoryStorageDateIndex=0

Fehlerbehebung

Die folgenden Schritte können Ihnen bei der Fehlerbehebung von Problemen mit der Elasticsearch-Einrichtung helfen:

  1. Prüfen Sie, ob das Mapping korrekt ist (GET-Anfrage an die erforderliche Index-URL, z. B. http://localhost:9200/uint).
  2. Prüfen Sie, ob sich die Shards nicht in einem fehlgeschlagenen Zustand befinden (ein Neustart von Elasticsearch sollte helfen).
  3. Prüfen Sie die Konfiguration von Elasticsearch. Die Konfiguration sollte den Zugriff vom Zabbix Frontend-Host und vom Zabbix Server-Host aus erlauben.
  4. Prüfen Sie die Elasticsearch-Protokolle.
  5. LogSlowQueries kann verwendet werden, um langsame Abfragen in der Elasticsearch-Datenbank zu überprüfen.

Wenn weiterhin Probleme mit Ihrer Installation auftreten, erstellen Sie bitte einen Fehlerbericht mit allen Informationen aus dieser Liste (Mapping, Fehlerprotokolle, Konfiguration, Version usw.)