Configuration de ClickHouse
Zabbix peut stocker les données d'historique dans ClickHouse comme alternative à une base de données relationnelle.
Ce guide couvre la configuration des versions prises en charge de ClickHouse. Si vous utilisez une version différente, certaines fonctionnalités risquent de ne pas fonctionner comme prévu.
ClickHouse peut stocker les types de valeurs suivants :
| Item value type | Database table | ClickHouse type |
|---|---|---|
| Numeric (unsigned) | history_uint | uint |
| Numeric (float) | history | dbl |
| Character | history_str | str |
| Log | history_log | log |
| Text | history_text | text |
| Binary | history_bin | not supported by Zabbix |
| JSON | history_json | json |
ClickHouse n'accepte pas les tableaux JSON. Une valeur JSON doit être soit un objet unique, soit un ensemble d'objets. De plus, ClickHouse gère les clés JSON avec NULL de la même manière que les clés manquantes.
Notes importantes
- Le housekeeper ne supprime pas les données de ClickHouse. Pour contrôler la durée de conservation des données, configurez la période de stockage des données ClickHouse dans ClickHouse.
- Zabbix ne calcule ni ne stocke les tendances dans ClickHouse. Envisagez d'étendre la période de stockage de l'historique afin de conserver les données plus anciennes.
- Si vous souhaitez migrer vos données d'historique depuis une base de données Zabbix existante (MySQL ou PostgreSQL) vers ClickHouse, consultez les scripts de migration du schéma ClickHouse et de l'historique.
- ClickHouse n'est pas pris en charge pour les proxies Zabbix.
Configuration de ClickHouse
Vous devez créer et configurer une base de données Zabbix et un utilisateur, puis importer le schéma de la base de données.
Ce guide fournit des instructions pour les installations de ClickHouse via Docker ou via package.
Docker
1. Créez et configurez la base de données et l'utilisateur Zabbix lors de l'exécution du conteneur 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. Vérifiez que ClickHouse fonctionne et que vous pouvez vous y connecter :
sudo docker exec -it clickhouse \
clickhouse-client \
--query "SELECT version()"
# 26.4.4.38
3. Importez le schéma de la base de données à l'aide du script history_all.sh depuis votre répertoire Zabbix :
./usr/share/zabbix/sql-scripts/clickhouse/history_all.sh \
--user zabbix \
--password <password> \
--db zabbix \
--server http://localhost:8123
La période de conservation des données (Time-To-Live, ou TTL) pour ClickHouse est, par défaut, de 31 jours.
Pour la modifier, utilisez l'option --ttl lors de l'import du schéma de la base de données (par exemple, --ttl 604800 pour 7 jours), ou configurez-la ultérieurement.
4. Vérifiez que les tables ont été créées :
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
Packages
1. Démarrez ClickHouse :
sudo service clickhouse-server start
2. Créez et configurez la base de données et l'utilisateur 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. Importez le schéma de la base de données à l'aide du script history_all.sh depuis votre répertoire Zabbix :
./usr/share/zabbix/sql-scripts/clickhouse/history_all.sh \
--user zabbix \
--password <password> \
--db zabbix \
--server http://localhost:8123
La période de conservation des données (Time-To-Live, ou TTL) pour ClickHouse est, par défaut, de 31 jours.
Pour la modifier, utilisez l'option --ttl lors de l'import du schéma de la base de données (par exemple, --ttl 604800 pour 7 jours), ou configurez-la ultérieurement.
4. Vérifiez que les tables ont été créées :
clickhouse-client \
--user zabbix \
--password <password> \
--query "SHOW TABLES FROM zabbix"
# history
# history_json
# history_log
# history_str
# history_text
# history_uint
Configuration du serveur Zabbix
Dans le fichier de configuration de votre serveur Zabbix (zabbix_server.conf), définissez le paramètre HistoryProvider.
Par exemple, pour stocker tous les types de valeurs pris en charge dans ClickHouse :
HistoryProvider=clickhouse;value_types="uint,dbl,str,log,text,json",url=http://localhost:8123,db=zabbix,username=zabbix,password=<password>
Après avoir effectué les modifications, redémarrez le serveur Zabbix :
systemctl restart zabbix-server
Configuration de l'interface Zabbix
Dans votre fichier de configuration de l'interface Zabbix (zabbix.conf.php), définissez la variable $HISTORY_PROVIDERS de manière à correspondre à la configuration du serveur :
$HISTORY_PROVIDERS[] = [
'types' => ['uint','dbl','str','log','text','json'],
'provider' => 'clickhouse',
'url' => 'http://localhost:8123',
'db' => 'zabbix',
'username' => 'zabbix',
'password' => '<password>'
];
Configuration supplémentaire
Les étapes ci-dessous sont facultatives. Vous n'en avez pas besoin pour une configuration de base.
Configuration de la période de conservation des données ClickHouse
La période de conservation des données (Time-To-Live, ou TTL) pour ClickHouse est, par défaut, de 31 jours. Pour la modifier, exécutez les commandes ci-dessous.
Les exemples ci-dessous utilisent Docker. Si vous avez installé ClickHouse à l'aide de paquets, exécutez les requêtes directement dans le client ClickHouse.
1. Modifiez la table (remplacez history_json et 3600 par les valeurs dont vous avez besoin) :
sudo docker exec -it clickhouse \
clickhouse-client \
--user zabbix \
--password <password> \
--query "ALTER TABLE zabbix.history_json MODIFY TTL clock_ns + toIntervalSecond(3600)"
2. Appliquez les modifications immédiatement :
sudo docker exec -it clickhouse \
clickhouse-client \
--user zabbix \
--password <password> \
--query "OPTIMIZE TABLE zabbix.history_json FINAL"
3. Vérifiez que la période de conservation des données a changé :
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. Redémarrez le serveur Zabbix pour actualiser la période de conservation des données dans Administration > Nettoyage automatique :
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.
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
Dépannage
Les étapes suivantes peuvent vous aider à résoudre les problèmes liés à votre configuration ClickHouse :
-
Vérifiez les journaux de ClickHouse ou du serveur Zabbix pour détecter des erreurs.
-
Pour identifier les requêtes lentes, utilisez l'option
log_slow_queriesdans le paramètre de configuration du serveur ZabbixHistoryProvider. -
Vérifiez que ClickHouse autorise l'accès depuis le serveur Zabbix et l'interface Zabbix.
-
Interrogez ClickHouse pour vérifier si les données collectées par Zabbix sont stockées, par exemple :
sudo docker exec -it clickhouse \
clickhouse-client \
--user zabbix \
--password <password> \
--query "SELECT * FROM zabbix.history_uint WHERE itemid = 42269"