Vysoký výkon a nativní partitioning: Zabbix s podporou TimescaleDB

Zabbix je monitorovací systém. Jako každý jiný systém čelí třem hlavním problémům všech monitorovacích systémů: shromažďování a zpracování dat, uchovávání historie a její údržba.

Fáze získávání, zpracování a ukládání dat zabere čas. Trochu, ale pro velký systém to může znamenat velké zpoždění. Problém uchovávání představuje otázku přístupu k datům. Ta se používají pro reporty, kontroly a spouštěče. Zpoždění při přístupu k datům také ovlivňuje výkon. Když se databáze zvětšují, zastaralá data je potřeba odstranit. Odstranění je náročná operace, která také spotřebovává část zdrojů.

Vysoký výkon a nativní partitioning: Zabbix s podporou TimescaleDB

Problémy se zpožděním při shromažďování a uchovávání v Zabbixu se řeší kešováním: několik typů keší, kešování v databázi. Pro řešení třetího problému však kešování nevyhovuje, a proto v Zabbixu používají TimescaleDB. O tom poví Andrej Guščin — inženýr technické podpory Zabbix SIA. V technické podpoře Zabbixu pracuje Andrej více než 6 let a přímo se setkává s výkonem.

Jak TimescaleDB funguje, jaký výkon může poskytnout ve srovnání s běžným PostgreSQL? Jakou roli hraje Zabbix pro databáze TimescaleDB? Jak spustit od nuly a jak migrovat z PostgreSQL a jaká konfigurace má nejlepší výkon? O všem tomto podrobně níže.

Přehrát video

Výzvy výkonu

Každý monitorovací systém čelí určitým výzvám výkonu. Řeknu vám o třech z nich: shromažďování a zpracování dat, uchovávání a údržba historie.

Rychlé shromažďování a zpracování dat. Dobrý monitorovací systém by měl rychle získávat všechny údaje a zpracovávat je podle triggerových výrazů — podle svých kritérií. Po zpracování by měl systém také rychle uložit tato data do databáze, aby je později mohl využít.

Uchovávání historie. Dobrý monitorovací systém by měl uchovávat historii v databázi a poskytovat snadný přístup k metrikám. Historie je potřebná pro využití v reportech, grafech, triggerových prvcích, prahových hodnotách a vypočítávaných datových prvcích pro upozornění.

Údržba historie. Někdy nastane den, kdy nemusíte uchovávat metriky. Proč potřebujete data, která byla shromážděna před 5 lety, měsíc nebo dva: některé uzly byly odstraněny, některé hostitele nebo metriky už nejsou potřeba, protože jsou zastaralé a přestaly se shromažďovat. Dobrý monitorovací systém by měl uchovávat historická data a čas od času je odstraňovat, aby se databáze nevyrostla.

Odstranění zastaralých dat je naléhavá otázka, která má velký dopad na výkon databáze.

Kešování v Zabbixu

Ve Zabbixu byly první a druhé volání vyřešeny pomocí kešování. Pro shromažďování a zpracování dat se používá operační paměť. Pro uchovávání — historie v spouštěčích, grafech a počítaných datech. Na straně databáze existuje určité kešování pro hlavní výběry, například grafech.

Kešování na straně samotného Zabbix serveru je:

  • ConfigurationCache;
  • ValueCache;
  • HistoryCache;
  • TrendsCache.

Podívejme se na ně podrobněji.

ConfigurationCache

To je hlavní keš, ve které uchováváme metriky, hostitele, datové prvky, spouštěče — vše, co je potřeba pro PreProcessing a pro shromažďování dat.

Vysoký výkon a nativní partitioning: Zabbix s podporou TimescaleDB

Všechny tyto informace jsou uchovávány v ConfigurationCache, aby nebyly vytvářeny zbytečné dotazy do databáze. Po spuštění serveru tento keš aktualizujeme, vytváříme a pravidelně aktualizujeme konfigurace.

