Настройка 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

Вам нужно создать и настроить базу данных 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 FINAL"

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

Configuring ClickHouse clusters

This section provides configuration steps for ClickHouse clusters with replication and sharding.

The steps below use Docker and the ClickHouse cluster_2S_2R from ClickHouse documentation (running ClickHouse 26.4.4.38 with ClickHouse Keeper).

Before you start, it is recommended to put a load balancer in front of your ClickHouse cluster for Zabbix. Zabbix server and frontend configuration supports only a single ClickHouse URL, so it can only point to one node. If that node goes down, a load balancer will redirect Zabbix to a healthy node instead, through that same URL.

1. Create the Zabbix database:

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

The ON CLUSTER clause reaches only nodes that are part of the cluster when you run the command. If you add nodes to your cluster later, run this command again.

2. Create and configure the Zabbix user:

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. Import the database schema using the history_all.sh script from your Zabbix directory:

./usr/share/zabbix/sql-scripts/clickhouse/history_all.sh \
  --user zabbix \
  --password <password> \
  --db zabbix \
  --server http://localhost:8123 \
  --engine "ReplicatedMergeTree()"

The data storage period (Time-To-Live, or TTL) for ClickHouse is, by default, 31 days. To change it, use the --ttl option when importing the database schema (e.g., --ttl 604800 for 7 days), or configure it later.

If your ClickHouse cluster requires explicit replica paths (for example, if your ClickHouse server configuration does not set default paths for replicated tables), run the schema scripts (history_schema.sh, history_uint_schema.sh, etc.) individually and set a different path for each table:

./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}')"

For more details on ClickHouse replication, see Replicating data and Replicated* table engines in ClickHouse documentation.

4. Configure sharding for each table type. Rename the tables and create a Distributed table with the original name, pointing to the renamed table. This Distributed table is what Zabbix actually reads from and writes to; the table splits data across shards automatically. For example, for the history table:

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)"

For more details on ClickHouse sharding, see Distributed table engine in ClickHouse documentation.

5. Configure Zabbix server.

6. Configure Zabbix frontend.

7. Verify that Zabbix data is spread across shards. The row count from zabbix.history_local may change between repeated checks, since Zabbix server continuously inserts new data. Run this command on each node:

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. Check that replication is in sync (active_replicas should match 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:

  1. Проверьте журналы ClickHouse или сервера Zabbix на наличие ошибок.

  2. Чтобы выявить медленные запросы, используйте параметр log_slow_queries в параметре конфигурации сервера Zabbix HistoryProvider.

  3. Убедитесь, что ClickHouse разрешает доступ с сервера Zabbix и веб-интерфейса Zabbix.

  4. Выполните запрос к ClickHouse, чтобы проверить, сохраняются ли данные, собранные Zabbix, например:

sudo docker exec -it clickhouse \
  clickhouse-client \
  --user zabbix \
  --password <password> \
  --query "SELECT * FROM zabbix.history_uint WHERE itemid = 42269"