Konfiguracja ClickHouse

Zabbix może przechowywać dane historyczne w ClickHouse jako alternatywę dla relacyjnej bazy danych.

Ten przewodnik obejmuje konfigurację obsługiwanych wersji ClickHouse. Jeśli używasz innej wersji, niektóre funkcje mogą nie działać zgodnie z oczekiwaniami.

ClickHouse może przechowywać następujące typy wartości:

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 nie akceptuje tablic JSON. Wartość JSON musi być pojedynczym obiektem albo zbiorem obiektów. Dodatkowo ClickHouse obsługuje klucze JSON z wartością NULL tak samo jak brakujące klucze.

Ważne uwagi

Konfigurowanie ClickHouse

Należy utworzyć i skonfigurować bazę danych Zabbix oraz użytkownika, a także zaimportować schemat bazy danych.

Ten przewodnik zawiera instrukcje dotyczące instalacji ClickHouse za pomocą Docker lub pakietów.

Docker

1. Utwórz i skonfiguruj bazę danych Zabbix oraz użytkownika podczas uruchamiania kontenera 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. Potwierdź, że ClickHouse działa i że możesz się z nim połączyć:

sudo docker exec -it clickhouse \
  clickhouse-client \
  --query "SELECT version()"

# 26.4.4.38

3. Zaimportuj schemat bazy danych za pomocą skryptu history_all.sh z katalogu Zabbix:

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

Domyślny okres przechowywania danych (Time-To-Live, TTL) dla ClickHouse wynosi 31 dni. Aby go zmienić, użyj opcji --ttl podczas importowania schematu bazy danych (np. --ttl 604800 dla 7 dni) albo skonfiguruj go później.

4. Sprawdź, czy tabele zostały utworzone:

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

Pakiety

1. Uruchom ClickHouse:

sudo service clickhouse-server start

2. Utwórz i skonfiguruj bazę danych oraz użytkownika 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. Zaimportuj schemat bazy danych, używając skryptu history_all.sh z katalogu Zabbix:

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

Domyślny okres przechowywania danych (Time-To-Live, TTL) dla ClickHouse wynosi 31 dni. Aby go zmienić, użyj opcji --ttl podczas importowania schematu bazy danych (np. --ttl 604800 dla 7 dni) albo skonfiguruj go później.

4. Sprawdź, czy tabele zostały utworzone:

clickhouse-client \
  --user zabbix \
  --password <password> \
  --query "SHOW TABLES FROM zabbix"

# history
# history_json
# history_log
# history_str
# history_text
# history_uint

Konfigurowanie serwera Zabbix

W pliku konfiguracyjnym serwera Zabbix (zabbix_server.conf) ustaw parametr HistoryProvider.

Na przykład, aby przechowywać wszystkie obsługiwane typy wartości w ClickHouse:

HistoryProvider=clickhouse;value_types="uint,dbl,str,log,text,json",url=http://localhost:8123,db=zabbix,username=zabbix,password=<password>

Po wprowadzeniu zmian uruchom ponownie serwer Zabbix:

systemctl restart zabbix-server

Konfigurowanie frontend Zabbix

W pliku konfiguracyjnym frontend Zabbix (zabbix.conf.php) ustaw zmienną $HISTORY_PROVIDERS, aby odpowiadała konfiguracji serwera:

$HISTORY_PROVIDERS[] = [
  'types' => ['uint','dbl','str','log','text','json'],
  'provider' => 'clickhouse',
  'url' => 'http://localhost:8123',
  'db' => 'zabbix',
  'username' => 'zabbix',
  'password' => '<password>'
];

Dodatkowa konfiguracja

Poniższe kroki są opcjonalne. Nie są potrzebne do podstawowej konfiguracji.

Konfigurowanie okresu przechowywania danych ClickHouse

Domyślny okres przechowywania danych (Time-To-Live, TTL) dla ClickHouse wynosi 31 dni. Aby go zmienić, uruchom poniższe polecenia.

Poniższe przykłady używają Dockera. Jeśli zainstalowano ClickHouse za pomocą pakietów, uruchom zapytania bezpośrednio w kliencie ClickHouse.

1. Zmień tabelę (zastąp history_json i 3600 wartościami, których potrzebujesz):

