Настройка ClickHouse
Zabbix может хранить данные истории в ClickHouse в качестве альтернативы реляционной базе данных.
В этом руководстве описана настройка поддерживаемых версий ClickHouse. Если вы используете другую версию, некоторые функции могут работать не так, как ожидается.
ClickHouse может хранить следующие типы значений:
| Тип значения элемента данных | Таблица базы данных | Тип ClickHouse |
|---|---|---|
| Числовой (без знака) | history_uint | uint |
| Числовой (с плавающей точкой) | history | dbl |
| Символьный | history_str | str |
| Журнал | history_log | log |
| Текст | history_text | text |
| Двоичный | history_bin | не поддерживается Zabbix |
| JSON | history_json | json |
ClickHouse не принимает массивы JSON. Значение JSON должно быть либо одним объектом, либо набором объектов. Кроме того, ClickHouse обрабатывает ключи JSON со значением NULL так же, как и отсутствующие ключи.
Важные примечания
- housekeeper не удаляет данные из ClickHouse. Чтобы управлять сроком хранения данных, настройте период хранения данных ClickHouse в ClickHouse.
- Zabbix не вычисляет и не хранит тренды в ClickHouse. Рассмотрите возможность увеличения периода хранения истории, чтобы сохранить более старые данные.
- Если вы хотите перенести данные истории из существующей базы данных Zabbix (MySQL или PostgreSQL) в ClickHouse, см. схему ClickHouse и скрипты миграции истории.
- ClickHouse не поддерживается для прокси Zabbix.
- Если у вас есть кластер ClickHouse, см. Настройка кластеров ClickHouse.
Настройка ClickHouse
Вам нужно создать и настроить базу данных Zabbix и пользователя, а также импортировать схему базы данных.
В этом руководстве приведены инструкции для установок ClickHouse через Docker или пакеты.
Docker
1. Создайте и настройте базу данных Zabbix и пользователя при запуске контейнера ClickHouse:
sudo docker run -d \
--name clickhouse \
-e CLICKHOUSE_DB=zabbix \
-e CLICKHOUSE_USER=zabbix \
-e CLICKHOUSE_DEFAULT_ACCESS_MANAGEMENT=1 \
-e CLICKHOUSE_PASSWORD=<password> \
-p 8123:8123/tcp \
-p 9000:9000/tcp \
--cap-add=SYS_NICE \
--cap-add=NET_ADMIN \
--cap-add=IPC_LOCK \
--ulimit nofile=262144:262144 \
-v clickhouse_data:/var/lib/clickhouse \
clickhouse/clickhouse-server:26.4
2. Убедитесь, что ClickHouse работает и вы можете подключиться к нему:
sudo docker exec -it clickhouse \
clickhouse-client \
--query "SELECT version()"
# 26.4.4.38
3. Импортируйте схему базы данных с помощью скрипта history_all.sh из каталога Zabbix:
./usr/share/zabbix/sql-scripts/clickhouse/history_all.sh \
--user zabbix \
--password <password> \
--db zabbix \
--server http://localhost:8123
Период хранения данных (Time-To-Live, или TTL) для ClickHouse по умолчанию составляет 31 день.
Чтобы изменить его, используйте параметр --ttl при импорте схемы базы данных (например, --ttl 604800 для 7 дней) или настройте его позже.
4. Проверьте, что таблицы были созданы:
sudo docker exec -it clickhouse \
clickhouse-client \
--user zabbix \
--password <password> \
--query "SHOW TABLES FROM zabbix"
# history
# history_json
# history_log
# history_str
# history_text
# history_uint
Пакеты
1. Запустите ClickHouse:
sudo service clickhouse-server start
2. Создайте и настройте базу данных и пользователя Zabbix:
clickhouse-client --user default
localhost :) CREATE DATABASE IF NOT EXISTS zabbix
localhost :) CREATE USER IF NOT EXISTS zabbix IDENTIFIED WITH sha256_password BY '<password>'
localhost :) GRANT CREATE, ALTER, DROP, INSERT, SELECT, UPDATE, OPTIMIZE ON zabbix.* TO zabbix
localhost :) quit
3. Импортируйте схему базы данных с помощью скрипта history_all.sh из каталога Zabbix:
./usr/share/zabbix/sql-scripts/clickhouse/history_all.sh \
--user zabbix \
--password <password> \
--db zabbix \
--server http://localhost:8123
Период хранения данных (Time-To-Live, или TTL) для ClickHouse по умолчанию составляет 31 день.
Чтобы изменить его, используйте параметр --ttl при импорте схемы базы данных (например, --ttl 604800 для 7 дней) или настройте его позже.
4. Убедитесь, что таблицы были созданы:
clickhouse-client \
--user zabbix \
--password <password> \
--query "SHOW TABLES FROM zabbix"
# history
# history_json
# history_log
# history_str
# history_text
# history_uint
Настройка сервера Zabbix
В файле конфигурации сервера Zabbix (zabbix_server.conf) задайте параметр HistoryProvider.
Например, чтобы хранить все поддерживаемые типы значений в ClickHouse:
HistoryProvider=clickhouse;value_types="uint,dbl,str,log,text,json",url=http://localhost:8123,db=zabbix,username=zabbix,password=<password>
После внесения изменений перезапустите сервер Zabbix:
systemctl restart zabbix-server
Настройка веб-интерфейса Zabbix
В файле конфигурации веб-интерфейса Zabbix (zabbix.conf.php) задайте переменную $HISTORY_PROVIDERS в соответствии с конфигурацией сервера:
$HISTORY_PROVIDERS[] = [
'types' => ['uint','dbl','str','log','text','json'],
'provider' => 'clickhouse',
'url' => 'http://localhost:8123',
'db' => 'zabbix',
'username' => 'zabbix',
'password' => '<password>'
];
Дополнительная настройка
Шаги ниже необязательны. Они не нужны для базовой настройки.
Настройка периода хранения данных ClickHouse
Период хранения данных (Time-To-Live, или TTL) для ClickHouse по умолчанию составляет 31 день. Чтобы изменить его, выполните команды ниже.
В примерах ниже используется Docker. Если вы установили ClickHouse с помощью пакетов, выполняйте запросы напрямую в клиенте ClickHouse.
1. Измените таблицу (замените history_json и 3600 на нужные вам значения):
sudo docker exec -it clickhouse \
clickhouse-client \
--user zabbix \
--password <password> \
--query "ALTER TABLE zabbix.history_json MODIFY TTL clock_ns + toIntervalSecond(3600)"
2. Немедленно примените изменения:
sudo docker exec -it clickhouse \
clickhouse-client \
--user zabbix \
--password <password> \
--query "OPTIMIZE TABLE zabbix.history_json MATERIALIZE TTL"
3. Проверьте, что период хранения данных изменился:
sudo docker exec -it clickhouse \
clickhouse-client \
--user zabbix \
--password <password> \
--query "SHOW CREATE TABLE zabbix.history_json"
# CREATE TABLE zabbix.history_json
# (
# `itemid` UInt64,
# `clock_ns` DateTime64(9),
# `value` JSON,
# `value_str` String
# )
# ENGINE = MergeTree
# PARTITION BY toDate(clock_ns)
# PRIMARY KEY (itemid, clock_ns)
# ORDER BY (itemid, clock_ns)
# TTL clock_ns + toIntervalSecond(3600)
# SETTINGS index_granularity = 8192
4. Перезапустите сервер Zabbix, чтобы обновить период хранения данных в Администрирование > Обслуживание данных:
systemctl restart zabbix-server
Настройка кластеров ClickHouse
В этом разделе описаны шаги настройки кластеров ClickHouse с репликацией и шардингом.
В приведенных ниже шагах используются Docker и ClickHouse cluster_2S_2R из документации ClickHouse (запуск ClickHouse 26.4.4.38 с ClickHouse Keeper).
Перед началом рекомендуется разместить перед кластером ClickHouse для Zabbix балансировщик нагрузки. Конфигурация Zabbix server и веб-интерфейса поддерживает только один URL ClickHouse, поэтому она может указывать только на один узел сети. Если этот узел выйдет из строя, балансировщик нагрузки перенаправит Zabbix на исправный узел через тот же URL.
1. Создайте базу данных Zabbix:
sudo docker exec -it clickhouse-01 \
clickhouse-client \
--user default \
--query "CREATE DATABASE IF NOT EXISTS zabbix ON CLUSTER cluster_2S_2R ENGINE = Replicated('/clickhouse/databases/zabbix', '{shard}', '{replica}')"
Предложение ON CLUSTER затрагивает только те узлы, которые входят в кластер на момент выполнения команды.
Если позже вы добавите узлы в кластер, выполните эту команду еще раз.
2. Создайте и настройте пользователя Zabbix:
sudo docker exec -it clickhouse-01 \
clickhouse-client \
--user default \
--query "CREATE USER IF NOT EXISTS zabbix ON CLUSTER cluster_2S_2R IDENTIFIED WITH sha256_password BY '<password>'"
sudo docker exec -it clickhouse-01 \
clickhouse-client \
--user default \
--query "GRANT ON CLUSTER cluster_2S_2R CREATE, ALTER, DROP, INSERT, SELECT, UPDATE, OPTIMIZE ON zabbix.* TO zabbix"
3. Импортируйте схему базы данных с помощью скрипта history_all.sh из каталога Zabbix:
./usr/share/zabbix/sql-scripts/clickhouse/history_all.sh \
--user zabbix \
--password <password> \
--db zabbix \
--server http://localhost:8123 \
--engine "ReplicatedMergeTree()"
Период хранения данных (Time-To-Live, или TTL) для ClickHouse по умолчанию составляет 31 день.
Чтобы изменить его, используйте параметр --ttl при импорте схемы базы данных (например, --ttl 604800 для 7 дней) или настройте его позже.
Если вашему кластеру ClickHouse требуются явные пути реплик (например, если в конфигурации сервера ClickHouse не заданы пути по умолчанию для реплицируемых таблиц), запустите скрипты схемы (history_schema.sh, history_uint_schema.sh и т. д.) по отдельности и задайте для каждой таблицы отдельный путь:
./usr/share/zabbix/sql-scripts/clickhouse/history_schema.sh \
--user zabbix \
--password <password> \
--db zabbix \
--server http://localhost:8123 \
--engine "ReplicatedMergeTree('/clickhouse/tables/{shard}/history', '{replica}')"
Подробнее о репликации ClickHouse см. в разделах Replicating data и Replicated* table engines в документации ClickHouse.
4. Настройте шардинг для каждого типа таблиц.
Переименуйте таблицы и создайте таблицу Distributed с исходным именем, указывающую на переименованную таблицу.
Именно из этой таблицы Distributed Zabbix фактически читает и в нее записывает данные; таблица автоматически распределяет данные по шардам.
Например, для таблицы history:
sudo docker exec -it clickhouse-01 \
clickhouse-client \
--user default \
--query "RENAME TABLE zabbix.history TO zabbix.history_local"
sudo docker exec -it clickhouse-01 \
clickhouse-client \
--user default \
--query "CREATE TABLE zabbix.history AS zabbix.history_local ENGINE = Distributed('cluster_2S_2R', 'zabbix', 'history_local', itemid)"
Подробнее о шардинге ClickHouse см. в разделе Distributed table engine документации ClickHouse.
6. Настройте веб-интерфейс Zabbix.
7. Убедитесь, что данные Zabbix распределены по шардам.
Количество строк в zabbix.history_local может меняться между повторными проверками, поскольку Zabbix server непрерывно вставляет новые данные.
Выполните эту команду на каждом узле:
sudo docker exec -it clickhouse-01 \
clickhouse-client \
--user default \
--query "SELECT count(*) FROM zabbix.history_local"
# 2446 (clickhouse-01)
# 2471 (clickhouse-02)
# 2494 (clickhouse-03)
8. Проверьте, что репликация синхронизирована (active_replicas должно совпадать с total_replicas):
sudo docker exec -it clickhouse-01 \
clickhouse-client \
--user default \
--query "SELECT database, table, is_leader, total_replicas, active_replicas FROM system.replicas WHERE database = 'zabbix'"
# zabbix history_json_local 1 2 2
# zabbix history_local 1 2 2
# zabbix history_log_local 1 2 2
# zabbix history_str_local 1 2 2
# zabbix history_text_local 1 2 2
# zabbix history_uint_local 1 2 2
Устранение неполадок
Следующие шаги могут помочь вам устранить проблемы с вашей конфигурацией ClickHouse:
-
Проверьте журналы ClickHouse или сервера Zabbix на наличие ошибок.
-
Чтобы выявить медленные запросы, используйте параметр
log_slow_queriesв параметре конфигурации сервера ZabbixHistoryProvider. -
Убедитесь, что ClickHouse разрешает доступ с сервера Zabbix и веб-интерфейса Zabbix.
-
Выполните запрос к ClickHouse, чтобы проверить, сохраняются ли данные, собранные Zabbix, например:
sudo docker exec -it clickhouse \
clickhouse-client \
--user zabbix \
--password <password> \
--query "SELECT * FROM zabbix.history_uint WHERE itemid = 42269"