Sběr dat

Schéma je dost rozsáhlé, ale hlavní je, že shromažďovače. Jsou to různé „pollery“ — procesy shromažďování. Ty odpovídají za různé typy shromažďování: shromažďují data přes SNMP, IPMI a předávají je na PreProcessing.

Vysoký výkon a nativní partitioning: Zabbix s podporou TimescaleDBShromažďovače jsou orámovány oranžovou linkou.

Ve Zabbixu existují počítané agregované datové prvky, které jsou potřebné k agregaci kontrol. Pokud je máme, bereme data pro ně přímo z ValueCache.

PreProcessing HistoryCache

Všechny shromažďovače používají ConfigurationCache, aby získaly úkoly. Dále je předávají na PreProcessing.

Vysoký výkon a nativní partitioning: Zabbix s podporou TimescaleDB

PreProcessing používá ConfigurationCache, aby získal kroky PreProcessing. Zpracovává tato data různými způsoby.

Po zpracování dat pomocí PreProcessing je ukládáme do HistoryCache, abychom je mohli zpracovat. Na tomto konci shromažďování dat přecházíme k hlavnímu procesu v Zabbixu — history syncer, jelikož se jedná o monolitní architekturu.

Poznámka: PreProcessing je dost náročná operace. Od verze 4.2 byl přesunut na proxy. Pokud máte velmi velký Zabbix s velkým množstvím datových prvků a frekvencí shromažďování, výrazně to usnadňuje práci.

ValueCache, history & trends cache

Synchronizátor historie je hlavní proces, který atomárně zpracovává každý datový prvek, tedy každou hodnotu.

Synchronizátor historie získává hodnoty z HistoryCache a kontroluje v konfiguraci přítomnost spouštěčů pro výpočty. Pokud nějaké existují, provádí výpočty.

Synchronizátor historie vytváří událost, eskalaci, aby v případě potřeby podle konfigurace generoval upozornění, a zaznamenává je. Pokud existují spouštěče pro následné zpracování, pamatuje si tuto hodnotu v ValueCache, aby nemusel přistupovat k tabulce historie. Tím se ValueCache plní daty, která jsou potřebná pro výpočty spouštěčů a vypočítávaných prvků.

Synchronizátor historie zapisuje všechna data do databáze, a ta pak na disk. Proces zpracování tímto končí.

Vysoký výkon a nativní partitioning: Zabbix s podporou TimescaleDB

Kešování v databázi

Na straně databáze existují různé keše, když chcete sledovat grafy nebo zprávy o událostech:

  • Innodb_buffer_pool na straně MySQL;
  • shared_buffers na straně PostgreSQL;
  • effective_cache_size na straně Oracle;
  • shared_pool na straně DB2.

Existuje také mnoho dalších keší, ale toto jsou hlavní pro všechny databáze. Umožňují uchovávat v operační paměti data, která jsou často potřebná pro dotazy. Mají své technologie pro toto.

Výkon databáze je kriticky důležitý.

Zabbix server neustále shromažďuje data a zapisuje je. Při restartu také čte z historie, aby naplnil ValueCache. Skripty a zprávy používá Zabbix API, které je postaveno na základě webového rozhraní. Zabbix API se obrací na databázi a získává potřebná data pro grafy, zprávy, seznamy událostí a poslední problémy.

Vysoký výkon a nativní partitioning: Zabbix s podporou TimescaleDB

Pro vizualizaci — Grafana. Mezi našimi uživateli je to populární řešení. Umí přímo posílat dotazy přes Zabbix API jak do databáze, tak generuje určitou konkurenci pro získávání dat. Proto je potřeba jemnější a lepší nastavení databáze, aby vyhovovalo rychlému vydávání výsledků a testování.

Housekeeper

