Implementace TimescaleDB v Zabbixu: Výhody, Klíčové Tabulky a Instalace

Co nás čeká?

Zabbix je robustní open-source řešení pro monitorování IT infrastruktury, které umožňuje sledování a analýzu výkonu sítě, serverů, aplikací a dalších komponent. S narůstajícím množstvím dat se stává klíčovým faktorem efektivní správa časových dat. Proto Zabbix od verze 5.0 začal podporovat TimescaleDB, což je rozšíření PostgreSQL optimalizované pro časové série. Tento článek se zaměřuje na výhody použití TimescaleDB v Zabbixu, klíčové tabulky a postup instalace.

Výhody TimescaleDB v Zabbixu

TimescaleDB přináší do Zabbixu několik zásadních výhod, které zvyšují výkon a efektivitu při práci s velkými objemy časových dat:

  • Škálovatelnost a Výkon: TimescaleDB je navrženo tak, aby efektivně spravovalo velké množství časových dat. Díky architektuře hypertables umožňuje rychlé zápisy a čtení dat, což je klíčové pro systémy monitorování, jako je Zabbix, které generují obrovské množství metrik.
  • Komprese dat: TimescaleDB nabízí schopnost komprese historických dat, což snižuje nároky na úložiště a může vést až k 90% úspoře místa na disku. Komprese však znemožňuje změnu již zkomprimovaných dat; pro případnou úpravu je nutné data nejprve dekomprimovat, provést změnu a poté opět komprimovat.
  • Snadná správa: TimescaleDB je plně kompatibilní s PostgreSQL, což znamená, že správci, kteří jsou obeznámeni s PostgreSQL, se snadno zorientují i v TimescaleDB. Implementace je jednoduchá a přidává jen minimální režijní náklady na správu databáze. Dále je možné některá nastavení TimescaleDB upravovat přímo v administraci Zabbixu, konkrétně v sekci Administration > Housekeeping.

Tabulky v Zabbixu využívající TimescaleDB

Zabbix používá TimescaleDB k ukládání velkého množství časových dat, která jsou rozdělena do několika klíčových tabulek. Aby byl tento proces efektivní a dobře spravovaný, využívá se speciální struktura zvaná hypertable, která je navržena pro práci s časovými daty v TimescaleDB. Pro usnadnění konverze existujících tabulek na hypertables a optimalizaci správy těchto dat obsahuje soubor /usr/share/zabbix-sql-scripts/postgresql/timescaledb/schema.sql skript s potřebnými příkazy. Tento skript automatizuje převod klíčových tabulek Zabbixu na hypertables, což zajišťuje efektivní práci s velkými objemy dat.

Každý příkaz ve skriptu využívá funkci create_hypertable, která je klíčová pro převod běžných tabulek PostgreSQL na hypertablesHypertable funguje tak, že data automaticky spravuje v menších podtabulkách, zvaných chunky. Toto dělení umožňuje efektivní dotazování a ukládání dat, což je nezbytné pro rychlý přístup k velkým množstvím časových sérií. Proces konverze tabulek na hypertables zahrnuje několik důležitých parametrů:

  • Název tabulky (např. 'history_text'): Určuje, která konkrétní tabulka bude převedena na hypertable. V případě tabulky history_text se jedná o textová data, jako jsou zprávy a logy, která jsou v Zabbixu monitorována.
  • Časový sloupec (např. 'clock'): Tento parametr definuje sloupec obsahující časové značky (timestamp), které jsou klíčové pro rozdělení dat do jednotlivých chunků. Sloupec 'clock' specifikuje čas, kdy byla data zaznamenána, což umožňuje jejich správné rozdělení a třídění.
  • chunk_time_interval (např. 86400): Tento parametr určuje časový interval v sekundách pro jednotlivé chunky. Hodnota 86400 sekund odpovídá jednomu dni. To znamená, že veškerá data shromážděná během jednoho dne budou uložena v jednom chunku. Tento interval lze přizpůsobit podle požadavků na výkon a množství dat, které je třeba zpracovat.
  • migrate_data (např. true): Když je tento parametr nastaven na true, všechna existující data v tabulce jsou automaticky migrována do nové struktury chunků. Tato funkce je důležitá při konverzi již existujících tabulek na hypertables, aby nedošlo ke ztrátě dat.
  • if_not_exists (např. true): Tento parametr zajišťuje, že pokud hypertable již existuje, příkaz ji nebude znovu vytvářet, což zabraňuje možným chybám a ztrátám dat. Pokud hypertable ještě neexistuje, bude nově vytvořena.

