7 Konfiguracja Elasticsearch

Obsługa Elasticsearch jest eksperymentalna!

Zabbix obsługuje przechowywanie danych historycznych za pomocą Elasticsearch zamiast bazy danych. Użytkownicy mogą wybrać miejsce przechowywania danych historycznych między zgodną bazą danych a Elasticsearch. Procedura konfiguracji opisana w tej sekcji dotyczy wersji Elasticsearch 7.X. W przypadku użycia wcześniejszej lub późniejszej wersji Elasticsearch niektóre funkcje mogą nie działać zgodnie z oczekiwaniami.

1. Jeśli wszystkie dane historyczne są przechowywane w Elasticsearch, trendy nie są obliczane ani zapisywane w bazie danych. Jeśli trendy nie są obliczane i zapisywane, może być konieczne wydłużenie okresu przechowywania danych historycznych.
2. Gdy używany jest Elasticsearch, zapytania zakresowe pobierające wartości z bazy danych są ograniczone znacznikiem czasu okresu przechowywania danych.

Konfiguracja

Aby zapewnić prawidłową komunikację między wszystkimi zaangażowanymi elementami, upewnij się, że parametry pliku konfiguracyjnego serwera i pliku konfiguracyjnego frontend są poprawnie skonfigurowane.

Zabbix serwer i frontend

Szkic pliku konfiguracyjnego Zabbix serwer z parametrami do aktualizacji:

### Option: HistoryStorageURL
# HTTP[S] URL magazynu historii.
#
# Mandatory: no
# Default:
# HistoryStorageURL= 
### Option: HistoryStorageTypes
# Lista typów wartości rozdzielona przecinkami, które mają być wysyłane do magazynu historii.
#
# Mandatory: no
# Default:
# HistoryStorageTypes=uint,dbl,str,log,text

Przykładowe wartości parametrów do wpisania w pliku konfiguracyjnym Zabbix serwer :

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

Ta konfiguracja wymusza na Zabbix Server przechowywanie wartości historii typów numerycznych w odpowiedniej bazie danych, a danych historycznych tekstowych w Elasticsearch.

Elasticsearch obsługuje następujące typy pozycji:

uint,dbl,str,log,text

Wyjaśnienie obsługiwanych typów pozycji:

Typ wartości pozycji Tabela bazy danych Typ Elasticsearch
Numeryczny (bez znaku) history_uint uint
Numeryczny (zmiennoprzecinkowy) history dbl
Znakowy history_str str
Log history_log log
Tekst history_text text

Szkic pliku konfiguracyjnego frontend Zabbix (conf/zabbix.conf.php) z parametrami do aktualizacji:

// Elasticsearch url (can be string if same url is used for all types).
$HISTORY['url']   = [
      'uint' => 'http://localhost:9200',
      'text' => 'http://localhost:9200'
];
// Value types stored in Elasticsearch.
$HISTORY['types'] = ['uint', 'text'];

Przykładowe wartości parametrów do wpisania w pliku konfiguracyjnym frontend Zabbix :

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

Ta konfiguracja wymusza przechowywanie wartości historii typu Text, Character i Log w Elasticsearch.

W pliku conf/zabbix.conf.php należy również ustawić $HISTORY jako globalną zmienną, aby zapewnić poprawne działanie wszystkiego (zobacz conf/zabbix.conf.php.example, aby dowiedzieć się, jak to zrobić):

// Zabbix GUI configuration file.
global $DB, $HISTORY;
Instalowanie Elasticsearch i tworzenie mapowania

Ostatnie dwa kroki, aby wszystko zaczęło działać, to instalacja samego Elasticsearch oraz utworzenie procesu mapowania.

Aby zainstalować Elasticsearch, zapoznaj się z przewodnikiem instalacji Elasticsearch.

Mapowanie to struktura danych w Elasticsearch (podobna do tabeli w bazie danych). Mapowanie dla wszystkich typów danych historycznych jest dostępne tutaj: database/elasticsearch/elasticsearch.map.

Utworzenie mapowania jest obowiązkowe. Część funkcjonalności będzie działać nieprawidłowo, jeśli mapowanie nie zostanie utworzone zgodnie z instrukcją.

Aby utworzyć mapowanie dla typu text, wyślij do Elasticsearch następujące żądanie:

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"
         }
      }
   }
}'

Podobne żądanie należy wykonać również w celu utworzenia mapowania wartości historycznych Character i Log, z odpowiednią korektą typu.

Aby pracować z Elasticsearch, zapoznaj się z sekcją Wymagania, aby uzyskać dodatkowe informacje.

Housekeeper nie usuwa żadnych danych z Elasticsearch.

Przechowywanie danych historycznych w wielu indeksach opartych na dacie

Ta sekcja opisuje dodatkowe kroki wymagane do pracy z pipeline'ami i węzłami ingest.

Na początek należy utworzyć szablony dla indeksów.

Poniższy przykład pokazuje żądanie utworzenia szablonu uint:

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"
         }
      }
   }
}'

Aby utworzyć inne szablony, użytkownik powinien zmienić URL (ostatnia część to nazwa szablonu), zmienić pole "index_patterns", aby pasowało do nazwy indeksu, oraz ustawić prawidłowe mapowanie, które można pobrać z database/elasticsearch/elasticsearch.map.

Na przykład poniższe polecenie można wykorzystać do utworzenia szablonu dla indeksu tekstowego:

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"
         }
      }
   }
}'

Jest to wymagane, aby umożliwić Elasticsearch ustawienie prawidłowego mapowania dla indeksów tworzonych automatycznie. Następnie należy utworzyć definicję pipeline'u. Pipeline to pewnego rodzaju wstępne przetwarzanie danych przed zapisaniem ich w indeksach. Poniższe polecenie można wykorzystać do utworzenia pipeline'u dla indeksu uint:

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"
         }
      }
   ]
}'

Użytkownik może zmienić parametr zaokrąglania ("date_rounding"), aby ustawić określony okres rotacji indeksu. Aby utworzyć inne pipeline'y, użytkownik powinien zmienić URL (ostatnia część to nazwa pipeline'u) oraz zmienić pole "index_name_prefix", aby pasowało do nazwy indeksu.

Zobacz także dokumentację Elasticsearch.

Dodatkowo przechowywanie danych historycznych w wielu indeksach opartych na dacie powinno być również włączone w nowym parametrze w konfiguracji serwera Zabbix:

### Option: HistoryStorageDateIndex
# Enable preprocessing of history values in history storage to store values in different indices based on date.
# 0 - disable
# 1 - enable
#
# Mandatory: no
# Default:
# HistoryStorageDateIndex=0

Rozwiązywanie problemów

Poniższe kroki mogą pomóc w rozwiązaniu problemów z konfiguracją Elasticsearch:

  1. Sprawdź, czy mapowanie jest poprawne (żądanie GET do wymaganego adresu URL indeksu, na przykład http://localhost:9200/uint).
  2. Sprawdź, czy fragmenty nie znajdują się w stanie błędu (ponowne uruchomienie Elasticsearch powinno pomóc).
  3. Sprawdź konfigurację Elasticsearch. Konfiguracja powinna zezwalać na dostęp z hosta frontend Zabbixa oraz hosta serwera Zabbixa.
  4. Sprawdź logi Elasticsearch.
  5. LogSlowQueries można użyć do sprawdzenia wolnych zapytań w bazie danych Elasticsearch.

Jeśli nadal występują problemy z instalacją, utwórz zgłoszenie błędu, dołączając wszystkie informacje z tej listy (mapowanie, logi błędów, konfiguracja, wersja itp.)