Třetí výzvou pro výkon v Zabbixu je úklid historie pomocí housekeeperu. Dodržuje všechna nastavení — v datových prvcích je uvedeno, jak dlouho uchovávat dynamiku změn (trendů) v dnech.

TrendsCache vypočítáváme za běhu. Při příjmu dat je agregujeme za jednu hodinu a zapisujeme do tabulek pro dynamiku změn trendů.

Housekeeper se spouští a odstraňuje informace z databáze běžnými 'selecty'. To není vždy efektivní, což lze poznat z grafů výkonu vnitřních procesů.

Vysoký výkon a nativní partitioning: Zabbix s podporou TimescaleDB

Červená křivka ukazuje, že synchronizátor historie je stále zaměstnán. Oranžová křivka nahoře představuje Housekeeper, který se neustále spouští. Čeká na databázi, kdy odstraní všechny řádky, které určil.

Kdy byste měli vypnout Housekeeper? Například máte 'Item ID' a potřebujete odstranit posledních 5 tisíc řádků za určité období. Samozřejmě, že se to děje podle indexů. Ale obvykle je dataset velmi velký a databáze stejně čte z disku a načítá do cache. To je vždy velmi nákladná operace pro databázi a v závislosti na velikosti databáze může vést k problémům s výkonem.

Vysoký výkon a nativní partitioning: Zabbix s podporou TimescaleDB

Housekeeper lze jednoduše vypnout. V webovém rozhraní je nastavení v 'Administration general' pro Housekeeper. Vypneme interní housekeeping pro interní historii trendů a on už tímto více neřídí.

Když jsme vypnuli Housekeeper a grafy se vyrovnaly — jaké mohou být v tomto případě problémy a co může pomoci v řešení třetího výzvy výkonu?

Partitioning — sekcionování nebo partioning

Obvykle se sekcionování nastavuje různými způsoby na každé relační databázi, kterou jsem uvedl. Každá má svou technologii, ale jsou celkově podobné. Vytvoření nové partition často vede k určitým problémům.

Obvykle se partitiony nastavují v závislosti na 'setup' — počtu dat, které jsou vytvářeny za jeden den. Obvykle se partitioning nastavuje na jeden den, což je minimum. Pro trendy nové partition — na 1 měsíc.

Hodnoty se mohou měnit v případě velmi velkého 'setup'. Pokud je malý 'setup' — do 5 000 nvps (nových hodnot za sekundu), střední — od 5 000 do 25 000, pak velký — nad 25 000 nvps. To jsou velké a velmi velké instalace, které vyžadují pečlivé nastavení přesně databáze.

Na velmi velkých instalacích úsek za jeden den nemusí být optimální. Viděl jsem na MySQL partitiony po 40 GB a více za den. To je velmi velký objem dat, který může vést k problémům, a je třeba ho zmenšit.

Co přináší partitioning?

Sekcionování tabulek. Často jsou to samostatné soubory na disku. Plán dotazů optimálněji vybírá jednu partition. Obvykle se partitioning používá podle rozsahu — pro Zabbix to platí také. Používáme tam 'timestamp' — čas od začátku éry. U nás to jsou obyčejná čísla. Určíte začátek a konec dne — to je partition.

Rychlé odstranění — DELETEVybírá se jeden soubor/subtabulka, nikoli výběr řádků k odstranění.

Výrazně zrychluje výběr dat. nebude prováděn při nepravdivosti první podmínky. Opravy pomocí — používá jednu nebo více partií, nikoli celou tabulku. Pokud žádáte o data dvoudenní starosti, jsou vybírána z DB rychleji, protože je třeba do cache načíst a vydat pouze jeden soubor, nikoli velkou tabulku.

Často také urychluje mnoho DB. INSERT — vkládání do child-tabulek.

TimescaleDB

Ve verzi 4.2 jsme se zaměřili na TimescaleDB. To je rozšíření pro PostgreSQL s nativním rozhraním. Rozšíření efektivně pracuje s časovými řadami, přičemž neztrácí výhody relačních DB. TimescaleDB také automaticky particionuje.

