Configurazione di ClickHouse
Zabbix può memorizzare i dati storici in ClickHouse come alternativa a un database relazionale.
Questa guida illustra la configurazione per le versioni supportate di ClickHouse. Se stai usando una versione diversa, alcune funzionalità potrebbero non funzionare come previsto.
ClickHouse può memorizzare i seguenti tipi di valore:
| 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 non accetta array JSON. Un valore JSON deve essere un singolo oggetto oppure un insieme di oggetti. Inoltre, ClickHouse gestisce le chiavi JSON con NULL allo stesso modo delle chiavi mancanti.
Note importanti
- Il housekeeper non elimina i dati da ClickHouse. Per controllare per quanto tempo i dati vengono conservati, configura il periodo di archiviazione dei dati di ClickHouse in ClickHouse.
- Zabbix non calcola né memorizza i trend in ClickHouse. Valuta di estendere il periodo di conservazione della history per preservare i dati più vecchi.
- Se desideri migrare i dati di history da un database Zabbix esistente (MySQL o PostgreSQL) a ClickHouse, consulta lo schema di ClickHouse e gli script di migrazione della history.
- ClickHouse non è supportato per i proxy Zabbix.
- Se disponi di un cluster ClickHouse, consulta Configurazione dei cluster ClickHouse.
Configurazione di ClickHouse
È necessario creare e configurare un database e un utente Zabbix, quindi importare lo schema del database.
Questa guida fornisce istruzioni per installazioni di ClickHouse tramite Docker o pacchetto.
Docker
1. Creare e configurare il database e l'utente Zabbix quando si esegue il container 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. Confermare che ClickHouse sia in esecuzione e che sia possibile connettersi ad esso:
sudo docker exec -it clickhouse \
clickhouse-client \
--query "SELECT version()"
# 26.4.4.38
3. Importare lo schema del database usando lo script history_all.sh dalla directory di Zabbix:
./usr/share/zabbix/sql-scripts/clickhouse/history_all.sh \
--user zabbix \
--password <password> \
--db zabbix \
--server http://localhost:8123
Il periodo di conservazione dei dati (Time-To-Live, o TTL) per ClickHouse è, per impostazione predefinita, di 31 giorni.
Per modificarlo, usare l'opzione --ttl durante l'importazione dello schema del database (ad esempio, --ttl 604800 per 7 giorni), oppure configurarlo in un secondo momento.
4. Verificare che le tabelle siano state create:
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
Pacchetti
1. Avvia ClickHouse:
sudo service clickhouse-server start
2. Crea e configura il database e l'utente 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. Importa lo schema del database usando lo script history_all.sh dalla tua directory Zabbix:
./usr/share/zabbix/sql-scripts/clickhouse/history_all.sh \
--user zabbix \
--password <password> \
--db zabbix \
--server http://localhost:8123
Il periodo di conservazione dei dati (Time-To-Live, o TTL) per ClickHouse è, per impostazione predefinita, di 31 giorni.
Per modificarlo, usa l'opzione --ttl durante l'importazione dello schema del database (ad esempio, --ttl 604800 per 7 giorni), oppure configuralo in un secondo momento.
4. Verifica che le tabelle siano state create:
clickhouse-client \
--user zabbix \
--password <password> \
--query "SHOW TABLES FROM zabbix"
# history
# history_json
# history_log
# history_str
# history_text
# history_uint
Configurazione di Zabbix server
Nel file di configurazione di Zabbix server (zabbix_server.conf), impostare il parametro HistoryProvider.
Ad esempio, per memorizzare tutti i tipi di valori supportati in ClickHouse:
HistoryProvider=clickhouse;value_types="uint,dbl,str,log,text,json",url=http://localhost:8123,db=zabbix,username=zabbix,password=<password>
Dopo aver apportato le modifiche, riavviare Zabbix server:
systemctl restart zabbix-server
Configurazione del frontend Zabbix
Nel file di configurazione del frontend Zabbix (zabbix.conf.php), impostare la variabile $HISTORY_PROVIDERS in modo che corrisponda alla configurazione del server:
$HISTORY_PROVIDERS[] = [
'types' => ['uint','dbl','str','log','text','json'],
'provider' => 'clickhouse',
'url' => 'http://localhost:8123',
'db' => 'zabbix',
'username' => 'zabbix',
'password' => '<password>'
];
Configurazione aggiuntiva
I passaggi seguenti sono opzionali. Non sono necessari per una configurazione di base.
Configurazione del periodo di conservazione dei dati di ClickHouse
Il periodo di conservazione dei dati (Time-To-Live, o TTL) per ClickHouse è, per impostazione predefinita, di 31 giorni. Per modificarlo, esegui i comandi riportati di seguito.
Gli esempi seguenti usano Docker. Se hai installato ClickHouse usando i pacchetti, esegui le query direttamente nel client di ClickHouse.
1. Modifica la tabella (sostituisci history_json e 3600 con i valori necessari):
sudo docker exec -it clickhouse \
clickhouse-client \
--user zabbix \
--password <password> \
--query "ALTER TABLE zabbix.history_json MODIFY TTL clock_ns + toIntervalSecond(3600)"
2. Applica immediatamente le modifiche:
sudo docker exec -it clickhouse \
clickhouse-client \
--user zabbix \
--password <password> \
--query "OPTIMIZE TABLE zabbix.history_json MATERIALIZE TTL"
3. Verifica che il periodo di conservazione dei dati sia cambiato:
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. Riavvia il server Zabbix per aggiornare il periodo di conservazione dei dati in Administration > Housekeeping:
systemctl restart zabbix-server
Configurazione dei cluster ClickHouse
Questa sezione fornisce i passaggi di configurazione per i cluster ClickHouse con replica e sharding.
I passaggi seguenti usano Docker e il ClickHouse cluster_2S_2R dalla documentazione di ClickHouse (con ClickHouse 26.4.4.38 e ClickHouse Keeper in esecuzione).
Prima di iniziare, è consigliabile inserire un load balancer davanti al cluster ClickHouse per Zabbix. La configurazione di server e frontend di Zabbix supporta solo un singolo URL ClickHouse, quindi può puntare a un solo nodo. Se quel nodo non è disponibile, un load balancer reindirizzerà Zabbix verso un nodo integro, tramite lo stesso URL.
1. Creare il database 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}')"
La clausola ON CLUSTER raggiunge solo i nodi che fanno parte del cluster al momento dell'esecuzione del comando.
Se in seguito aggiungi nodi al cluster, esegui di nuovo questo comando.
2. Creare e configurare l'utente 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. Importare lo schema del database usando lo script history_all.sh dalla directory di Zabbix:
./usr/share/zabbix/sql-scripts/clickhouse/history_all.sh \
--user zabbix \
--password <password> \
--db zabbix \
--server http://localhost:8123 \
--engine "ReplicatedMergeTree()"
Il periodo di conservazione dei dati (Time-To-Live, o TTL) per ClickHouse è, per impostazione predefinita, di 31 giorni.
Per modificarlo, usa l'opzione --ttl durante l'importazione dello schema del database (ad esempio, --ttl 604800 per 7 giorni), oppure configuralo in un secondo momento.
Se il tuo cluster ClickHouse richiede percorsi espliciti per le repliche (ad esempio, se la configurazione del server ClickHouse non definisce percorsi predefiniti per le tabelle replicate), esegui singolarmente gli script dello schema (history_schema.sh, history_uint_schema.sh, ecc.) e imposta un percorso diverso per ogni tabella:
./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}')"
Per ulteriori dettagli sulla replica in ClickHouse, consulta Replicating data e Replicated* table engines nella documentazione di ClickHouse.
4. Configurare lo sharding per ogni tipo di tabella.
Rinomina le tabelle e crea una tabella Distributed con il nome originale, puntando alla tabella rinominata.
Questa tabella Distributed è quella da cui Zabbix legge e su cui scrive effettivamente; la tabella distribuisce automaticamente i dati tra gli shard.
Ad esempio, per la tabella 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)"
Per ulteriori dettagli sullo sharding in ClickHouse, consulta Distributed table engine nella documentazione di ClickHouse.
5. Configurare il server Zabbix.
6. Configurare il frontend Zabbix.
7. Verificare che i dati di Zabbix siano distribuiti tra gli shard.
Il numero di righe in zabbix.history_local può cambiare tra controlli ripetuti, poiché il server Zabbix inserisce continuamente nuovi dati.
Esegui questo comando su ogni nodo:
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. Verificare che la replica sia sincronizzata (active_replicas deve corrispondere a 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
Risoluzione dei problemi
I seguenti passaggi possono aiutarti a risolvere i problemi con la configurazione di ClickHouse:
-
Controlla i log di ClickHouse o del server Zabbix per individuare eventuali errori.
-
Per identificare le query lente, usa l'opzione
log_slow_queriesnel parametro di configurazione del server ZabbixHistoryProvider. -
Verifica che ClickHouse consenta l'accesso dal server Zabbix e dal frontend Zabbix.
-
Interroga ClickHouse per verificare se i dati raccolti da Zabbix vengono archiviati, ad esempio:
sudo docker exec -it clickhouse \
clickhouse-client \
--user zabbix \
--password <password> \
--query "SELECT * FROM zabbix.history_uint WHERE itemid = 42269"