Zabbix od verze 5.0 LTS již oficiálně podporuje TimescaleDB. Ve vývojových verzích Zabbix 4.2 a 4.4 byla podpora pouze experimentální. V poslední LTS verzi se navíc objevila i komprimace uložených dat.
Velmi inspirativní pro seznámení se s TimescaleDB v Zabbixu je článek na blogu.
K čemu je TimescaleDB dobré?
Již delší dobu můžeme sledovat vývoj databází se speciálním zaměřením „Time series database
“. Databáze časových řad (TSDB) je optimalizována pro ukládání a poskytování časových řad prostřednictvím přidružených párů času a hodnoty. Asi nejznámější je RRDtool a z těch moderních např. InfluxDB.
TimescaleDB poskytuje práci s daty časových řad s výkonem a pohodlím SQL. TimescaleDB je instalovatelné rozšíření databáze PostgreSQL v podobě sdílené knihovny, kterou si databáze načte při svém startu. Knihovna reprezentuje sadu funkcí a procedur.
Pokud provozujete Zabbix a monitorujete velké množství hostů. Asi jste byli nuceni provádět tunning a úpravy konfigurací Vaší databáze. TimescaleDB je velmi zajímavou funkcionalitou, která umí automaticky provádět obdobu PostgreSQL Partitions a komprimuje data. Např. interní proces Housekeeper mnohem rychleji a efektivněji pracuje s jinak velmi objemnými tabulkami history* a trends*.
Instalace a konfigurace
Pro první seznámení se Zabbix 5.0 LTS a TimescaleDB jsem použil operační systém FreeBSD, který má své porty s funkčním řešením. Vše si zkompilujete dle potřeb a odpadá tak spoléhání se na několik různých repositářů s binárními verzemi od různých tvůrců.
V dokumentaci Zabbixu je podrobně popsáno, jak instalaci TimescaleDB provést.
FreeBSD | 12.1-RELEASE |
Zabbix | 5.0.1 |
PostgreSQL | 12.3 |
TimescaleDB | 1.7.0 |
PHP | 7.4.7 |
Apache | 2.4.43 |
Instalaci TimescaleDB provedeme pomoci příslušného portu. Konfigurační volbou portu je jen TLS.
cd /usr/ports/databases/timescaledb make install clean To activate timescaledb on your PostgreSQL server, add 'timescaledb' to shared_preload_libraries in $PGDATA/postgresql.conf. For every database, run CREATE EXTENSION IF NOT EXISTS timescaledb CASCADE; If you are upgrading, restart PostgreSQL server and run ALTER EXTENSION timescaledb UPDATE TO '1.7.0';
Po instalaci do systému jsme informováni o nutné konfiguraci. V Linux distribucích je k dispozicitimescaledb-tune
s jehož použitím můžete upravit konfigurační soubor databáze a jeho direktivy.
Před zprovozněním TimescaleDB provedeme základní konfigurační kroky spojené s PostgreSQL.
Vytvoříme oddělený prostor pro databázi Zabbixu.
mkdir -p /data/pgsql chown postgres:postgres /data/pgsql
Vytvoříte databázového uživatele, tablespace a samotnou databázi.
psql -d template1 CREATE USER zabbix WITH password '********************'; CREATE TABLESPACE zabbix OWNER zabbix LOCATION '/data/pgsql'; CREATE DATABASE zabbix WITH OWNER = zabbix TABLESPACE = zabbix ENCODING ='UTF8'; GRANT ALL PRIVILEGES ON DATABASE zabbix to zabbix; template1=# \q
Importujeme schéma Zabbixu, obrázky map a základní data. V linux distribucích je vše v jednom souboru.
cd /usr/local/share/zabbix5/server/database/postgresql/ cat schema.sql | psql -U zabbix zabbix psql -U zabbix zabbix < images.sql psql -U zabbix zabbix < data.sql
Upravíte konfiguraci dle předchozího doporučení.
joe /var/db/postgres/data12/postgresql.conf ... shared_preload_libraries = 'timescaledb' # (change requires restart) /usr/local/etc/rc.d/postgresql restart
Pro inicializaci TimescaleDB se připojíte do databáze Zabbix a vytvoříte samotné rozšíření.
psql -d zabbix CREATE EXTENSION IF NOT EXISTS timescaledb CASCADE; WARNING: WELCOME TO _____ _ _ ____________ |_ _(_) | | | _ \ ___ \ | | _ _ __ ___ ___ ___ ___ __ _| | ___| | | | |_/ / | | | | _ ` _ \ / _ \/ __|/ __/ _` | |/ _ \ | | | ___ \ | | | | | | | | | __/\__ \ (_| (_| | | __/ |/ /| |_/ / |_| |_|_| |_| |_|\___||___/\___\__,_|_|\___|___/ \____/ Running version 1.7.0 For more information on TimescaleDB, please visit the following links: 1. Getting started: https://docs.timescale.com/getting-started 2. API reference documentation: https://docs.timescale.com/api 3. How TimescaleDB is designed: https://docs.timescale.com/introduction/architecture Note: TimescaleDB collects anonymous reports to better understand and assist our users. For more information and how to disable, please see our docs https://docs.timescaledb.com/using-timescaledb/telemetry. CREATE EXTENSION zabbix=# \q
V systémových tabulkách můžete prověřit existenci TimescaleDB.
zabbix=# SELECT oid,extname,extversion from pg_extension WHERE extname = 'timescaledb'; oid | extname | extversion -------+-------------+------------ 19798 | timescaledb | 1.7.0 (1 row)
Posledním krokem je inicializace Zabbix definic pro použití TimescaleDB. Funkcionalita je nasazena jen na vybrané tabulky Zabbix schématu. Pro tabulky history* a trends* jsou vytvořeny takzvané hypertable. Pro ty se uvnitř databáze vytváří chunk s patřičným označením (fyzická část tabulky), parametrem chunk_time_interval se stanovuje doba, za jakou se vytvoří nový chunk.
cat timescaledb.sql SELECT create_hypertable('history', 'clock', chunk_time_interval => 86400, migrate_data => true); SELECT create_hypertable('history_uint', 'clock', chunk_time_interval => 86400, migrate_data => true); SELECT create_hypertable('history_log', 'clock', chunk_time_interval => 86400, migrate_data => true); SELECT create_hypertable('history_text', 'clock', chunk_time_interval => 86400, migrate_data => true); SELECT create_hypertable('history_str', 'clock', chunk_time_interval => 86400, migrate_data => true); SELECT create_hypertable('trends', 'clock', chunk_time_interval => 2592000, migrate_data => true); SELECT create_hypertable('trends_uint', 'clock', chunk_time_interval => 2592000, migrate_data => true); UPDATE config SET db_extension='timescaledb',hk_history_global=1,hk_trends_global=1; UPDATE config SET compression_status=1,compress_older='7d';
Tento soubor specifikuje jak Zabbix implementuje funkcionalitu TimescaleDB. Funkcionalit je zcela jistě mnohem více.
cd /usr/local/share/zabbix5/server/database/postgresql/ psql -U zabbix zabbix < timescaledb.sql NOTICE: migrating data to chunks DETAIL: Migration might take a while depending on the amount of data. create_hypertable ---------------------- (1,public,history,t) (1 row) NOTICE: migrating data to chunks DETAIL: Migration might take a while depending on the amount of data. create_hypertable --------------------------- (2,public,history_uint,t) (1 row) create_hypertable -------------------------- (3,public,history_log,t) (1 row) create_hypertable --------------------------- (4,public,history_text,t) (1 row) NOTICE: migrating data to chunks DETAIL: Migration might take a while depending on the amount of data. create_hypertable -------------------------- (5,public,history_str,t) (1 row) NOTICE: migrating data to chunks DETAIL: Migration might take a while depending on the amount of data. create_hypertable --------------------- (6,public,trends,t) (1 row) NOTICE: migrating data to chunks DETAIL: Migration might take a while depending on the amount of data. create_hypertable -------------------------- (7,public,trends_uint,t) (1 row) UPDATE 1 UPDATE 1
Pokud nakonfigurujete Zabbix server a budete monitorovat několik hostů. Tak v průběhu času můžete kontrolovat např. velikost jednotlivých částí tabulky history.
zabbix=# SELECT chunk_table,total_bytes FROM chunk_relation_size('history'); chunk_table | total_bytes ------------------------------------------+------------- _timescaledb_internal._hyper_1_1_chunk | 16384 _timescaledb_internal._hyper_1_6_chunk | 16384 _timescaledb_internal._hyper_1_9_chunk | 16384 _timescaledb_internal._hyper_1_12_chunk | 16384 _timescaledb_internal._hyper_1_15_chunk | 16384 _timescaledb_internal._hyper_1_18_chunk | 16384 _timescaledb_internal._hyper_1_21_chunk | 16384 _timescaledb_internal._hyper_1_24_chunk | 16384 _timescaledb_internal._hyper_1_27_chunk | 16384 _timescaledb_internal._hyper_1_30_chunk | 16384 _timescaledb_internal._hyper_1_33_chunk | 16384 _timescaledb_internal._hyper_1_36_chunk | 16384 _timescaledb_internal._hyper_1_39_chunk | 16113664 _timescaledb_internal._hyper_1_42_chunk | 17440768 _timescaledb_internal._hyper_1_46_chunk | 22085632 _timescaledb_internal._hyper_1_71_chunk | 23347200 _timescaledb_internal._hyper_1_78_chunk | 23674880 _timescaledb_internal._hyper_1_85_chunk | 23552000 _timescaledb_internal._hyper_1_92_chunk | 23552000 _timescaledb_internal._hyper_1_101_chunk | 19849216 (20 rows)
V systému databáze existuje celá řada interních tabulek, které poskytuji velmi podrobné informace o stavu TimescaleDB.
zabbix=# SELECT * FROM timescaledb_information. [TAB] timescaledb_information.compressed_chunk_stats timescaledb_information.hypertable timescaledb_information.compressed_hypertable_stats timescaledb_information.license timescaledb_information.continuous_aggregate_stats timescaledb_information.policy_stats timescaledb_information.continuous_aggregates timescaledb_information.reorder_policies timescaledb_information.drop_chunks_policies
Závěrem
Použití TimescaleDB u monitorovacího systému Zabbix je zcela určitě vhodné pro velké databáze. Nese však sebou větší nároky na administrátory ohledně databázových znalostí. S tím je spojené zálohování a například i povyšování verzí PostgreSQL i TimescaleDB, které s sebou nese další konfigurační úkony.