Hlavní navigace

Zabbix 5.0 LTS oficiálně podporuje TimescaleDB

Monitorovací systém Zabbix podporuje jako své úložiště TimescaleDB, což je databázové řešení založené na PostgreSQL, které automaticky rozděluje data do bloků založených na čase, což podporuje vyšší výkon.
Lukáš Malý 27. 7. 2020
Doba čtení: 6 minut

Sdílet

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.

Tabulka použitých verzí software
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.


TimescaleDB – Tables

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.

MIF obecny

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.