[comment]: # ({025717bd-4ff8e217})
# 7 Konfiguracja Elasticsearch

::: noteimportant
 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.

::: notewarning
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.<br>
2\. Gdy używany jest Elasticsearch, zapytania zakresowe pobierające wartości z bazy danych są ograniczone znacznikiem czasu okresu przechowywania danych.
:::

[comment]: # ({/025717bd-4ff8e217})

[comment]: # ({0b6587bd-0b6587bd})
#### 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.

[comment]: # ({/0b6587bd-0b6587bd})

[comment]: # ({293ef64c-293ef64c})
##### 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;

[comment]: # ({/293ef64c-293ef64c})

[comment]: # ({000d1106-e9a9c5bd})
##### 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](https://www.elastic.co/guide/en/elasticsearch/reference/current/setup.html).

::: noteclassic
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`.
:::

::: notewarning
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:

``` {.java}
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.

::: noteclassic
Aby pracować z Elasticsearch, zapoznaj się z sekcją [Wymagania](/manual/installation/requirements#serverproxy), aby uzyskać dodatkowe informacje.
:::

::: noteclassic
[Housekeeper](/manual/web_interface/frontend_sections/administration/housekeeping)
nie usuwa żadnych danych z Elasticsearch.
:::

[comment]: # ({/000d1106-e9a9c5bd})

[comment]: # ({8451a0a2-8451a0a2})
#### 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:

``` {.java}
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:

``` {.java}
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:

``` {.java}
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](https://www.elastic.co/guide/en/elasticsearch/reference/master/date-index-name-processor.html).

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

[comment]: # ({/8451a0a2-8451a0a2})

[comment]: # ({52123e63-5c4a5e3c})
#### 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``](/manual/appendix/config/zabbix_server#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.)

[comment]: # ({/52123e63-5c4a5e3c})