V TimescaleDB existuje pojem hypertabulka (hypertable), kterou vytváříte. Obsahuje chunky — partie. Chunky jsou automaticky řízené fragmenty hypertabulky, které neovlivňují ostatní fragmenty. Každý chunk má svůj vlastní časový rozsah.

Vysoký výkon a nativní partitioning: Zabbix s podporou TimescaleDB

TimescaleDB vs PostgreSQL

TimescaleDB pracuje skutečně efektivně. Výrobci rozšíření tvrdí, že používají správnější algoritmus pro zpracování dotazů, zejména <code>inserts</code>. Když velikosti dataset-vkládání rostou, algoritmus udržuje konstantní výkon.

Vysoký výkon a nativní partitioning: Zabbix s podporou TimescaleDB

Po 200 milionech řádků obvykle PostgreSQL začíná výrazně zpomalovat a ztrácí výkon až na 0. TimescaleDB umožňuje efektivně vkládat "inserts" při jakémkoli objemu dat.

Instalace

Nainstalovat TimescaleDB je dost snadné pro jakékoli balíčky. V dokumentaci je vše podrobně popsáno — závisí na oficiálních balíčcích PostgreSQL. TimescaleDB lze také sestavit a zkompilovat ručně.

Pro DB Zabbix jednoduše aktivujeme rozšíření:

echo "CREATE EXTENSION IF NOT EXISTS timescaledb CASCADE;" | sudo -u postgres psql zabbix

Aktivujete rozšíření a vytvoříte ho pro DB Zabbix. Posledním krokem je vytvoření hypertabulky.

Migrace tabulek historie na TimescaleDB

K tomu existuje speciální funkce create_hypertable:

VYBERTE create_hypertable(‘history’, ‘clock’, chunk_time_interval => 86400, migrate_data => true);
VYBERTE create_hypertable(‘history_unit’, ‘clock’, chunk_time_interval => 86400, migrate_data => true);
VYBERTE create_hypertable(‘history_log’, ‘clock’, chunk_time_interval => 86400, migrate_data => true);
VYBERTE create_hypertable(‘history_text’, ‘clock’, chunk_time_interval => 86400, migrate_data => true);
VYBERTE create_hypertable(‘history_str’, ‘clock’, chunk_time_interval => 86400, migrate_data => true);
VYBERTE create_hypertable(‘trends’, ‘clock’, chunk_time_interval => 86400, migrate_data => true);
VYBERTE create_hypertable(‘trends_unit’, ‘clock’, chunk_time_interval => 86400, migrate_data => true);
AKTUALIZUJTE config SET db_extension=’timescaledb’, hk_history_global=1, hk_trends_global=1

Funkce má tři parametry. První — tabulka v databázi, pro kterou je třeba vytvořit hypertabuli. Druhý — pole, podle kterého je třeba vytvořit chunk_time_interval — interval chunků pro partition, které mají být použity. V mém případě je interval jeden den — 86 400.

Třetí parametr — migrovat_data. Pokud se nastaví true, pak se všechna aktuální data přesunou do předem vytvořených chunků. Osobně jsem použil migrovat_data. Měl jsem asi 1 TB, což trvalo více než hodinu. I v některých případech jsem během testování odstraňoval nepotřebná historická data symbolických typů, abych je nemusel přesouvat.

Poslední krok — AKTUALIZACE: v db_extension nastavit timescaledb, aby databáze chápala, že má toto rozšíření. Zabbix ho aktivuje a správně využívá syntax a dotazy již k databázi — ty funkce, které jsou nutné pro TimescaleDB.

Konfigurace hardwaru

Použil jsem dva servery. První — VMware stroj. Je docela malý: 20 procesorů Intel® Xeon® CPU E5-2630 v 4 @ 2.20GHz, 16 GB RAM a SSD disk o velikosti 200 GB.

