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

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 mithilfe von 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 MATERIALIZE TTL"

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

Konfigurieren von ClickHouse-Clustern

Dieser Abschnitt beschreibt die Konfigurationsschritte für ClickHouse-Cluster mit Replikation und Sharding.

Die folgenden Schritte verwenden Docker und das ClickHouse cluster_2S_2R aus der ClickHouse-Dokumentation (ClickHouse 26.4.4.38 mit ClickHouse Keeper).

Bevor Sie beginnen, wird empfohlen, einen Load Balancer vor Ihren ClickHouse-Cluster für Zabbix zu schalten. Die Konfiguration von Zabbix Server und Frontend unterstützt nur eine einzelne ClickHouse-URL, sodass sie nur auf einen Knoten verweisen kann. Wenn dieser Knoten ausfällt, leitet ein Load Balancer Zabbix stattdessen über dieselbe URL auf einen funktionsfähigen Knoten um.

1. Erstellen Sie die Zabbix-Datenbank:

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

Die ON CLUSTER-Klausel erreicht nur Knoten, die zum Zeitpunkt der Ausführung des Befehls Teil des Clusters sind. Wenn Sie Ihrem Cluster später Knoten hinzufügen, führen Sie diesen Befehl erneut aus.

2. Erstellen und konfigurieren Sie den Zabbix-Benutzer:

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. 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 \
  --engine "ReplicatedMergeTree()"

Die Datenspeicherungsdauer (Time-To-Live, oder TTL) für ClickHouse beträgt standardmäßig 31 Tage. Um sie zu ändern, verwenden Sie beim Import des Datenbankschemas die Option --ttl (z. B. --ttl 604800 für 7 Tage), oder konfigurieren Sie sie später.

Wenn Ihr ClickHouse-Cluster explizite Replikatpfade erfordert (z. B. wenn Ihre ClickHouse-Serverkonfiguration keine Standardpfade für replizierte Tabellen festlegt), führen Sie die Schema-Skripte (history_schema.sh, history_uint_schema.sh usw.) einzeln aus und legen Sie für jede Tabelle einen anderen Pfad fest:

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

Weitere Informationen zur ClickHouse-Replikation finden Sie in der ClickHouse-Dokumentation unter Replicating data und Replicated* table engines.

4. Konfigurieren Sie das Sharding für jeden Tabellentyp. Benennen Sie die Tabellen um und erstellen Sie eine Distributed-Tabelle mit dem ursprünglichen Namen, die auf die umbenannte Tabelle verweist. Diese Distributed-Tabelle ist die Tabelle, aus der Zabbix tatsächlich liest und in die es schreibt; die Tabelle verteilt Daten automatisch auf die Shards. Zum Beispiel für die Tabelle 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)"

Weitere Informationen zum ClickHouse-Sharding finden Sie in der ClickHouse-Dokumentation unter Distributed table engine.

5. Konfigurieren Sie Zabbix Server.

6. Konfigurieren Sie das Zabbix Frontend.

7. Überprüfen Sie, ob die Zabbix-Daten über die Shards verteilt sind. Die Zeilenanzahl von zabbix.history_local kann sich zwischen wiederholten Prüfungen ändern, da Zabbix Server kontinuierlich neue Daten einfügt. Führen Sie diesen Befehl auf jedem Knoten aus:

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. Prüfen Sie, ob die Replikation synchron ist (active_replicas sollte mit total_replicas übereinstimmen):

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:

  1. Prüfen Sie die Protokolle von ClickHouse oder dem Zabbix Server auf Fehler.

  2. Um langsame Abfragen zu identifizieren, verwenden Sie die Option log_slow_queries im Zabbix Server-Konfigurationsparameter HistoryProvider.

  3. Vergewissern Sie sich, dass ClickHouse den Zugriff vom Zabbix Server und vom Zabbix Frontend aus zulässt.

  4. 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"