Použitím těchto nastavení TimescaleDB zajišťuje efektivní správu a přístup k velkým objemům časových dat, což je nezbytné pro systémy jako Zabbix, které generují a analyzují velké množství metrik. Níže jsou uvedeny klíčové tabulky, které byly přeměněny na hypertables pro zajištění lepšího výkonu a efektivity:

  • history: Uchovává numerická data s plovoucí desetinnou čárkou.
PERFORM create_hypertable('history', 'clock', chunk_time_interval => 86400, migrate_data => true, if_not_exists => true);
  • history_uint: Ukládá celá čísla.
PERFORM create_hypertable('history_uint', 'clock', chunk_time_interval => 86400, migrate_data => true, if_not_exists => true);
  • history_log: Obsahuje logovací informace.
PERFORM create_hypertable('history_log', 'clock', chunk_time_interval => 86400, migrate_data => true, if_not_exists => true);
  • history_text: Ukládá textová data, jako jsou zprávy a logy.
PERFORM create_hypertable('history_text', 'clock', chunk_time_interval => 86400, migrate_data => true, if_not_exists => true);
  • history_str: Uchovává krátké textové řetězce.
PERFORM create_hypertable('history_str', 'clock', chunk_time_interval => 86400, migrate_data => true, if_not_exists => true);
  • history_bin: Uchovává binární data. (Od verze 7.0.2)
PERFORM create_hypertable('history_bin', 'clock', chunk_time_interval => 86400, migrate_data => true, if_not_exists => true);
  • auditlog: Obsahuje logovací informace o aktivitách uživatelů. (Od verze 7.0)
PERFORM create_hypertable('auditlog', 'auditid', chunk_time_interval => 604800, time_partitioning_func => 'cuid_timestamp', migrate_data => true, if_not_exists => true);
  • trends: Ukládá agregované historické údaje o metrikách.
PERFORM create_hypertable('trends', 'clock', chunk_time_interval => 2592000, migrate_data => true, if_not_exists => true);
  • trends_uint: Ukládá agregovaná historická data pro metriky celých čísel.
PERFORM create_hypertable('trends_uint', 'clock', chunk_time_interval => 2592000, migrate_data => true, if_not_exists => true);

Instalace TimescaleDB v Zabbixu

Příprava na instalaci

Před zahájením instalace TimescaleDB je nutné mít nainstalovaný PostgreSQL a také balíček zabbix-sql-scripts z oficiálního repozitáře pro konkrétní používanou verzi Zabbixu. Zatímco Zabbix jako takový nemusí být nutně nainstalován, zmíněný balíček zabbix-sql-scripts je nezbytný, protože obsahuje potřebné SQL skripty pro konfiguraci databáze. U PostgreSQL se doporučuje instalace z oficiálního repozitáře PostgreSQL, spíše než použití systémového repozitáře, aby byla zajištěna kompatibilita a přístup k nejnovějším funkcím a opravám zabezpečení.

Je důležité poznamenat, že všechny následující příkazy a nastavení se provádějí pouze na serveru PostgreSQL. Instalace TimescaleDB z oficiálního repozitáře TimescaleDB, který podporuje komunitní verzi licence, umožňuje přístup k pokročilým funkcím, jako je komprese dat. Díky komunitní licenci mají uživatelé možnost využívat kompresi, což může výrazně snížit nároky na úložiště a zlepšit výkon dotazů na historická data.

Přidání oficiálního repozitáře TimescaleDB

Pro instalaci TimescaleDB z oficiálního repozitáře je třeba přidat repozitář do systému. Na distribucích založených na RHEL, jako je Rocky Linux, postupujte následovně:

tee /etc/yum.repos.d/timescale_timescaledb.repo <<EOL
[timescale_timescaledb]
name=timescale_timescaledb
baseurl=https://packagecloud.io/timescale/timescaledb/el/$(rpm -E %{rhel})/\$basearch
repo_gpgcheck=1
gpgcheck=0
enabled=1
gpgkey=https://packagecloud.io/timescale/timescaledb/gpgkey
sslverify=1
sslcacert=/etc/pki/tls/certs/ca-bundle.crt
metadata_expire=300
EOL

Nainstalujme TimescaleDB.

Nahraďte číslo verze (16) odpovídající verzí PostgreSQL, kterou používáte.