Na něm jsem nainstaloval PostgreSQL 10.8 s OS Debian 10.8-1.pgdg90+1 a souborovým systémem xfs. Vše bylo minimálně nastaveno, aby se používala právě tato databáze, kromě toho, co bude používat sám Zabbix.

Na této stejné mašině běžel Zabbix server, PostgreSQL a loadovací agenty. Měl jsem 50 aktivních agentů, kteří používali LoadableModule, aby velmi rychle generovali různé výsledky: čísla, řetězce. Naplnil jsem databázi velkým množstvím dat.

Původní konfigurace obsahovala 5 000 položek dat na každý host. Téměř každá položka měla spouštěč, aby to bylo podobné reálným instalacím. V některých případech bylo více než jeden spouštěč. Na jeden uzel sítě připadalo 3 000-7 000 spouštěčů.

Interval aktualizace položek dat — 4-7 sekundZatížení jsem reguloval nejen pomocí 50 agentů, ale také přidáváním dalších. Pomocí datových prvků jsem dynamicky reguloval zatížení a snižoval interval aktualizace na 4 s.

PostgreSQL. 35 000 nvps

První spuštění na tomto zařízení jsem měl s čistým PostgreSQL — 35 tisíc hodnot za sekundu. Jak je vidět, vložení dat zabere zlomky sekundy — všechno jde hladce a rychle. Jediné, co, je, že SSD disk o kapacitě 200 GB se rychle zaplňuje.

Vysoký výkon a nativní partitioning: Zabbix s podporou TimescaleDB

To je standardní přehled výkonnosti Zabbix — serverů.

Vysoký výkon a nativní partitioning: Zabbix s podporou TimescaleDB

První modrý graf — počet hodnot za sekundu. Druhý graf vpravo — zatížení procesů shromažďování. Třetí — zatížení interních procesů shromažďování: history syncers a Housekeeper, který zde běžel dostatečně dlouho.

Čtvrtý graf ukazuje využití HistoryCache. To je jakýsi buffer před vložením do DB. Zelený pátý graf ukazuje využití ValueCache, tedy kolik hitů ValueCache pro spouštěče — to je několik tisíc hodnot za sekundu.

PostgreSQL. 50 000 nvps

Pak jsem zvýšil zátěž na 50 tisíc hodnot za sekundu na tomto stejném zařízení.

Vysoký výkon a nativní partitioning: Zabbix s podporou TimescaleDB

Při zatížení s Housekeeperem bylo vložení 10 tisíc hodnot zapisováno za 2-3 s.

Vysoký výkon a nativní partitioning: Zabbix s podporou TimescaleDB
Housekeeper už začíná narušovat práci.

Na třetím grafu je patrné, že celkově zatížení trapperů a history syncers je stále na úrovni 60 %. Na čtvrtém grafu HistoryCache během práce Housekeepera již začíná poměrně aktivně plnit. Naplnil se na 20 % — to je asi 0,5 GB.

PostgreSQL. 80 000 nvps

Dále jsem zvýšil zátěž na 80 tisíc hodnot za sekundu. To je přibližně 400 tisíc datových prvků a 280 tisíc spouštěčů.

Vysoký výkon a nativní partitioning: Zabbix s podporou TimescaleDB
Vložení při zatížení třiceti history syncers je už dost vysoké.

Také jsem zvyšoval různé parametry: history syncers, cache.

Vysoký výkon a nativní partitioning: Zabbix s podporou TimescaleDB

Na mém zařízení se zatížení history syncers zvyšovalo na maximum. HistoryCache se rychle naplnil daty — v bufferu se nahromadila data k zpracování.

Celou dobu jsem sledoval, jak je využíván procesor, operační paměť a další parametry systému, a zjistil jsem, že využití disků bylo maximální.