sudo docker exec -it clickhouse \
  clickhouse-client \
  --user zabbix \
  --password <password> \
  --query "ALTER TABLE zabbix.history_json MODIFY TTL clock_ns + toIntervalSecond(3600)"

2. Zastosuj zmiany natychmiast:

sudo docker exec -it clickhouse \
  clickhouse-client \
  --user zabbix \
  --password <password> \
  --query "OPTIMIZE TABLE zabbix.history_json MATERIALIZE TTL"

3. Sprawdź, czy okres przechowywania danych został zmieniony:

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. Uruchom ponownie serwer Zabbix, aby odświeżyć okres przechowywania danych w Administration > Housekeeping:

systemctl restart zabbix-server

Konfigurowanie klastrów ClickHouse

Ta sekcja zawiera kroki konfiguracji klastrów ClickHouse z replikacją i shardowaniem.

Poniższe kroki wykorzystują Docker oraz ClickHouse cluster_2S_2R z dokumentacji ClickHouse (uruchomiony na ClickHouse 26.4.4.38 z ClickHouse Keeper).

Przed rozpoczęciem zaleca się umieszczenie load balancera przed klastrem ClickHouse dla Zabbix. Konfiguracja serwera Zabbix i frontend obsługuje tylko jeden adres URL ClickHouse, więc może wskazywać tylko na jeden węzeł. Jeśli ten węzeł przestanie działać, load balancer przekieruje Zabbix do sprawnego węzła, korzystając z tego samego adresu URL.

1. Utwórz bazę danych 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}')"

Klauzula ON CLUSTER obejmuje tylko te węzły, które są częścią klastra w momencie uruchomienia polecenia. Jeśli później dodasz węzły do klastra, uruchom to polecenie ponownie.

2. Utwórz i skonfiguruj użytkownika 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. Zaimportuj schemat bazy danych, używając skryptu history_all.sh z katalogu Zabbix:

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

Domyślny okres przechowywania danych (Time-To-Live, TTL) w ClickHouse wynosi 31 dni. Aby go zmienić, użyj opcji --ttl podczas importowania schematu bazy danych (np. --ttl 604800 dla 7 dni) lub skonfiguruj go później.

Jeśli klaster ClickHouse wymaga jawnych ścieżek replik (na przykład gdy konfiguracja serwera ClickHouse nie ustawia domyślnych ścieżek dla tabel replikowanych), uruchom skrypty schematu (history_schema.sh, history_uint_schema.sh itd.) osobno i ustaw inną ścieżkę dla każdej tabeli:

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

Więcej informacji o replikacji ClickHouse znajdziesz w dokumentacji ClickHouse: Replicating data oraz Replicated* table engines.

4. Skonfiguruj shardowanie dla każdego typu tabeli. Zmień nazwy tabel i utwórz tabelę Distributed o oryginalnej nazwie, wskazującą na przemianowaną tabelę. To właśnie z tej tabeli Distributed Zabbix faktycznie odczytuje i do niej zapisuje dane; tabela automatycznie rozdziela dane między shardami. Na przykład dla tabeli 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)"

Więcej informacji o shardowaniu ClickHouse znajdziesz w dokumentacji ClickHouse w sekcji Distributed table engine.

5. Skonfiguruj serwer Zabbix.

6. Skonfiguruj frontend Zabbix.

7. Sprawdź, czy dane Zabbix są rozłożone między shardami. Liczba wierszy w zabbix.history_local może się zmieniać między kolejnymi sprawdzeniami, ponieważ serwer Zabbix stale wstawia nowe dane. Uruchom to polecenie na każdym węźle:

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. Sprawdź, czy replikacja jest zsynchronizowana (active_replicas powinno odpowiadać 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

Rozwiązywanie problemów

Poniższe kroki mogą pomóc w rozwiązywaniu problemów z konfiguracją ClickHouse:

  1. Sprawdź dzienniki ClickHouse lub serwera Zabbix pod kątem błędów.

  2. Aby zidentyfikować wolne zapytania, użyj opcji log_slow_queries w parametrze konfiguracji serwera Zabbix HistoryProvider.

  3. Sprawdź, czy ClickHouse zezwala na dostęp z serwera Zabbix i frontend Zabbix.

  4. Wykonaj zapytanie do ClickHouse, aby sprawdzić, czy dane zbierane przez Zabbix są zapisywane, na przykład:

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