dnf install timescaledb-2-postgresql-16 timescaledb-2-loader-postgresql-16

Spustíme utility timescaledb-tune a jako parametr jí předáme vyšší hodnotu maximálního množství připojení (--max-conns), které pro tyto testovací účely nastavíme na 125.

Tato utility slouží k přizpůsobení výchozího nastavení PostgreSQL relativně výkonu a adekvátnímu nastavení parametrů PostgreSQL pro fungování s TimescaleDB.

Zároveň nám tato utility pomocí instalačního průvodce pomůže vybrat aktuální a platný konfigurační soubor PostgreSQL a nastaví i automatické načítání knihoven TimescaleDB.

Prosím, odpovídejte „ano“ (y) na všechny otázky. Pozor, automatický tuner předpokládá, že PostgreSQL běží na samostatném serveru, a proto může být potřeba případně upravit parametry.

Nahraďte číslo verze (16) odpovídající verzí PostgreSQL, kterou používáte.

timescaledb-tune --pg-config /usr/pgsql-16/bin --max-conns=125

Následně restartujeme systémovou službu pro PostgreSQL:

Nahraďte číslo verze (16) odpovídající verzí PostgreSQL, kterou používáte.

systemctl restart postgresql-16.service

Zbývá již jen vytvořit a aktivovat samotnou TimescaleDB:

Pozor, během vývoje došlo ke změně cesty z původní /usr/share/zabbix-sql-scripts/postgresql/timescaledb.sql na novou /usr/share/zabbix-sql-scripts/postgresql/timescaledb/schema.sql.

Ignorování varování: Při spuštění skriptu schema.sql na verzi TimescaleDB 2.9.0 a vyšší mohou být zobrazena varování o nedodržení osvědčených postupů. Tato varování lze ignorovat, protože konfigurace bude úspěšně dokončena i přes ně.

Dlouhá doba migrace: Migrace existujících historických dat, trendů a audit logů může trvat dlouho. !!! Během této doby musí být Zabbix server a frontend vypnutý !!!, aby byla zajištěna konzistence dat.

echo "CREATE EXTENSION IF NOT EXISTS timescaledb CASCADE;" | sudo -u postgres psql zabbix
cat /usr/share/zabbix-sql-scripts/postgresql/timescaledb/schema.sql | sudo -u zabbix psql zabbix

Dodatečné informace

Nastavení parametrů čištění (Administration > Housekeeping): Skript schema.sql nastavuje následující parametry čištění:

  • Override item history period: Povolit přepsání období uchování historie položek.
  • Override item trend period: Povolit přepsání období uchování trendů.

Aby bylo možné použít partitioned housekeeping pro historii a trendy, musí být obě tyto možnosti povoleny. Je také možné povolit přepsání pouze pro historii nebo pouze pro trendy. Pokud bude nastavení aplikováno bude nastavení pro historii a trendy na úrovni itemu ignorovano.

Další parametry ve skriptu schema.sql: Tento skript nastavuje také dva další parametry:

  • Enable compression: Povolit kompresi.
  • Compress records older than 7 days: Komprimovat záznamy starší než 7 dnů.

Pro úspěšné odstranění komprimovaných dat pomoci housekeeper musí být povoleny jak možnosti Override item history period, tak Override item trend period. Pokud je přepsání deaktivováno a tabulky mají komprimované chunky, správce údržby nebude odstraňovat data z těchto tabulek a v sekcích Housekeeping a System information se zobrazí varování o nesprávné konfiguraci​

V případě, že uvidíte v Zabbix Server log souboru zprávu o tom, že je verze TimescaleDB příliš nová, pak to není žádný velký problém. Zabbix nedokáže dostatečně rychle reagovat na nejnovější verze TimescaleDB tak, aby ji ve svém kódu nastavil jako podporovanou, ovšem kompatibilita je Zabbixem zaručena a námi ověřena.

Pokud se chceme vyhnout zprávám o nekompatibilitě v log souboru Zabbixu, pak stačí otevřít konfigurační soubor Zabbix serveru v cestě /etc/zabbix/zabbix_server.conf a zde upravte následující konfigurační parametr:

AllowUnsupportedDBVersions=1

Soubor s tímto nastavením uložte a znovu nastartujte systémovou službu Zabbix serveru.

systemctl restart zabbix-server

A to je vše! Podařilo se Vám zprovoznit rozšíření pro TimescaleDB a máte základní databázový performance tuning. Následující kroky by měly smeřovat k zálohování a monitoringu DB.