Vysoký výkon a nativní partitioning: Zabbix s podporou TimescaleDB

Dosáhl jsem využití maximálních možností disku na tomto zařízení a na této virtuální stroji. Při takové intenzitě začal PostgreSQL dost aktivně uvolňovat data, a disk už nestačil pracovat na zápis a čtení.

Druhý server

Vzala jsem jiný server, který měl už 48 procesorů a 128 GB RAM. Upravila jsem ho — nainstalovala jsem 60 history syncer a dosáhla přijatelných výkonů.

Vysoký výkon a nativní partitioning: Zabbix s podporou TimescaleDB

Skutečně, to již je limit výkonu, kde je potřeba něco podniknout.

TimescaleDB. 80 000 nvps

Mým hlavním úkolem je ověřit možnosti TimescaleDB pod zátěží Zabbix. 80 tisíc hodnot za sekundu je hodně, frekvence sběru metrik (kromě Yandexu, samozřejmě) a dost velký "setup".

Vysoký výkon a nativní partitioning: Zabbix s podporou TimescaleDB

Na každém grafu je propad — to je právě migrace dat. Po propadech v Zabbix serveru se profil zátěže history syncer velmi změnil — klesl na třetinu.

TimescaleDB umožňuje vkládat data prakticky třikrát rychleji a používat méně HistoryCache.

Odpovídajícím způsobem vám budou včas dodávány data.

TimescaleDB. 120 000 nvps

Poté jsem zvýšil počet datových prvků na 500 tisíc. Hlavním úkolem bylo ověřit možnosti TimescaleDB — získal jsem odhadovanou hodnotu 125 tisíc hodnot za sekundu.

Vysoký výkon a nativní partitioning: Zabbix s podporou TimescaleDB

To je funkční "setup", který může dlouho fungovat. Ale protože můj disk měl pouze 1,5 TB, tak jsem ho naplnila za pár dní.

Vysoký výkon a nativní partitioning: Zabbix s podporou TimescaleDB

Nejdůležitější je, že v tuto dobu byly vytvářeny nové partitiony TimescaleDB.

Pro výkon je to naprosto nepozorovatelné. Když se vytvářejí partitiony v MySQL, například, všechno je jinak. Obvykle se to děje v noci, protože blokuje celkovou vložení, práci s tabulkami a může vytvářet degradaci služby. V případě TimescaleDB tomu tak není.

Jako příklad ukážu jeden graf z mnoha v komunitě. Na obrázku je zapnut TimescaleDB, díky čemuž zatížení podle použití io.weight na procesoru kleslo. Využití vnitřních procesů se také snížilo. Přičemž to je obyčejná virtuálka na obyčejných plechových discích, ne na SSD.

Vysoký výkon a nativní partitioning: Zabbix s podporou TimescaleDB

Závěry

TimescaleDB je dobré řešení pro malé "setup", které narážejí na výkonnost disku. Umožní to uchovat funkčnost až do migrace DB na rychlejší hardware.

TimescaleDB je snadno nastavitelné, poskytuje nárůst výkonu, dobře spolupracuje se Zabbix a má výhody v porovnání s PostgreSQL..

Pokud používáte PostgreSQL a neplánujete jej měnit, doporučuji používat PostgreSQL s rozšířením TimescaleDB v kombinaci se Zabbixem. Toto řešení efektivně funguje až do středních "setup".

Když mluvíme o "vysoké výkonu" — myslíme tím HighLoad++Čekání na seznámení s technologiemi a praktikami, které umožňují službám obsluhovat miliony uživatelů, netrvá dlouho. Seznam prezentací na 7. a 8. listopadu jsme již sestavili, ale meetupy ještě můžete navrhnout.

Přihlaste se k našemu newsletteru a telegram, na kterých odhalujeme zajímavosti nadcházející konference a zjistěte, jak co nejlépe využít příležitosti.

Zdroj: habr.com

Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster