ClickHouse-Einrichtung
Zabbix kann Verlaufsdaten in ClickHouse als Alternative zu einer relationalen Datenbank speichern.
Diese Anleitung beschreibt die Einrichtung für die unterstützten Versionen von ClickHouse. Wenn Sie eine andere Version verwenden, funktioniert möglicherweise nicht die gesamte Funktionalität wie vorgesehen.
ClickHouse kann die folgenden Werttypen speichern:
| 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 akzeptiert keine JSON-Arrays. Ein JSON-Wert muss entweder ein einzelnes Objekt oder eine Menge von Objekten sein. Zusätzlich behandelt ClickHouse JSON-Schlüssel mit NULL genauso wie fehlende Schlüssel.
Wichtige Hinweise
- Der Housekeeper löscht keine Daten aus ClickHouse. Um zu steuern, wie lange Daten aufbewahrt werden, konfigurieren Sie den ClickHouse-Datenspeicherzeitraum in ClickHouse.
- Zabbix berechnet oder speichert Trends in ClickHouse nicht. Erwägen Sie, den History-Speicherzeitraum zu verlängern, um ältere Daten zu erhalten.
- Wenn Sie Ihre History-Daten aus einer vorhandenen Zabbix-Datenbank (MySQL oder PostgreSQL) nach ClickHouse migrieren möchten, siehe die ClickHouse-Schemata und History-Migrationsskripte.
- ClickHouse wird für Zabbix-Proxy nicht unterstützt.
Konfigurieren von ClickHouse
Sie müssen eine Zabbix-Datenbank und einen Benutzer erstellen und konfigurieren sowie das Datenbankschema importieren.
Diese Anleitung enthält Anweisungen für Docker- oder Paket-Installationen von ClickHouse.
Docker
1. Erstellen und konfigurieren Sie die Zabbix-Datenbank und den Benutzer beim Ausführen des ClickHouse-Containers:
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. Bestätigen Sie, dass ClickHouse funktioniert und Sie eine Verbindung herstellen können:
sudo docker exec -it clickhouse \
clickhouse-client \
--query "SELECT version()"
# 26.4.4.38
3. Importieren Sie das Datenbankschema mit dem Skript history_all.sh aus Ihrem Zabbix-Verzeichnis:
./usr/share/zabbix/sql-scripts/clickhouse/history_all.sh \
--user zabbix \
--password <password> \
--db zabbix \
--server http://localhost:8123
Der Datenspeicherzeitraum (Time-To-Live, oder TTL) für ClickHouse beträgt standardmäßig 31 Tage.
Um ihn zu ändern, verwenden Sie die Option --ttl beim Importieren des Datenbankschemas (z. B. --ttl 604800 für 7 Tage), oder konfigurieren Sie ihn später.
4. Überprüfen Sie, ob die Tabellen erstellt wurden:
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
Pakete
1. Starten Sie ClickHouse:
sudo service clickhouse-server start
2. Erstellen und konfigurieren Sie die Zabbix-Datenbank und den Benutzer:
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. Importieren Sie das Datenbankschema mit dem Skript history_all.sh aus Ihrem Zabbix-Verzeichnis:
./usr/share/zabbix/sql-scripts/clickhouse/history_all.sh \
--user zabbix \
--password <password> \
--db zabbix \
--server http://localhost:8123
Der Datenspeicherzeitraum (Time-To-Live, oder TTL) für ClickHouse beträgt standardmäßig 31 Tage.
Um ihn zu ändern, verwenden Sie die Option --ttl beim Importieren des Datenbankschemas (z. B. --ttl 604800 für 7 Tage), oder konfigurieren Sie ihn später.
4. Überprüfen Sie, ob die Tabellen erstellt wurden:
clickhouse-client \
--user zabbix \
--password <password> \
--query "SHOW TABLES FROM zabbix"
# history
# history_json
# history_log
# history_str
# history_text
# history_uint
Konfigurieren des Zabbix Server
Setzen Sie in Ihrer Zabbix-Server-Konfigurationsdatei (zabbix_server.conf) den Parameter HistoryProvider.
Um beispielsweise alle unterstützten Werttypen in ClickHouse zu speichern:
HistoryProvider=clickhouse;value_types="uint,dbl,str,log,text,json",url=http://localhost:8123,db=zabbix,username=zabbix,password=<password>
Starten Sie nach den Änderungen den Zabbix Server neu:
systemctl restart zabbix-server
Konfigurieren des Zabbix Frontend
Setzen Sie in Ihrer Zabbix-Frontend-Konfigurationsdatei (zabbix.conf.php) die Variable $HISTORY_PROVIDERS, damit sie mit der Server-Konfiguration übereinstimmt:
$HISTORY_PROVIDERS[] = [
'types' => ['uint','dbl','str','log','text','json'],
'provider' => 'clickhouse',
'url' => 'http://localhost:8123',
'db' => 'zabbix',
'username' => 'zabbix',
'password' => '<password>'
];
Zusätzliche Konfiguration
Die folgenden Schritte sind optional. Sie benötigen sie nicht für eine grundlegende Einrichtung.
Konfigurieren des ClickHouse-Datenspeicherzeitraums
Der Datenspeicherzeitraum (Time-To-Live, oder TTL) für ClickHouse beträgt standardmäßig 31 Tage. Um ihn zu ändern, führen Sie die folgenden Befehle aus.
Die folgenden Beispiele verwenden Docker. Wenn Sie ClickHouse mit Paketen installiert haben, führen Sie die Abfragen direkt im ClickHouse-Client aus.
1. Ändern Sie die Tabelle (ersetzen Sie history_json und 3600 durch die Werte, die Sie benötigen):
sudo docker exec -it clickhouse \
clickhouse-client \
--user zabbix \
--password <password> \
--query "ALTER TABLE zabbix.history_json MODIFY TTL clock_ns + toIntervalSecond(3600)"
2. Wenden Sie die Änderungen sofort an:
sudo docker exec -it clickhouse \
clickhouse-client \
--user zabbix \
--password <password> \
--query "OPTIMIZE TABLE zabbix.history_json FINAL"
3. Überprüfen Sie, ob sich der Datenspeicherzeitraum geändert hat:
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. Starten Sie den Zabbix-Server neu, um den Datenspeicherzeitraum in Administration > Housekeeping zu aktualisieren:
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
Fehlerbehebung
Die folgenden Schritte können Ihnen bei der Fehlerbehebung Ihrer ClickHouse-Einrichtung helfen:
-
Prüfen Sie die Protokolle von ClickHouse oder dem Zabbix Server auf Fehler.
-
Um langsame Abfragen zu identifizieren, verwenden Sie die Option
log_slow_queriesim Zabbix Server-KonfigurationsparameterHistoryProvider. -
Vergewissern Sie sich, dass ClickHouse den Zugriff vom Zabbix Server und vom Zabbix Frontend aus zulässt.
-
Fragen Sie ClickHouse ab, um zu prüfen, ob die von Zabbix gesammelten Daten gespeichert werden, zum Beispiel:
sudo docker exec -it clickhouse \
clickhouse-client \
--user zabbix \
--password <password> \
--query "SELECT * FROM zabbix.history_uint WHERE itemid = 42269"