6 Konfiguracja Elasticsearch

Wsparcie dla Elasticsearch jest eksperymentalne!

Zabbix obsługuje przechowywanie danych historycznych za pomocą Elasticsearch zamiast bazy danych. Użytkownicy mogą wybrać miejsce przechowywania danych historycznych między kompatybilną 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ć poprawnie.

Jeśli wszystkie dane historyczne są przechowywane w Elasticsearch, trendy nie są obliczane ani przechowywane w bazie danych. Bez obliczonych i przechowywanych trendów, może być konieczne wydłużenie okresu przechowywania historii.

Konfiguracja

Aby zapewnić poprawną komunikację między wszystkimi zaangażowanymi elementami, upewnij się, że plik konfiguracyjny serwera oraz parametry pliku konfiguracyjnego frontendu są prawidłowo skonfigurowane.

Serwer i frontend Zabbix

Wersja robocza pliku konfiguracyjnego serwera Zabbix z parametrami do zaktualizowania:

### Option: HistoryStorageURL
       # History storage HTTP[S] URL.
       #
       # Mandatory: no
       # Default:
       # HistoryStorageURL= 
       ### Option: HistoryStorageTypes
       # Comma separated list of value types to be sent to the history storage.
       #
       # Mandatory: no
       # Default:
       # HistoryStorageTypes=uint,dbl,str,log,text

Przykładowe wartości parametrów do uzupełnienia pliku konfiguracyjnego serwera Zabbix:

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

Ta konfiguracja zmusza serwer Zabbix do przechowywania wartości historycznych typów numerycznych w odpowiedniej bazie danych i danych 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
Liczba (całkowita bez znaku) history_uint uint
Liczba (zmiennoprzecinkowa) history dbl
Znak history_str str
Log history_log log
Tekst history_text text

Wersja robocza pliku konfiguracyjnego frontendu Zabbix (conf/zabbix.conf.php) z parametrami do zaktualizowania:

// Adres URL Elasticsearch (może być łańcuchem znaków, jeśli ten sam adres URL jest używany dla wszystkich typów).
       $HISTORY['url']   = [
             'uint' => 'http://localhost:9200',
             'text' => 'http://localhost:9200'
       ];
       // Typy wartości przechowywane w Elasticsearch.
       $HISTORY['types'] = ['uint', 'text'];

Przykładowe wartości parametrów do uzupełnienia pliku konfiguracyjnego frontendu Zabbix:

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

Ta konfiguracja zmusza do przechowywania wartości historycznych Tekst, Znak i Log w Elasticsearch.

Konieczne jest również zrobienie $HISTORY globalnym w pliku conf/zabbix.conf.php, aby zapewnić prawidłowe działanie całości (zobacz conf/zabbix.conf.php.example jak to zrobić):

// Plik konfiguracyjny interfejsu Zabbix.
       global $DB, $HISTORY;
Instalacja Elasticsearcha i tworzenie mapowania

Ostatnie dwa kroki, aby wszystko zadziałało, to instalacja samego Elasticsearch oraz proces tworzenia mapowania.

Aby zainstalować Elasticsearch, proszę odnieść się do przewodnika instalacyjnego 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. Niektóre funkcjonalności mogą nie działać poprawnie, jeśli mapowanie nie zostanie utworzone zgodnie z instrukcją.

Aby utworzyć mapowanie dla typu text, wyślij następujące żądanie do 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"
                }
             }
          }
       }'

Podobne żądanie należy wykonać w celu utworzenia mapowania dla wartości historycznych typu Character oraz Log z odpowiednią korektą typu.

Aby pracować z Elasticsearch, proszę odnieść się do strony wymagań po dodatkowe informacje.

Proces porządkowania nie usuwa żadnych danych z Elasticsearcha.

Przechowywanie danych historycznych w wielu indeksach opartych na dacie

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

Aby rozpocząć, należy utworzyć szablony dla indeksów.

Poniższy przykład przedstawia żądanie utworzenia szablonu dla typu 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ć adres URL (ostatnia część to nazwa szablonu), zmienić pole "index_patterns" tak, aby pasowało do nazwy indeksu, oraz ustawić poprawne mapowanie, które można wziąć z database/elasticsearch/elasticsearch.map.

Na przykład, następujące polecenie może być użyte 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 konieczne, aby umożliwić Elasticsearch ustawienie poprawnego mapowania dla automatycznie tworzonych indeksów. Następnie należy utworzyć definicję pipeline. Pipeline jest pewnego rodzaju przetwarzaniem danych przed umieszczeniem ich w indeksach. Poniższe polecenie może być użyte do utworzenia pipeline dla indeksu uint:

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

Użytkownik może zmienić parametr zaokrąglenia ("date_rounding"), aby ustawić określony okres rotacji indeksu. Aby utworzyć inne pipeline, użytkownik powinien zmienić adres URL (ostatnia część to nazwa pipeline) oraz zmienić pole "index_name_prefix" tak, 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

Następujące kroki mogą pomóc Ci w rozwiązywaniu 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 shard nie znajdują się w stanie błędu (ponowne uruchomienie Elasticsearch powinno pomóc).
  3. Sprawdź konfigurację Elasticsearch. Konfiguracja powinna umożliwiać dostęp z hosta frontendu Zabbix oraz z hosta serwera Zabbix.
  4. Sprawdź logi Elasticsearch.

Jeśli nadal napotykasz problemy z instalacją, proszę utwórz raport o błędzie zawierający wszystkie informacje z tego listy (mapowanie, dzienniki błędów, konfiguracja, wersja, itp.).