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, czyli 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 FINAL"

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 Administracja > Housekeeping:

systemctl restart zabbix-server

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"