8 Настройка Elasticsearch

Поддержка Elasticsearch является экспериментальной!

Zabbix поддерживает хранение исторических данных с помощью Elasticsearch вместо базы данных. Пользователи могут выбирать место хранения исторических данных между совместимой базой данных и Elasticsearch. Процедура настройки, описанная в этом разделе, применима к Elasticsearch версии 7.X. Если используется более ранняя или более поздняя версия Elasticsearch, некоторые функции могут работать не так, как ожидается.

1.Если все исторические данные хранятся в Elasticsearch, тренды не вычисляются и не сохраняются в базе данных. Если тренды не вычисляются и не сохраняются, может потребоваться увеличить период хранения истории.
2. При использовании Elasticsearch диапазонные запросы, извлекающие значения из базы данных, ограничены временной меткой периода хранения данных.

Настройка

Для обеспечения надлежащей связи между всеми задействованными элементами убедитесь, что параметры файла конфигурации сервера и файла конфигурации веб-интерфейса настроены должным образом.

Сервер Zabbix и веб-интерфейс

Черновик файла конфигурации сервера Zabbix с параметрами, которые необходимо обновить:

### Option: HistoryStorageURL
# URL-адрес HTTP(S) хранилища истории.
#
# Mandatory: no
# Default:
# HistoryStorageURL= 
### Option: HistoryStorageTypes
# Список типов значений, разделенных запятыми, которые будут отправляться в хранилище истории.
#
# Mandatory: no
# Default:
# HistoryStorageTypes=uint,dbl,str,log,text

Пример значений параметров для добавления в файл конфигурации сервера Zabbix:

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

Эта конфигурация заставляет сервер Zabbix сохранять значения истории числовых типов в соответствующей базе данных, а текстовые данные истории - в Elasticsearch.

Elasticsearch поддерживает следующие типы элементов данных:

uint,dbl,str,log,text

Описание поддерживаемых типов элементов данных:

Тип значения элемента данных Таблица базы данных Тип Elasticsearch
Числовой (беззнаковый) history_uint uint
Числовой (с плавающей запятой) history dbl
Символьный history_str str
Журнал history_log log
Текст history_text text

Черновик файла конфигурации веб-интерфейса Zabbix (conf/zabbix.conf.php) с параметрами, которые необходимо обновить:

// URL-адрес Elasticsearch (может быть строкой, если для всех типов используется один и тот же URL-адрес).
$HISTORY['url']   = [
      'uint' => 'http://localhost:9200',
      'text' => 'http://localhost:9200'
];
// Типы значений, хранящиеся в Elasticsearch.
$HISTORY['types'] = ['uint', 'text'];

Пример значений параметров для добавления в файл конфигурации веб-интерфейса Zabbix:

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

Эта конфигурация заставляет сохранять значения истории типов Text, Character и Log в Elasticsearch.

Также необходимо сделать $HISTORY глобальной переменной в conf/zabbix.conf.php, чтобы обеспечить корректную работу (см. conf/zabbix.conf.php.example, где приведен пример):

// Файл конфигурации графического интерфейса Zabbix.
global $DB, $HISTORY;
Установка Elasticsearch и создание сопоставления

Последними двумя шагами, чтобы все заработало, являются установка самого Elasticsearch и создание процесса сопоставления.

Для установки Elasticsearch, пожалуйста, обратитесь к инструкции по установке Elasticsearch [en].

Сопоставление является структурой данных в Elasticsearch (аналогично таблице в базе данных). Сопоставления по всем типам данных истории доступны здесь: database/elasticsearch/elasticsearch.map.

Создание сопоставления обязательно. Некоторый функционал будет поломан, если сопоставление не создано согласно этой инструкции.

Для создания сопоставления для типа text отправьте следующий запрос в 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"
         }
      }
   }
}'

Похожий запрос требуется выполнить для создания сопоставлений по значениям истории Символ и Журнал (лог) с соответствующим исправлением типа.

Чтобы работать с Elasticsearch, пожалуйста, обратитесь к странице требований для получения более подробной информации.

Очистка истории не удаляет никакие данные из Elasticsearch.

Запись данных истории в несколько индексов на основе даты

В этом разделе описываются дополнительные шаги, которые необходимы для работы с конвейерами и узлами ingest.

Для начала вам нужно создать шаблоны для индексов.

Следующий пример показывает запрос на создание шаблона 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"
         }
      }
   }
}'

Для создания остальных шаблонов пользователю нужно изменить URL (последняя часть является именем шаблона), изменить поле "index_patterns", чтобы совпадало с именем индекса, и указать корректное сопоставление, которое можно взять из database/elasticsearch/elasticsearch.map.

Например, можно использовать следующую команду, чтобы создать шаблон для текстового индекса:

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

Этот шаг необходим, чтобы позволить Elasticsearch задавать корректные сопоставления для индексов, которые создаются автоматически. Затем это требуется для создания определения конвейера. Конвейер является своего рода предварительной обработкой данных перед тем как поместить их в индексы. Можно использовать следующую команду, чтобы создать конвейер для индекса 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"
         }
      }
   ]
}'

Пользователь может изменить параметр округления ("date_rounding"), чтобы задать спефицичный период ротации индекса. Для создания остальных конвейеров пользователю необходимо изменить URL (последняя часть является именем конвейера) и изменить поле "index_name_prefix", чтобы оно соответствовало имени индекса.

Смотрите также документацию Elasticsearch [en].

Кроме того, запись данных истории в несколько индексов на основе даты необходимо также включить в новом параметре в конфигурации 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

Решение проблем

Следующие шаги могут помочь вам в решении проблем с настройкой Elasticsearch:

  1. Проверьте, что сопоставления корректны (запрос GET к URL нужного индекса, наподобие: http://localhost:9200/uint).
  2. Проверьте, что шарды не находятся в состоянии ошибки (может помочь перезапуск Elasticsearch).
  3. Проверьте настройки Elasticsearch. Конфигурация должна разрешать доступ с хоста веб-интерфейса Zabbix и хоста сервера Zabbix.
  4. Проверьте журналы Elasticsearch.
  5. Для проверки медленных запросов в базе данных Elasticsearch можно использовать LogSlowQueries.

Если у вас по-прежнему возникают проблемы с вашей инсталляцией, пожалуйста, создайте отчёт об ошибке со всей информацией из этого списка (сопоставления, журналы ошибок, настройка, версия и так далее).